从0到1入门Docker(五)Docker引擎

218 阅读3分钟

Docker 引擎

上篇文章做了一个总结,今天这篇文章来说一下Docker 引擎

从0到1入门Docker(四)总结 - 掘金 (juejin.cn)

学习Docker推荐大家可以看动力哥的视频,课程适合零基础、技术提升乃至所有编程语言开发者;课程对应包含含基础篇、提升篇与高级篇,共计十二大章节。

课程主要学习知识点:“7个深度/3个全面”;针对Docker的知识体系,无需再查找任何其它资料。

课程中的源码、资料、工具、文档、作业分享给大家

www.bilibili.com/video/BV1sb…

Docker 引擎发展历程

1.  首发版本架构

Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker

Daemon。

不过,该架构依赖于 LXC,使得 Docker 存在严重的问题:

  1. 依赖于外部工具,对 Docker 来说,存在着巨大的生存风险

  2. LXC 使得 Docker 无法实现跨平台

Docker Daemon 的“大而全”也带来了严重的问题:

  1. 版本更新与功能扩展较难

  2. 运行较慢,带来性能问题

  3. Docker Daemon 运行出现问题,会直接影响容器的运行

  4. 不符合软件哲学

2. Docker0.9 版本架构

从 Docker0.8 版本开始,Docker 使用自研的 Libcontainer 工具替换了 LXC。

3. Docker1.1 版本架构

2017 年 7 月 OCI 基金会发布了两个规范(镜像规范与容器运行时规范)的 OCI1.0 版本。

2016 年底发布的 Docker1.1 版本基本遵循了 OCI1.0 版本。

从 Docker1.1 版本开始,Docker Daemon 中不再包含任何容器运行时代码,而是将容器

运行时单独剥离了出来,形成了 Runc 项目。

4. Docker 引擎架构

Docker 引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成:

Docker Client,Dockerd、Containerd 与 Runc。

4.1  Docker Client

Docker 客户端,Docker 引擎提供的 CLI 工具,用于用户向 Docker 提交命令请求。

4.2 Dockerd

Dockerd,即 Docker Daemon。在现代 Dockerd 中的主要包含的功能有镜像构建、镜像管

理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信。

4.3 Containerd

Containerd,即 Container Daemon,该项目的主要功能是管理容器的生命周期。不过,

其本身并不会去创建容器,而是调用 Runc 来完成容器的创建。

Docker 公司后来将 Containerd 项目捐献给了 CNCF(云原生基金会)。

4.4 Runc

Runc,Run Container,是 OCI(开放容器倡议基金会)容器运行时规范的实现,Runc 项

目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 Docker

Daemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。

Runc 只有一个作用—创建容器,其本质是一个独立的容器运行时 CLI 工具。其在 fork

出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。

5. Shim

Shim(垫片)是实现“Daemonless Container(无 Docker Daemon 与 Container Daemon

容器)”不可或缺的工具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。

每次创建容器时,Containerd 同时会 fork 出 Runc 进程与 Shim 进程。当 Runc 自动退出

之前,会先将新容器进程的父进程指定为相应的 Shim 进程。

除了作为容器的父进程外,Shim 进程还具有两个重要功能:

(1)保持所有 STDIN 与 STDOUT 流的开启状态,从而使得当 Docker Daemon 重启时,容器不会因为 Pipe 的关闭而终止。

(2)将容器的退出状态反馈给 Docker Daemon。