早期
早期的 Docker 即使 cli 又是 damon,由 libcontainer 直接操作主机 OS 接口,容器启动的应用程序都直接挂在 docker daemon 下。
调用链:cli --> docker --> 容器 CMD
进程层级关系:
中期
Docker 架构的变化就是引用了 containerd 和 runc,containerd 负责容器的生命周期的管理。原先创建 namespace 和 cgroup 的逻辑形成 runc。调用 runc 以及监视容器的逻辑形成 containerd-shim。
containerd 提供 gRPC 结构由 dockerd 调用,dockerd 主要还是用于接收 cli 发送的请求。有了 containerd 之后,dockerd 可独立升级,避免了早期 dockerd 升级导致所有容器不可用的窘境。
runc 是按照 OCI 标准的具体实现,runc 通过调用内核接口为容器创建 cgroup、namespace 以及挂载 rootfs 等。
containerd-shim 是运行容器的载体,每个启动的容器都会起一个 container-shim 进程,由 containerd 调用。containerd-shim 调用 runc 创建容器并接管容器进程。
调用链:cli --> dockerd --> containerd --> containerd-shim --> runc(运行完退出) --> 容器 CMD
进程层级关系:
现在
docker-ce19 版本默认使用 containerd-shim,docker-ce20 以后默认使用 containerd-shim-runc-v2,并在进程结构上做了调整。containerd-shim 直接作为 systemd 的子进程,不再挂在 containerd 下。
进程层级关系: