Docker 组件介绍

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 主要负责如下职责:

  1. 使得 runc 运行完 container 后可以退出,无需为了一个 container 开启一个 runtime 常驻进程
  2. 保持容器的 stdio 开启状态,不至于容器写 stdio 后收到 SIGPIPE 而退出
  3. 把容器的 exit status 报告给 containerd

调用顺序是 dockerd --> containerd --> containerd-shim --> runc api --> "cmd"

Send a Message