0
点赞
收藏
分享

微信扫一扫

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

Docker 引擎

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

​​https://blog.51cto.com/u_15485663/6117903​​​

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

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

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

​​​https://www.bilibili.com/video/BV1sb411X7​​​

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。


举报

相关推荐

0 条评论