Docker 组件基本介绍
Docker Cli
供用户使用的命令行工具,负责请求 docker API 与 dockerd 交互,使得用户可以便捷友好的操作 docker。
Dockerd
监听 Docker API 请求,通过 containerd 管理 container 生命周期。
dockerd 在启动的时候会拉起 containerd,并与 containerd 保持通信。
$ ps aux | grep dockerd
/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Containerd
containerd
的主要职责是管理容器的生命周期,此外它还做:
-
镜像的
pull
&push
-
管理
storage
-
运行容器的时候通过
runc
,并附带上合适的参数 -
管理网络
containerd
包含一个暴露 gRPC API 的 daemon 服务,这些 API 比较底层,为了被更好层调用,或者基于此做扩展。Docker 有很好的分层机制,containerd
不会直接被用户使用, 自己也是通过 runc
去运行容器。
containerd-architecture
containerd 拥有很强的适配性,其已是事实上的工业标准。containerd 通过 UNIX socket 对外暴露 gRPC API 。通过 containerd 的启动命令,可以很轻易的找到 sokcet 文件的具体位置。
$ ps aux | grep containerd
root 19513 0.0 4.9 634988 93836 ? Ssl 2020 0:20 /usr/bin/dockerd -H fd://
containerd-shim
containerd-shim 的存在使得 container 可以脱离 containerd 独立运行。(默认的,停掉 dockerd,container 也停止了,但可以通过 daemon.json
配置实现 dockerd 停掉后,container 照常运行。)
作为 container 的父进程,container-shim 主要负责如下职责:
-
使得 runc 运行完 container 后可以退出,无需为了一个 container 开启一个 runtime 常驻进程
-
保持容器的
stdio
开启状态,不至于容器写stdio
后收到SIGPIPE
而退出 -
把容器的 exit status 报告给 containerd
RunC
/usr/bin/docker-runc
可以视作 containerd
的一部分,它是一个运行遵从 OCI 标准容器的二进制工具。容器镜像通过 OCI 标准的格式打包,通常包括一个 config.json
文件和系统根目录。
$ 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
文件具体都记录了点什么呢?主要字段包括:
-
ociVersion
遵从的 OCI 版本 -
mounts
挂载信息 -
linux
需要做隔离的 namespace -
...
这些 docker 组件是如何协同工作的?
当我们启动 docker 后,dockerd
会默认拉起 containerd
$ 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
$ 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"
相关文章
- Docker的基本使用——常用docker命令
- 乌班图docker版本18.04升级到19.03[通俗易懂]
- docker在线或离线安装
- Docker部署_docker部署网站
- docker安装与配置nginx详细过程
- docker部署mysql的坏处_docker创建mysql数据库
- Docker 入门之网络
- Ubuntu 安装 Docker/Redmine/GitLab 教程
- Docker查看本地所有的镜像命令(docker images)
- Docker启动容器命令(docker start 容器名称)
- Docker关闭容器命令(docker stop)
- Docker打包优化
- 「 【Docker】如何处理宝塔docker管理器未启动 」
- 【Docker 系列】docker 学习 一,Docker的安装使用及Docker的基本工作原理
- 【Docker 系列】docker 学习 三
- 【Docker 系列】docker 学习十,Compose 编写规则及wp 实战
- Docker容器的四种网络模式
- 【云原生 • Docker】cAdvisor+Prometheus+Grafana 10分钟搞定Docker容器监控平台
- Docker容器的重启策略及docker run的–restart选项详解程序员
- 使用Docker容器更快搭建Redis服务(dockerredis)
- Docker 组件如何协作?- 每天5分钟玩转容器技术(8)
- 《Docker 教程》(二):Dockerfile
- 探索Docker安装Oracle数据库的秘密(docker安装oracle)