在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,也会导致容器停止。