首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Docker 组件基本介绍

Docker 组件基本介绍

作者头像
我是阳明
发布2021-01-29 14:38:58
发布2021-01-29 14:38:58
8250
举报
文章被收录于专栏:k8s技术圈k8s技术圈

Docker Cli

供用户使用的命令行工具,负责请求 docker API 与 dockerd 交互,使得用户可以便捷友好的操作 docker。

Dockerd

监听 Docker API 请求,通过 containerd 管理 container 生命周期。

dockerd 通过 unix、tcp、fd 三种类型方式来接收 API 请求。默认的 unix socket 创建在 /var/run/docker.sock,启动 dockerd 需要 root 权限或者 docker group 权限。

dockerd 在启动的时候会拉起 containerd,并与 containerd 保持通信。

代码语言:javascript
复制
$ ps aux | grep dockerd

/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Containerd

containerd 的主要职责是管理容器的生命周期,此外它还做:

  1. 镜像的 pull & push
  2. 管理 storage
  3. 运行容器的时候通过 runc,并附带上合适的参数
  4. 管理网络

containerd 包含一个暴露 gRPC API 的 daemon 服务,这些 API 比较底层,为了被更好层调用,或者基于此做扩展。Docker 有很好的分层机制,containerd 不会直接被用户使用, 自己也是通过 runc 去运行容器。

containerd-architecture

containerd 拥有很强的适配性,其已是事实上的工业标准。containerd 通过 UNIX socket 对外暴露 gRPC API 。通过 containerd 的启动命令,可以很轻易的找到 sokcet 文件的具体位置。

代码语言:javascript
复制
$ ps aux | grep containerd

root     19513  0.0  4.9 634988 93836 ?        Ssl   2020   0:20 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

RunC

/usr/bin/docker-runc 可以视作 containerd 的一部分,它是一个运行遵从 OCI 标准容器的二进制工具。容器镜像通过 OCI 标准的格式打包,通常包括一个 config.json 文件和系统根目录。

代码语言:javascript
复制
$ tree -L 2 .

.
├── config.json
└── rootfs
    ├── bin
    ├── boot
    ├── dev
    ├── docker-entrypoint.d
    ├── docker-entrypoint.sh
    ├── etc
    ├── home
    ├── lib
    ├── lib64
    ├── media
    ├── mnt
    ├── opt
    ├── proc
    ├── root
    ├── run
    ├── sbin
    ├── srv
    ├── sys
    ├── tmp
    ├── usr
    └── var

21 directories, 2 files

config.json 文件具体都记录了点什么呢?主要字段包括:

  1. ociVersion 遵从的 OCI 版本
  2. mounts 挂载信息
  3. linux 需要做隔离的 namespace
  4. ...

containerd-shim

containerd-shim 的存在使得 container 可以脱离 containerd 独立运行。(默认的,停掉 dockerd,container 也停止了,但可以通过 daemon.json 配置实现 dockerd 停掉后,container 照常运行。)

作为 container 的父进程,container-shim 主要负责如下职责:

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

这些 docker 组件是如何协同工作的?

当我们启动 docker 后,dockerd 会默认拉起 containerd

代码语言:javascript
复制
$ ps fxa | grep docker -A 3

52660 ?        Ssl    0:01 /usr/bin/dockerd
52666 ?        Ssl    0:01  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml

假使我们运行一个 container ,这时就会看到 containerd-shim

代码语言:javascript
复制
$ docker run -d alpine sleep 60
643b5259637ced4c0c41a830034ebfe411aa1bdfac23b1c1f57926d3a9e552f0

$ ps fxa | grep docker -A 3

52660 ?        Ssl    0:01 /usr/bin/dockerd
52666 ?        Ssl    0:01  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml
54038 ?        Sl     0:00      \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/643b5259637ced4c0c41a830034ebfe411aa1bdfac23b1c1f57926d3a9e552f0 -address /var/run/docker/containerd/docker-containerd.sock -containerd-binary /usr/bin/docker-containerd -runtime-root /var/run/docker/runtime-runc
54052 ?        Ss     0:00          \_ sleep 60

调用顺序是 dockerd --> containerd --> container-shim --> "sleep 60"

“原文链接:https://github.com/Wang-Kai/cherish-today/issues/145 ”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker Cli
  • Dockerd
  • Containerd
  • RunC
  • containerd-shim
  • 这些 docker 组件是如何协同工作的?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档