进程树:
1 | /usr/bin/dockerd |
dockerd
containerd是容器技术标准化之后的产物,为了能够兼容OCI标准,将容器运行时及其管理功能从Docker Daemon剥离。理论上,即使不运行dockerd,也能够直接通过containerd来管理容器。(当然,containerd本身也只是一个守护进程,容器的实际运行时由后面介绍的runC控制。)
1 | /usr/bin/dockerd |
docker-containerd
containerd主要职责是镜像管理(镜像、元信息等)、容器执行(调用最终运行时组件执行)。
containerd向上为Docker Daemon提供了gRPC接口,使得Docker Daemon屏蔽下面的结构变化,确保原有接口向下兼容。向下通过containerd-shim结合runC,使得引擎可以独立升级,避免之前Docker Daemon升级会导致所有容器不可用的问题。
containerd独立负责容器运行时和生命周期(如创建、启动、停止、中止、信号处理、删除等)
1 | docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc |
docker-containerd-shim
容器的代理,接受容器创建、删除等命令,管理容器进程。
1 | docker-containerd-shim f195bb34b2a34e53f8d6b38af405185e9ce3cf59c38a12545c1f1416bd7a162c /var/run/docker/libcontainerd/f195bb34b2a34e53f8d6b38af405185e9ce3cf59c38a12545c1f1416bd7a162c docker-runc |
runc
OCI定义了容器运行时标准,runC是Docker按照开放容器格式标准(OCF, Open Container Format)制定的一种具体实现。
runC是从Docker的libcontainer中迁移而来的,实现了容器启停、资源隔离等功能。Docker默认提供了docker-runc实现,事实上,通过containerd的封装,可以在Docker Daemon启动的时候指定runc的实现。
containerd-shim通过run操作容器。创建完成后runc退出,容器进程由containerd-shim接管。容器内产生的孤儿进程也统一由containerd-shim接管。
使用runc运行容器
1 | mkdir -p mycontainer/rootfs && cd mycontainer |