Docker Cli
这是给用户用的命令行工具
Dockerd
监听 Docker API 请求,dockerd 通过 unix、tcp、fd 三种方式来接收 API 请求。
unix socket 也就是 /var/run/docker.sock ,启动 dockerd 需要root或者docker group 权限
dockerd 在启动的时候会拉起 containerd,并与 containerd保持通讯
Containerd
- 主要职责是管理容器的生命周期
- pull、push 镜像
- storage 管理
- 运行容器的runc
- 管理网络
containerd 包含一个暴露 gRPC API 的daemon服务,这些 API 比较底层,Dockerd通过Containerd管理容器的生命周期,Containerd 通过 runc 去运行容器
RunC
/usr/bin/docker-runc 可以视作 containerd 的一部分,它是一个运行遵从 OCI 标准容器的二进制工具。
容器镜像通过 OCI 标准的格式打包,一般情况下包含 config.json 文件 和 系统根目录
docker save -o nginx.tar nginx
把容器保存成 镜像 tar 文件,再解压可以看到image的内部结构
containerd-shim
containerd-shim 的存在使得 container 可以脱离 containerd 独立运行。(默认的,停掉 dockerd,container 也停止了,但可以通过 daemon.json
配置实现 dockerd 停掉后,container 照常运行。)
作为 container 的父进程,containerd-shim 主要负责如下职责:
- 使得 runc 运行完 container 后可以退出,无需为了一个 container 开启一个 runtime 常驻进程
- 保持容器的
stdio
开启状态,不至于容器写stdio
后收到SIGPIPE
而退出 - 把容器的 exit status 报告给 containerd
调用顺序是 dockerd --> containerd --> containerd-shim --> runc api --> "cmd"