5.1 Docker 引擎-简介
Docker 引擎是用来运行和管理容器的核心软件.
Docker 引擎主要组件:
- Docker 客户端
- Docker 守护进程 (daemon)
- containerd
- runc
5.2 Docker 引擎-详解
Docker 首次发布时, Docker 引擎由 LXC, Docker daemon 组成.
5.2.1 摆脱 LXC
Libcontainer 取代 LXC.
5.2.2 摒弃大而全的 Docker daemon
- 模块化 Docker daemon
- UNIX 软件哲学: 小而专的工具可以组装为大型工具
目前 Docker 引擎的架构:
5.2.3 开放容器计划 (OCI) 的影响
OCI 定义两个容器相关的规范:
- 镜像规范
- 容器运行时规范
runc:
- 是 OCI 容器运行时标准的参考实现
- 所有的容器运行代码在一个单独的 OCI 兼容层 (runc) 中实现
containerd 组件确保 Docker 镜像能够以正确的 OCI Bundle 格式传递给 runc.
5.2.4 runc
runc 只用于创建容器.
5.2.5 containerd
用于容器的生命周期管理:
- start
- stop
- pause
- rm
- …
- 镜像管理
5.2.6 启动一个新的容器 (示例)
$ docker container run --name ctrl -it alpine:latest sh
运行步骤:
- Docker 客户端将命令转换为正确的 API, 并将 API 发送到 API 端点 (Docker daemon)
- Dockeer daemon 向 containerd 发出创建调用 (gRPC)
- containerd 将 image 转换为 OCI bundle, 并让 runc 基于此创建一个新容器
- runc 基于必要的工具 (Namespace, CGroup 等) 创建容器. 容器进程作为 runc 的子进程启动, 之后 runc 退出
5.2.7 该模型的显著优势
解耦.
5.2.8 shim
作用:
- 将容器运行时?与 daemon 解耦
- runc 退出后, shim 成为容器的父进程
- 保持 stdin 和 stdout 流为开启状态, 从而当 daemon 重启时, 容器不会因为管道 (pipe) 的关闭而终止 (daemon 和容器是分开的)
- 将容器的退出状态反馈给 daemon
5.2.9 在 Linux 中的实现
在 Linux 中运行的进程:
- dockerd (Docker daemon)
- docker-containerd (containerd)
- docker-containerd-shim (shim)
- docker-runc (runc)
5.2.10 daemon 的作用
目前:
- 镜像管理
- 镜像构建
- REST API
- 身份验证
- 安全
- 核心网络
- 编排