5.1 Docker 引擎-简介

Docker 引擎是用来运行和管理容器的核心软件.

Docker 引擎主要组件:

  • Docker 客户端
  • Docker 守护进程 (daemon)
  • containerd
  • runc

image.png

5.2 Docker 引擎-详解

Docker 首次发布时, Docker 引擎由 LXC, Docker daemon 组成.

image.png

5.2.1 摆脱 LXC

Libcontainer 取代 LXC.

5.2.2 摒弃大而全的 Docker daemon

  • 模块化 Docker daemon
  • UNIX 软件哲学: 小而专的工具可以组装为大型工具

目前 Docker 引擎的架构:

image.png

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 启动一个新的容器 (示例)

  1. $ docker container run --name ctrl -it alpine:latest sh

运行步骤:

  1. Docker 客户端将命令转换为正确的 API, 并将 API 发送到 API 端点 (Docker daemon)
  2. Dockeer daemon 向 containerd 发出创建调用 (gRPC)
  3. containerd 将 image 转换为 OCI bundle, 并让 runc 基于此创建一个新容器
  4. runc 基于必要的工具 (Namespace, CGroup 等) 创建容器. 容器进程作为 runc 的子进程启动, 之后 runc 退出

image.png

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
  • 身份验证
  • 安全
  • 核心网络
  • 编排

5.3 本章小结