在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,也会导致容器停止。
浙公网安备 33010602011771号