docker run 背后做了什么

7 阅读2分钟

docker run 是 Docker 中最常用的命令之一,用于创建并启动一个容器。它背后执行了一系列复杂的操作,以下是 docker run 命令的主要步骤:


1. 检查本地镜像

  • Docker 首先检查指定的镜像是否存在于本地。
  • 如果本地没有该镜像,Docker 会尝试从配置的镜像仓库(如 Docker Hub)拉取(docker pull)该镜像。

2. 创建容器

  • Docker 根据指定的镜像创建一个新的容器。
  • 这一步会初始化容器的文件系统,包括镜像的只读层和一个可写的容器层(用于存储运行时产生的数据)。

3. 分配文件系统

  • Docker 为容器分配一个独立的文件系统,基于镜像的分层结构。
  • 如果指定了卷(-v 参数),Docker 会将宿主机目录挂载到容器中。

4. 配置网络

  • Docker 为容器配置网络。
  • 默认情况下,容器会连接到 Docker 的默认桥接网络(bridge),但可以通过 --network 参数指定其他网络模式(如 hostnone 或自定义网络)。

5. 设置资源限制

  • 如果指定了资源限制(如 CPU、内存等),Docker 会为容器配置相应的资源限制(通过 --cpus--memory 等参数)。

6. 设置环境变量

  • Docker 会将通过 -e 参数指定的环境变量注入到容器中。
  • 如果没有指定,Docker 会使用镜像中定义的环境变量。

7. 执行启动命令

  • Docker 执行容器中定义的启动命令(CMDENTRYPOINT)。
  • 如果通过 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 完成了从镜像到容器的整个生命周期管理。