docker相关进程的作用
- 一、核心守护进程
-
- [1.1 dockerd:Docker 主守护进程](#1.1 dockerd:Docker 主守护进程)
- [1.2 docker-proxy:Docker 端口映射代理进程](#1.2 docker-proxy:Docker 端口映射代理进程)
- 二、容器运行时进程
-
- [2.1 containerd:容器运行时核心](#2.1 containerd:容器运行时核心)
- [2.2 containerd-shim-runc-v2:容器 "垫片" 进程](#2.2 containerd-shim-runc-v2:容器 “垫片” 进程)
- [2.3 runc:底层容器创建工具(轻量级)](#2.3 runc:底层容器创建工具(轻量级))
- 三、容器的启动过程
一、核心守护进程
这类进程是 Docker 服务的基础,负责接收用户指令、管理容器生命周期、协调底层资源,是 Docker 运行的核心
1.1 dockerd:Docker 主守护进程
核心作用:Docker 最核心的后台进程,相当于整个 Docker 系统的 "管理器",处理所有容器相关的核心逻辑
具体功能:
- 接收并解析用户通过 docker 命令行工具(CLI)发送的指令(如 docker run、docker stop)
- 管理容器的全生命周期:创建、启动、暂停、停止、删除
- 管理 Docker 镜像:拉取、推送、构建、删除镜像
- 分配和管理底层资源:为容器分配 CPU、内存、PID 等系统资源,通过 Linux 内核特性(如 Namespace、Cgroups)实现容器隔离
- 提供 API 接口:默认监听 unix:///var/run/docker.sock Unix 套接字,支持外部工具(如 Docker Compose、Kubernetes)通过 API 调用 Docker 功能
启动方式:通常通过系统服务管理(如 systemctl start docker),启动时会加载配置文件(/etc/docker/daemon.json)
1.2 docker-proxy:Docker 端口映射代理进程
核心作用:解决容器网络 "隔离" 与 "外部访问" 的矛盾,实现宿主机端口到容器端口的流量转发
工作场景:当使用 docker run -p 宿主机端口:容器端口(如 -p 8080:80)映射端口时,dockerd 会自动启动一个 docker-proxy 进程
具体功能:
- 监听宿主机指定端口的 TCP/UDP 流量(如宿主机的 8080 端口)
- 将接收到的流量转发到容器内部对应的端口(如容器的 80 端口)
- 处理 "容器 IP 动态变化" 的问题:即使容器重启后 IP 改变,docker-proxy 仍能通过容器名称 / ID 定位容器,保证端口映射不失效
进程特征:每一个端口映射规则(-p)对应一个独立的 docker-proxy 进程,进程名通常包含端口信息(如 docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -container-port 80)
二、容器运行时进程
这类进程直接与容器关联,是容器内应用运行的 "载体",负责容器的隔离、资源限制和信号处理
2.1 containerd:容器运行时核心
核心定位:Docker 从 18.09 版本开始,将 containerd 作为默认的容器运行时(替代早期的 docker-runc 直接调用),负责容器的底层运行逻辑,是 dockerd 与内核之间的 "中间层"
具体功能:
- 接收 dockerd 的指令,管理容器的启停、暂停、删除等操作
- 管理容器的镜像分层和存储:负责从镜像仓库拉取镜像、解压镜像分层,并为容器挂载根文件系统
- 调用底层运行时创建容器:通过 runc 与 Linux 内核交互,创建 Namespace和 Cgroups
- 管理容器的网络和存储插件:对接 Docker 网络(如 bridge、overlay)和存储(如 overlay2、bind mount)
进程特征:通常只有一个主进程 containerd,但会衍生多个子进程(如 containerd-shim-runc-v2)对应不同容器
2.2 containerd-shim-runc-v2:容器 "垫片" 进程
核心作用:作为 containerd 与 runc 之间的 "垫片 ",解耦容器运行时与主进程,保证容器的稳定性
具体功能:
- 隔离 containerd 与容器:即使 containerd 重启,containerd-shim-runc-v2 仍能维持容器运行(避免 containerd 故障导致容器崩溃)
- 管理容器的 PID 命名空间:为容器提供独立的 PID 空间,容器内的 PID 1 进程(如 bash、nginx)由其管理
- 处理容器的信号转发:将宿主机发送的信号转发到容器内的主进程
- 收集容器的日志和退出状态:将容器的标准输出转发到 Docker 日志驱动(如 json-file),并记录容器的退出码
进程特征:每个运行中的容器对应一个 containerd-shim-runc-v2 进程,进程名包含容器 ID(如 containerd-shim-runc-v2 -namespace moby -id abc123... -address /run/containerd/containerd.sock)
2.3 runc:底层容器创建工具(轻量级)
核心定位:runc 是一个符合 OCI(开放容器倡议)标准的轻量级容器运行时工具,不常驻后台,仅在创建 / 销毁容器时被调用
具体功能:
- 接收 containerd 的指令,直接与 Linux 内核交互,创建容器所需的 Namespace 和 Cgroups
- 为容器挂载根文件系统,设置容器的网络、用户、环境变量等配置
- 启动容器内的主进程,并将进程 PID 反馈给 containerd-shim-runc-v2
进程特征:runc 是 "一次性" 进程,容器创建完成后会自动退出,不常驻内存
容器内主进程(如 nginx、bash)
核心作用:容器的 "业务进程",容器的生命周期与该进程强绑定(进程退出,容器也会退出,除非配置了 --restart 策略)
三、容器的启动过程
用户执行 docker run → docker CLI → dockerd(主守护进程) → containerd(运行时) → containerd-shim(垫片进程) → runc(OCI 运行时) → 容器内主进程启动
- 当用户通过DockerCLl启动一个容器时,DockerDaemon会将请求转发给containerd
- containerd解析请求,拉取镜像(如果需要),并创建容器
- containerd启动containerd-shim-runc-v2进程,并将容器配置传递给它
- containerd-shim-runc-v2调用runc创建并启动容器进程
- containerd-shim-runc-v2监控容器进程,并将容器的状态和日志返回给containerd