容器技术入门与 Docker 环境部署
一、云计算与 Docker 的关联
在信息技术飞速发展的当下,云计算凭借其高效、灵活、低成本的特性,正深刻重塑企业的 IT 架构和业务模式。它提供了按需分配的计算、存储和网络资源,让用户能像使用水电一样便捷地获取 IT 资源。
而 Docker 作为轻量级容器化技术,与云计算的发展紧密相连。它解决了云计算中应用程序的打包、分发、部署和运行等关键问题。通过 Docker,应用程序及其依赖环境可被打包成标准化容器,能在任何支持 Docker 的环境(本地服务器、私有云、公有云)中一致运行,实现 “一次构建,到处运行”,极大简化了云计算环境下应用的部署和管理,提升了资源利用率与开发效率。
二、Docker 核心概念
(一)镜像(Image)
Docker 镜像是一个只读模板,包含运行应用程序所需的代码、运行时环境、库、环境变量和配置文件等。它类似虚拟机镜像,但更轻量。
镜像采用分层存储,每一层只读,新增内容会在原有层基础上创建新层。这种结构使镜像的复用、分发和版本控制更高效。例如,基于 Ubuntu 系统的镜像,安装 Python 环境后形成新层,再安装 Web 框架又形成新层,各层独立且可叠加。
(二)容器(Container)
容器是镜像的运行实例,是动态、可执行的实体。它包含应用程序及所有运行依赖,并与宿主机和其他容器相互隔离。
与传统虚拟机不同,容器无需模拟完整操作系统,直接共享宿主机内核,因此启动快、资源占用少、移植性好。一个镜像可创建多个容器,它们相互独立,运行相同应用程序,但拥有独立的文件系统、网络配置和进程空间。
(三)仓库(Repository)
仓库是存储和分发 Docker 镜像的场所,类似代码仓库。Docker Hub 是知名公共仓库,存有大量官方和第三方镜像。用户可从仓库拉取镜像到本地,也可将自己创建的镜像推送到仓库供他人使用。
仓库分公有和私有两类。公有仓库供任何人访问使用,适合开源项目和通用镜像分享;私有仓库用于企业内部,保证镜像安全性和私密性,方便内部管理和分发。
三、Docker 架构
Docker 采用客户端 - 服务器(C/S)架构,主要由以下部分组成:
(一)Docker 客户端(Docker Client)
是用户与 Docker 交互的主要方式,用户通过命令行或图形界面工具向 Docker 服务器发送指令,如docker run、docker pull等命令。
(二)Docker 服务器(Docker Daemon)
运行在宿主机上的后台进程(dockerd),负责接收和处理客户端指令,管理 Docker 的镜像、容器、网络和存储等资源,执行容器的创建、启动、停止、删除等操作。
(三)Docker 镜像仓库(Docker Registry)
用于存储和分发镜像。Docker 服务器需镜像时,会从指定仓库拉取;用户创建新镜像想分享时,会将其推送到仓库。
(四)容器运行时(Container Runtime)
负责实际运行容器,是 Docker 架构的底层组件。Docker 最初使用 LXC,后开发libcontainer,现支持多种符合 OCI(开放容器倡议)标准的运行时,如 runc 等。
四、Docker 常用命令详解
(一)镜像相关命令
- 拉取镜像:docker pull [镜像名称]:[标签]
- 示例:docker pull httpd:latest,从 Docker Hub 拉取最新版本的 httpd 镜像。不指定标签时,默认使用latest标签。
- 查看本地镜像:docker images
- 列出本地所有镜像,包括仓库名称、标签、镜像 ID、创建时间和大小等信息。
- 删除镜像:docker rmi [镜像ID/镜像名称:标签]
- 示例:docker rmi httpd:latest,可删除本地 httpd 镜像。若镜像被容器使用,需先删除相关容器。
- 构建镜像:docker build -t [镜像名称]:[标签] [Dockerfile所在目录]
- 通过 Dockerfile 构建自定义镜像,-t指定镜像名称和标签,[Dockerfile所在目录]常用.表示当前目录。
(二)容器相关命令
- 创建并启动容器:docker run [参数] 镜像名称 [命令]
-
常用参数:
-
-d:后台运行容器。
-
-p:端口映射,格式为宿主机端口:容器端口。
-
-it:交互模式运行容器,分配伪终端。
-
–name:为容器指定名称。
-
示例:docker run -d -p 80:80 --name myhttpd httpd,创建并启动名为 myhttpd 的容器,后台运行,将宿主机 80 端口映射到容器 80 端口。
- 查看正在运行的容器:docker ps
- 列出所有运行中容器,包括容器 ID、镜像名称、启动命令、创建时间、状态、端口映射和容器名称等信息。
-
查看所有容器(包括停止的):docker ps -a
-
停止容器:docker stop [容器ID/容器名称]
- 示例:docker stop myhttpd,停止名为 myhttpd 的容器。
-
启动已停止的容器:docker start [容器ID/容器名称]
-
重启容器:docker restart [容器ID/容器名称]
-
删除容器:docker rm [容器ID/容器名称]
- 仅能删除已停止容器,删除运行中容器需用-f参数强制删除,如docker rm -f myhttpd。
- 进入容器:docker exec -it [容器ID/容器名称] /bin/bash
- 交互模式进入容器命令行界面,轻量级容器可能需用/bin/sh。
(三)其他常用命令
- 查看容器日志:docker logs [容器ID/容器名称]
- 查看容器运行日志,-f参数可实时跟踪日志输出。
- 查看容器详细信息:docker inspect [容器ID/容器名称]
- 返回容器详细配置信息,包括网络、存储、环境变量等。
- 复制文件:
-
宿主机到容器:docker cp 宿主机文件路径 容器ID/容器名称:容器内路径
-
容器到宿主机:docker cp 容器ID/容器名称:容器内文件路径 宿主机路径
五、Docker 镜像管理
(一)镜像的构建
通过 Dockerfile 构建镜像,Dockerfile 是包含构建指令的文本文件。示例:
# 基于httpd镜像构建
FROM httpd
# 维护者信息
MAINTAINER yourname@example.com
# 复制本地index.html到容器内指定目录
COPY index.html /usr/local/apache2/htdocs/
使用docker build -t myhttpd:v1 .命令,基于上述 Dockerfile 构建名为 myhttpd、标签为 v1 的镜像,该镜像在 httpd 基础上添加了自定义 index.html 文件。
(二)镜像的分层
Docker 镜像采用分层存储,每条 Dockerfile 指令创建新镜像层,且层为只读。容器启动时,会在镜像层基础上创建可写层,容器操作均在可写层进行。
分层结构优点:
-
共享资源:多镜像可共享基础层,减少存储占用。
-
增量更新:镜像更新只需修改相关层,无需重新构建整个镜像,提高构建和分发效率。
(三)镜像的推送与拉取
-
推送镜像到仓库:先通过docker login [仓库地址]登录仓库,输入用户名和密码。再用docker tag为镜像打仓库标签(格式:仓库地址/用户名/镜像名称:标签),最后用docker push 仓库地址/用户名/镜像名称:标签推送。
-
从仓库拉取镜像:使用docker pull 仓库地址/用户名/镜像名称:标签命令。
六、Docker 容器的生命周期
Docker 容器生命周期包括以下阶段:
(一)创建阶段
通过docker run命令基于镜像创建容器,此时容器分配文件系统、网络接口等必要资源,处于创建状态。
(二)运行阶段
容器创建完成后进入运行阶段,应用程序开始执行。可通过docker start命令将已停止容器重新启动至此阶段。
(三)停止阶段
docker stop命令可停止运行中容器,容器状态保存但应用程序停止,可通过docker start恢复到运行阶段。
(四)删除阶段
无需的容器可用docker rm命令删除,释放占用资源,仅停止状态容器可被删除。
七、Docker 网络
Docker 提供多种网络模式,实现容器间、容器与宿主机及外部网络的通信。
(一)桥接网络(Bridge)
Docker 默认网络模式,启动时创建docker0桥接网络,新容器自动连接此网络,可与宿主机及同网络其他容器通信。
(二)主机网络(Host)
容器不拥有独立网络栈,直接使用宿主机网络,IP 和端口与宿主机相同,提升网络性能但降低隔离性。
(三)容器网络(Container)
允许一个容器共享另一个容器的网络栈,两容器可像同一机器般通信,共享网络资源。
(四)无网络(None)
容器无任何网络配置,完全与外界隔离。
(五)自定义网络
用户可通过docker network create命令创建自定义网络,能更好管理容器通信,提供灵活配置(如指定子网、网关等)。
八、Docker 存储
Docker 提供多种存储驱动和方式管理容器数据。
(一)数据卷(Volumes)
Docker 推荐的存储方式,是独立于容器的持久化存储区域,可在多容器间共享重用。数据卷不受容器生命周期影响,容器删除后数据仍保留。
创建数据卷:docker volume create [卷名称]
挂载数据卷到容器:docker run -v [卷名称]:[容器内路径] 镜像名称
(二)绑定挂载(Bind Mounts)
将宿主机目录或文件挂载到容器,容器可直接访问修改宿主机文件。较数据卷灵活,但依赖宿主机文件系统结构。
使用命令:docker run -v [宿主机路径]:[容器内路径] 镜像名称
(三)tmpfs 挂载
数据存储在宿主机内存,不持久化到磁盘,适用于存储临时数据,容器停止或宿主机重启时数据丢失。
使用命令:docker run --tmpfs [容器内路径] 镜像名称
九、Docker 安全
(一)容器隔离的局限性
容器共享宿主机内核,内核漏洞可能被攻击者利用突破隔离,如获取宿主机权限影响其他容器。
(二)镜像安全
-
使用官方或可信镜像,避免非官方、来源不明镜像(可能含恶意代码或漏洞)。
-
利用 Clair、Trivy 等工具扫描镜像,检测安全漏洞和恶意软件。
(三)容器运行时安全
-
限制容器权限,避免使用特权模式,通过–cap-drop删除不必要 Linux capabilities。
-
设置 CPU、内存等资源限制,防止单个容器过度占用资源,用-c限制 CPU 份额,-m限制内存。
-
实时监控容器运行日志,结合 ELK 等工具集中管理分析,及时发现异常。
十、Docker 与云计算服务的集成
(一)与 AWS 的集成
AWS 提供 Amazon ECS(Elastic Container Service)和 Amazon EKS(Elastic Kubernetes Service)管理 Docker 容器。
-
ECS:无需管理编排软件,轻松运行和扩展 Docker 容器的容器编排服务。
-
EKS:托管 Kubernetes 服务,Kubernetes 是开源容器编排平台,支持 Docker 容器运行。
(二)与 Azure 的集成
Azure 提供 Azure Container Instances(ACI)和 Azure Kubernetes Service(AKS)。
-
ACI:无服务器容器服务,快速启动容器,无需管理底层基础设施。
-
AKS:简化 Azure 上 Kubernetes 集群的部署、管理和操作,方便运行 Docker 容器。
(三)与 Google Cloud 的集成
Google Cloud 提供 Google Kubernetes Engine(GKE),是完全托管的 Kubernetes 服务,支持 Docker 容器运行管理,提供自动扩展、修复等功能,提升集群可靠性和可用性。
十一、Docker 实际应用案例
(一)Web 应用部署
某企业部署由前端、后端和数据库组成的 Web 应用,使用 Docker 分别打包三部分为镜像,通过 Docker Compose 部署。
-
前端用 Nginx 镜像,后端用 Java 镜像,数据库用 MySQL 镜像。
-
用 Docker Compose 定义容器关系和配置(网络连接、数据卷挂载等),执行docker-compose up -d一键启动整个应用,简化部署流程。
(二)持续集成 / 持续部署(CI/CD)
在软件开发中,CI/CD 实现代码自动构建、测试和部署,Docker 在此过程中作用关键。
-
开发人员提交代码后,CI 服务器(如 Jenkins)拉取代码,用 Docker 构建应用镜像并在容器中测试。
-
测试通过后,镜像推送到仓库,CD 服务器从仓库拉取镜像部署到生产环境容器,自动化程度高,减少人为操作,提升开发效率和软件质量。
安装部署
一、防火墙与 SELinux 配置
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/=enforcing/=disabled/' /etc/selinux/config
- 前两条命令是关闭防火墙服务并禁止开机自启,这样能避免防火墙对 Docker 网络产生干扰。
- 后两条命令的作用是临时关闭 SELinux,并且通过修改配置文件使其永久失效,以此来防止 SELinux 对容器运行造成限制。
二、Docker 仓库配置与安装
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
dnf clean all
dnf makecache
dnf -y install docker-ce
- 第一条命令是从阿里云镜像源下载 Docker 官方仓库配置文件。
- 第二、三条命令对配置文件里的变量进行替换,保证在 CentOS 8 系统上能正确匹配仓库路径。
- 后面几条命令依次是清理缓存、重建缓存索引,最后安装 Docker CE 版本。
三、Docker 服务配置优化
sed -i 's/ExecStart=.*/ExecStart=\/usr\/bin\/dockerd -H fd\:\/\/ --containerd=\/run\/containerd\/containerd.sock -H tcp\:\/\/0.0.0.0:2375/g' /usr/lib/systemd/system/docker.service
此命令修改了 Docker 服务的启动参数,在原有基础上增加了 TCP 监听端口 2375,这样就能远程管理 Docker 服务了。
四、Docker 运行参数配置
{
"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com"],
"insecure-registries": ["192.168.10.106"]
}
exec-opts:把容器的 cgroup 驱动设置为 systemd,从而与系统的资源管理机制更好地兼容。registry-mirrors:配置了多个镜像加速地址,能够提高拉取 Docker 镜像的速度。insecure-registries:将 IP 为 192.168.10.106 的私有镜像仓库设置为信任地址,允许使用 HTTP 进行通信。
五、网络转发配置
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
- 第一条命令开启了系统的 IP 转发功能,这是容器跨主机通信必不可少的条件。
- 后两条命令确保桥接网络的流量能够被 iptables 和 ip6tables 正确处理。
六、服务重启与验证
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
sysctl -p
docker version
- 前面三条命令依次是重新加载系统服务配置、重启 Docker 服务以及设置 Docker 开机自启。
sysctl -p会让前面配置的网络参数立即生效。- 最后通过查看 Docker 版本信息来验证安装是否成功。
七、Docker Compose 配置
mv docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
这两条命令把 Docker Compose 可执行文件移动到系统路径下,并且赋予其可执行权限,这样就能在任意位置使用 docker-compose 命令了。
Docker镜像操作
一,获取镜像
语法
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
NAME:镜像名称(例如nginx、mysql)。TAG:镜像标签(例如latest、1.21.1),默认为latest。DIGEST:镜像的 SHA256 哈希值(用于精确指定镜像版本)。
# 执行docker pull命令从Docker Hub拉取nginx镜像,若未指定标签则默认拉取latest标签
[root@localhost ~]# docker pull nginx
# 显示使用默认标签latest
Using default tag: latest
# 显示正在从library/nginx仓库拉取latest标签的镜像
latest: Pulling from library/nginx
# 每个层的ID和状态,表示该层已下载完成
3da95a905ed5: Pull complete
6c8e51cf0087: Pull complete
9bbbd7ee45b7: Pull complete
48670a58a68f: Pull complete
ce7132063a56: Pull complete
23e05839d684: Pull complete
ee95256df030: Pull complete
# 显示镜像的摘要信息,用于唯一标识镜像版本
Digest: sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc
# 显示拉取状态,表明已下载最新版本的nginx镜像
Status: Downloaded newer image for nginx:latest
# 显示镜像的完整名称和标签
docker.io/library/nginx:latest
二,查看镜像信息
语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
常用参数
| 参数 | 作用 |
|---|---|
-a, --all | 显示所有镜像(包括中间层镜像)。 |
--digests | 显示镜像的摘要信息(Digest)。 |
-f, --filter | 根据条件过滤结果(如 dangling=true 显示未被使用的镜像)。 |
--format | 使用 Go 模板自定义输出格式。 |
--no-trunc | 不截断输出(显示完整的镜像 ID、摘要等)。 |
-q, --quiet | 只显示镜像 ID(常用于脚本自动化)。 |
# 执行docker images命令查看本地Docker镜像列表
[root@localhost ~]# docker images
# 镜像仓库名称,这里是nginx官方仓库
REPOSITORY # 镜像标签,latest表示最新版本
TAG # 镜像的唯一标识符,用于精确区分不同镜像
IMAGE ID # 镜像创建时间,这里显示不到1秒前创建
CREATED # 镜像大小,此nginx镜像占用192MB磁盘空间
SIZE
# 具体的镜像信息:
# 从nginx仓库拉取的latest标签镜像
nginx # 最新版本标签
latest # 镜像的SHA-256哈希值前12位
9592f5595f2b # 显示该镜像是刚刚创建的
Less than a second ago # 镜像下载到本地后占用的空间大小
192MB
三,查看镜像的详细信息
语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
常用参数
| 参数 | 作用 |
|---|---|
-f, --format | 使用 Go 模板格式化输出(如 {{.NetworkSettings.IPAddress}})。 |
--type | 指定对象类型(container、image、network 或 volume)。 |
--size | 显示容器的磁盘占用(仅对运行中的容器有效)。 |
[root@localhost ~]# docker inspect 95
[{"Id": "sha256:9592f5595f2b12c2ede5d2ce9ec936b33fc328225a00b3901b96019e3dd83528","RepoTags": ["nginx:latest"],"RepoDigests": ["nginx@sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc"],"Parent": "","Comment": "buildkit.dockerfile.v0","Created": "2025-06-24T20:52:14Z","DockerVersion": "","Author": "",
####省略........
四,添加镜像标签
语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
# 使用docker tag命令为本地镜像添加新标签
[root@localhost ~]# docker tag
# 指定源镜像名称,这里使用nginx仓库的latest标签镜像(若不指定标签默认使用latest)
nginx
# 指定目标镜像的名称和标签,格式为REPOSITORY:TAG
# 这里为同一个nginx仓库添加了v1标签,使该镜像同时拥有latest和v1两个标签
nginx:v1
这条命令的作用是为本地已有的nginx:latest镜像添加一个额外的v1标签。执行后,同一个镜像会同时拥有两个标签,可以通过nginx:latest或nginx:v1来引用它。这在版本管理中很有用,比如你可以将当前稳定版本标记为v1,而latest标签可能会随着新镜像的拉取而更新。
使用docker images查看效果
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 9592f5595f2b Less than a second ago 192MB
nginx v1 9592f5595f2b Less than a second ago 192MB
五,删除镜像
语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
常用参数
| 参数 | 作用 |
|---|---|
-f, --force | 强制删除镜像(即使有容器依赖或被多个标签引用)。 |
--no-prune | 不清理未带标签的父镜像(默认会自动清理)。 |
1. 通过标签删除镜像
docker rmi nginx:latest
2. 通过镜像 ID 删除(支持部分 ID)
docker rmi 9592f5595f2b # 使用完整 ID
docker rmi 959 # 使用部分 ID(需唯一匹配)
3. 删除多个镜像
docker rmi nginx:v1 ubuntu:20.04
4. 强制删除被引用的镜像
docker rmi -f nginx:latest
5. 批量删除镜像(结合过滤)
# 删除所有无标签(dangling)镜像
docker rmi $(docker images -f dangling=true -q)
删除规则
-
多标签镜像:若镜像有多个标签,
docker rmi仅删除指定标签,保留镜像内容。# 删除 nginx:v1 标签,但保留镜像(若还有其他标签) docker rmi nginx:v1 -
容器依赖:若镜像被容器引用(即使容器已停止),需先删除容器:
docker rm -f my-container # 强制删除容器 docker rmi nginx:latest # 再删除镜像 -
强制删除(-f):直接删除镜像,忽略容器依赖(可能导致容器无法启动)。
六,存出镜像和载入镜像
语法
docker save -o <输出文件> <镜像1> <镜像2> ...
1.保存的单个镜像
[root@localhost ~]# docker save -o nginx nginx:latest
2.保存多个镜像到一个归档
[root@localhost ~]# docker save -o nginx.tar nginx:v1 nginx:v2 nginx:v3
[root@localhost ~]# ls
nginx.tar
3.载入镜像
[root@localhost ~]# docker load<nginx
1bb35e8b4de1: Loading layer 77.88MB/77.88MB
1bf33238ab09: Loading layer 118.5MB/118.5MB
81a9d30670ec: Loading layer 3.584kB/3.584kB
f941308035cf: Loading layer 4.608kB/4.608kB
e6c40b7bdc83: Loading layer 2.56kB/2.56kB
de2ef8ceb76a: Loading layer 5.12kB/5.12kB
07eaefc6ebf2: Loading layer 7.168kB/7.168kB
Loaded image: nginx:latest
Loaded image: nginx:v3
Docker容器操作
一,创建容器
语法
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
- 功能:创建一个新的容器,但不启动它(与
docker run不同,run会创建并启动容器)。 - 返回值:成功执行后会返回新创建容器的唯一 ID(长 ID)。
常见的选项
| 选项 | 简写 | 功能描述 |
|---|---|---|
--name | 为容器指定唯一名称(如 --name web_server)。 | |
--interactive | -i | 保持标准输入(STDIN)打开,允许后续交互(需配合 -t)。 |
--tty | -t | 分配伪终端,模拟交互式 shell(通常与 -i 联用,即 -it)。 |
--detach | -d | 后台运行容器(需配合 docker start 启动后生效)。 |
[root@localhost ~]# docker create -it centos:7
二,查看所有的容器
语法
docker ps [OPTIONS]
常用选项:
| 选项 | 功能描述 |
|---|---|
-a | 显示所有容器(包括已停止的)。 |
-q | 只显示容器 ID。 |
--last n | 显示最后创建的 n 个容器。 |
--format | 自定义输出格式(如 --format '{{.ID}}: {{.Names}}')。 |
-s | 显示容器大小。 |
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98e82033ca10 nginx "/docker-entrypoint.…" 6 seconds ago Created jovial_booth
# 容器ID:98e82033ca10(唯一标识符,可简写前几位)
# 镜像:nginx(基于nginx镜像创建)
# 命令:"/docker-entrypoint.…"(容器启动时执行的命令,被截断显示)
# 创建时间:6 seconds ago(容器创建于6秒前)
# 状态:Created(容器已创建,但尚未启动)
# 端口:未映射任何端口(若有映射会显示"主机端口->容器端口")
# 名称:jovial_booth(Docker自动生成的随机名称,可通过--name指定自定义名称)
三,容器的运行
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
功能:创建并启动一个新容器。
-
核心参数
:
IMAGE:基础镜像名称(如nginx:alpine)。COMMAND和ARG:覆盖镜像默认启动命令(可选)。
[root@localhost ~]# docker start 98 98
常用选项分类
1. 容器基础配置
| 选项 | 简写 | 功能描述 |
|---|---|---|
-d | 后台运行容器(守护态)。 | |
-i | 保持标准输入(STDIN)打开,允许交互。 | |
-t | 分配伪终端(pseudo-TTY),通常与 -i 联用(即 -it)。 | |
--name | 为容器指定自定义名称(如 --name web_server)。 | |
--restart | 设置重启策略(如 --restart always 自动重启)。 |
2. 资源限制
| 选项 | 功能描述 |
|---|---|
-m, --memory | 设置内存上限(如 -m 512m 或 -m 1g)。 |
--cpus | 限制 CPU 使用率(如 --cpus 0.5 表示使用半核)。 |
--memory-swap | 设置内存 + 交换空间总限制(如 -1 表示无限制)。 |
3. 端口映射
| 选项 | 功能描述 |
|---|---|
-p | 映射容器端口到主机(如 -p 8080:80 表示主机 8080 → 容器 80)。 |
-P | 随机映射容器暴露的所有端口到主机。 |
4. 数据卷挂载
| 选项 | 功能描述 |
|---|---|
-v | 挂载主机目录或数据卷(如 -v /host/data:/container/data)。 |
--mount | 更灵活的挂载方式(如 --mount type=bind,source=/host,target=/container)。 |
5. 环境变量
| 选项 | 功能描述 |
|---|---|
-e | 设置环境变量(如 -e DB_USER=admin -e DB_PASS=secret)。 |
--env-file | 从文件读取环境变量(如 --env-file .env)。 |
6. 网络配置
| 选项 | 功能描述 |
|---|---|
--network | 指定网络模式(如 --network host 或自定义网络名)。 |
--ip | 指定容器 IP(仅在自定义网络中有效)。 |
7. 其他高级选项
| 选项 | 功能描述 |
|---|---|
--privileged | 给予容器完全特权(慎用)。 |
--entrypoint | 覆盖镜像的默认启动命令。 |
--user | 指定运行容器的用户(如 --user nobody)。 |
--rm | 容器退出时自动删除(常用于一次性任务)。 |
典型场景示例
-
交互式容器(如 bash 终端)
docker run -it --name my_centos centos:7 bash -
后台运行的 Web 服务器
docker run -d -p 8080:80 --name web_server nginx:alpine -
带数据卷和环境变量的数据库
docker run -d \-v /host/mysql:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \--name mysql_db \mysql:8.0 -
一次性任务(运行后自动删除)
docker run --rm alpine echo "Hello, Docker!" -
自定义网络和资源限制
docker run -d \--network my_network \--cpus 0.25 \-m 128m \redis:alpine
启动已停止的容器
如果容器已创建但未启动(状态为 Created),使用 docker start:
docker start [OPTIONS] CONTAINER [CONTAINER...]
常用选项:
-i:附加到容器的 STDIN。--attach:附加到容器的输出。
补充说明
- 镜像拉取:如果本地没有指定镜像,Docker 会自动从 Docker Hub 拉取。
- 命令覆盖:
[COMMAND] [ARG...]会覆盖镜像的默认CMD(如docker run alpine ls -l)。 - 查看帮助:使用
docker run --help获取完整选项列表。
四,进入容器
语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项:
| 选项 | 功能描述 |
|---|---|
-i, --interactive | 保持标准输入打开,允许交互。 |
-t, --tty | 分配伪终端,模拟交互式 shell。 |
-d, --detach | 后台执行命令(不交互)。 |
--user | 指定运行命令的用户(如 --user root)。 |
典型场景:
-
进入交互式 shell(最常用):
docker exec -it my_container bash # 对于基于 Debian/Ubuntu 的容器 docker exec -it my_container sh # 对于基于 Alpine 的容器(默认没有 bash) -
执行一次性命令:
docker exec my_container ls -l /var/log # 查看容器内日志目录 docker exec my_container cat /etc/hosts # 查看容器 hosts 文件 -
以特定用户身份执行:
docker exec -it --user nobody my_container whoami # 以 nobody 用户身
五,容器的导入导出
在 Docker 中,容器的导入导出主要涉及两种场景:容器与镜像的转换和镜像的传输保存。以下是完整的语法和使用场景:
一、容器与镜像的转换
1. 导出容器为文件系统(docker export)
docker export [OPTIONS] CONTAINER > archive.tar
- 功能:将容器的文件系统内容导出为 tar 归档文件(不包含镜像历史)。
- 常用选项:
-o, --output:直接输出到文件(如docker export -o container.tar my_container)。
示例:
docker export my_container > container_backup.tar
2. 导入文件系统为镜像(docker import)
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
- 功能:从 tar 文件创建新镜像(可来自
docker export或其他来源)。 - 常用选项
-m, --message:添加镜像说明(如--message "Imported from container")。
示例:
docker import container_backup.tar my_image:imported
3. 保存容器为镜像(docker commit)
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
- 功能:将容器的当前状态保存为新镜像(包含完整镜像历史)。
- 常用选项
-a, --author:指定作者(如--author "John Doe")。-m, --message:添加提交信息(如--message "Updated configuration")。
示例:
docker commit my_container my_image:v2
二、镜像的传输与保存
1. 保存镜像到文件(docker save)
docker save [OPTIONS] IMAGE [IMAGE...] > image.tar
- 功能:将一个或多个镜像打包为 tar 文件(用于传输或备份)。
- 常用选项:
-o, --output:直接输出到文件(如docker save -o images.tar nginx:alpine mysql:8.0)。
示例:
docker save my_image:v1 my_image:v2 > images.tar
2. 从文件加载镜像(docker load)
docker load [OPTIONS]
- 功能:从 tar 文件加载镜像(恢复
docker save或导出的镜像)。 - 常用选项
--input, -i:指定输入文件(如docker load -i images.tar)。
示例:
docker load < images.tar
三、对比与最佳实践
| 场景 | 命令 | 输入 | 输出 | 特点 |
|---|---|---|---|---|
| 容器 → 文件系统 | docker export | 运行中的容器 | tar 文件 | 仅当前文件系统,无镜像历史,体积小 |
| 文件系统 → 镜像 | docker import | tar 文件或 URL | Docker 镜像 | 导入为新镜像,历史丢失 |
| 容器 → 镜像 | docker commit | 运行中的容器 | Docker 镜像 | 保留完整镜像历史,体积大 |
| 镜像 → 保存文件 | docker save | 一个或多个镜像 | tar 文件 | 保留所有镜像层和元数据,适合镜像分发 |
| 文件 → 加载镜像 | docker load | tar 文件 | Docker 镜像 | 恢复镜像,包括标签和历史 |
四、典型场景示例
1. 迁移容器到其他主机
# 在源主机导出容器
docker export my_container > container.tar# 传输到目标主机
scp container.tar user@target_host:/tmp/# 在目标主机导入为镜像
docker import /tmp/container.tar my_image:imported# 基于镜像启动容器
docker run -d my_image:imported
2. 备份和恢复镜像
# 备份镜像
docker save my_image:v1 my_image:v2 -o images_backup.tar# 恢复镜像
docker load -i images_backup.tar
3. 共享镜像(不依赖 Docker Hub)
# 创建镜像包
docker save my_custom_image:v1 > my_image.tar# 通过 U 盘或网络传输
# 在目标机器加载
docker load < my_image.tar
五、注意事项
exportvssave:docker export导出的是容器的当前文件系统,丢失镜像历史。docker save保存的是完整镜像,包含所有层和元数据。
- 镜像导入导出的兼容性:
- 导出的文件可在不同 Docker 版本间传输,但建议版本相近。
- 跨平台(如 Linux → Windows)可能需要特殊处理(如调整文件权限)。
- 避免手动
commit:- 容器修改应通过 Dockerfile 自动化,而非
docker commit(难以复现和维护)。
- 容器修改应通过 Dockerfile 自动化,而非
- 大型镜像优化:
- 使用多阶段构建减少镜像体积。
- 使用
.dockerignore排除不必要的文件。