docker组件分析

Docker的主要组件

Docker CLI(dockerdocker程序是一个客户端工具,用来把用户的请求发送给 docker daemon(dockerd)。该程序的安装路径为:/usr/bin/docker

Dockerd:即 docker daemon,也被称为 docker engine。安装路径为:/usr/bin/dockerd

Containerd:详情参考containerd简介。该程序的安装路径为:/usr/bin/docker-containerd

Containerd-shim:它是containerd的组件,是容器的运行时载体,在docker宿主机上看到的shim也正是代表着一个个通过调用的docker容器。该程序的安装路径为:/usr/bin/docker-containerd-shim

runC:详情参考runC简介。该程序的安装路径为:/usr/bin/docker-runc

各组件关系

Docker客户端与docker daemon之间是通过grpc的方式通信的。下面以创建容器的过程为例:

容器镜像的下载是由 dockerd 完成的,但容器的创建和运行就需要 containerd(docker-containerd) 来完成了。Dockerd 与 docker-containerd 之间是通过 grpc 协议通信的。当 docker-containerd 收到 dockerd 启动容器的请求之后,会做一些初始化工作,然后启动 docker-containerd-shim 进程,并将相关配置作为参数传给它。docker-containerd 负责管理所有本机正在运行的容器,而一个 docker-containerd-shim 进程只负责管理一个运行的容器,它相当于 docker-runc 的一个封装,充当 docker-containerd 和 docker-runc 之间的桥梁,docker-runc 能干的就交给 docker-runc 来做,docker-runc 做不了的就放到这里来做。

下面用ubuntu镜像运行一个容器:

$ docker run -itd ubuntu:20.04 bash

可以看到,上图黄框中是几个主要的进程,他们之间存在父子关系:

systemd--->dockerd--->docker-containerd--->docker-containerd-shim--->bash

至于docker-runc进程,它是作为docker-containerd-shim的子进程存在的。在容器启动的过程中,docker-runc根据配置找到容器的rootfs并创建子进程bash作为容器中的第一个进程。当一切做后,docker-runc退出,然后容器进程bash由它的父进程docker-containerd-shim接管。

容器通信方式

自从 Docker 被改名为 Moby 以后,代码已被拆分成 Docker,Containerd,Runc 三个模块:  当用户通过客户端发送操作请求时,Docker 模块监听到操作请求,将其转发到守护进程处理。守护进程调用libcontainerd 模块处理接收到的请求,libcontainerd 将用户操作请求发送给 Containerd。
Containerd 作为远程系统调用服务的服务器,将用户操作请求整理后,通过系统调用Runc 完成用户操作。Runc 基于 Linux 内核进程与信号接口实现容器生命周期管理。

如图所示,当用户请求容器快照操作时,在 Runc 中先创建 Swrk 模式的 CRIU 子进程,然后 Runc 主进程将用户请求经 Google Protobuf 序列化后发送给 CRIU 子进程,由CRIU 响应远程系统调用并实现容器内部进程状态的获取与恢复。处理完毕后 CRIU 发送用户请求的处理状态给 Runc 并结束自身进程。

Docker 保留 libcontainerd 部分,libcontainerd 与 Containerd 为 C/S 架构,通过远程系统调用通信。Containerd 通过 Runc系统调用完成对容器生命周期的管理。Runc 与 CRIU 也是通过远程系统调用通信。经过拆分的系统,每个模块都可以独立迭代升级,模块之间可以通过远程系统调用通信。 

为什么需要docker-containerd-shim

  • 它允许容器运行时(即 runC)在启动容器之后退出,简单说就是不必为每个容器一直运行一个容器运行时(runC)
  • 即使在 containerd 和 dockerd 都挂掉的情况下,容器的标准 IO 和其它的文件描述符也都是可用的
  • 向 containerd 报告容器的退出状态

特别是有了前两点,我们就可以在不中断容器运行的情况下升级或重启dockerd,这对于生产环境来说意义重大。

参考:

How the docker container creation process works

走进docker:hello-world的背后发生了什么?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值