在Docker中,docker run指令执行后,生成了哪些进程?

在Docker中执行 docker run 指令后,会在宿主机上生成一系列关联进程,这些进程共同构成了容器的运行环境。具体生成的进程可分为以下几类,核心关系是“Docker 守护进程管理容器进程,容器进程本质是宿主机上的隔离进程”:

1. Docker 客户端进程(短暂存在)

  • 作用:解析 docker run 命令参数,向 Docker 守护进程(dockerd)发送创建容器的请求。
  • 生命周期:命令执行后启动,完成请求发送后立即退出(属于临时进程)。
  • 查看方式:执行 docker run 时,可通过 ps 命令在宿主机短暂捕捉到 docker 客户端进程(如 docker run xxx)。

2. Docker 守护进程(dockerd,持续运行)

  • 作用:Docker 的核心服务进程,负责接收客户端请求、管理容器生命周期(创建、启动、停止等)、镜像管理、网络配置等。
  • 生命周期:作为系统服务持续运行(除非手动停止),docker run 命令触发它创建容器的具体逻辑。
  • 查看方式ps -ef | grep dockerd,通常以 root 权限运行。

3. Containerd 进程(containerd,持续运行)

  • 作用:Docker 架构中的核心组件,负责容器的实际生命周期管理(替代了早期 Docker 的 docker-containerd),包括创建容器、管理容器进程、镜像解压等。
  • 关系dockerd 不直接操作容器,而是通过 gRPC 调用 containerd 完成容器创建。
  • 查看方式ps -ef | grep containerd,通常也是持续运行的系统进程。

4. Runc 进程(runc,短暂存在)

  • 作用:根据 OCI(开放容器倡议)标准创建和运行容器的工具,是容器的“启动器”。containerd 会调用 runc 来实际创建容器进程(设置 Namespace、Cgroups 等隔离环境)。
  • 生命周期:容器启动时被 containerd 调用,完成容器初始化后立即退出(仅在容器启动瞬间存在)。
  • 查看方式:容器启动瞬间,可通过 ps -ef | grep runc 捕捉到短暂运行的 runc 进程。

5. 容器内的主进程(核心进程,与容器生命周期一致)

  • 作用:容器运行的核心应用进程,由用户在 docker run 中指定(如 docker run nginx 中的 nginx 进程,docker run bash 中的 bash 进程)。
  • 本质:这是一个宿主机上的普通进程,但通过 Linux Namespace(隔离 PID、网络、挂载等)和 Cgroups(限制资源)实现了“容器化”隔离。在宿主机上有独立的 PID,在容器内则显示为 PID 1( init 进程)。
  • 查看方式
    • 宿主机上:ps -ef | grep <容器内应用名>(如 ps -ef | grep nginx),可看到该进程的宿主机 PID。
    • 容器内:docker exec -it <容器ID> ps -ef,显示为容器内的 PID 1 进程。

6. 容器内主进程衍生的子进程(可选)

  • 作用:如果容器内的主进程会启动其他进程(如 nginx 会启动 worker 进程,tomcat 会启动 JVM 子进程),这些子进程也会在宿主机上生成对应的进程。
  • 特点:与主进程共享容器的隔离环境(同一 Namespace 和 Cgroups),在宿主机上有独立 PID,但在容器内显示为子进程 PID。

总结:进程关系链

docker run 触发的进程关系可简化为:
docker客户端(临时) → 调用 dockerd(持续) → 调用 containerd(持续) → 调用 runc(临时) → 创建 容器主进程(与容器同生命周期) → (可选)衍生 容器子进程

其中,容器主进程是容器存在的标志:当主进程退出,容器会随之停止;杀死宿主机上对应的容器主进程 PID,也会导致容器停止。

posted @ 2025-08-02 09:48  天道酬勤zjh  阅读(28)  评论(0)    收藏  举报