docker run
是 Docker 中最常用的命令之一,用于创建并启动一个容器。它背后执行了一系列复杂的操作,以下是 docker run
命令的主要步骤:
1. 检查本地镜像
- Docker 首先检查指定的镜像是否存在于本地。
- 如果本地没有该镜像,Docker 会尝试从配置的镜像仓库(如 Docker Hub)拉取(
docker pull
)该镜像。
2. 创建容器
- Docker 根据指定的镜像创建一个新的容器。
- 这一步会初始化容器的文件系统,包括镜像的只读层和一个可写的容器层(用于存储运行时产生的数据)。
3. 分配文件系统
- Docker 为容器分配一个独立的文件系统,基于镜像的分层结构。
- 如果指定了卷(
-v
参数),Docker 会将宿主机目录挂载到容器中。
4. 配置网络
- Docker 为容器配置网络。
- 默认情况下,容器会连接到 Docker 的默认桥接网络(
bridge
),但可以通过--network
参数指定其他网络模式(如host
、none
或自定义网络)。
5. 设置资源限制
- 如果指定了资源限制(如 CPU、内存等),Docker 会为容器配置相应的资源限制(通过
--cpus
、--memory
等参数)。
6. 设置环境变量
- Docker 会将通过
-e
参数指定的环境变量注入到容器中。 - 如果没有指定,Docker 会使用镜像中定义的环境变量。
7. 执行启动命令
- Docker 执行容器中定义的启动命令(
CMD
或ENTRYPOINT
)。 - 如果通过
docker run
指定了命令(如docker run ubuntu echo "Hello"
),它会覆盖镜像中的默认命令。
8. 附加到标准输入/输出
- 如果指定了
-i
(交互模式)或-t
(分配伪终端),Docker 会将容器的标准输入、输出和错误流附加到当前终端。 - 如果没有指定
-d
(后台运行),容器会在前台运行。
9. 启动容器
- Docker 启动容器,运行指定的命令或进程。
- 如果容器进程退出,容器也会停止(除非指定了
--restart
策略)。
10. 返回容器 ID
docker run
命令执行完成后,会返回新创建的容器的 ID。
总结
docker run
实际上是一个组合命令,相当于以下命令的简写:
docker create # 创建容器
docker start # 启动容器
docker attach # 附加到容器(如果未使用 -d 参数)
通过 docker run
,Docker 完成了从镜像到容器的整个生命周期管理。