0
点赞
收藏
分享

微信扫一扫

【Docker深入浅出】Docker引擎架构介绍

一条咸鱼的干货 2024-08-19 阅读 27

文章目录

一. docker引擎介绍

docker基于OCI的开放标准,引擎采用模块化设计

 

Docker引擎的组成

Docker引擎由如下主要的组件构成:Docker客户端(Docker Client)​、Docker守护进程(Docker daemon)​、containerd以及runc。它们共同负责容器的创建和运行。如下图:

在这里插入图片描述

 

1. Docker daemon:实现Docker API,通过API管理容器

Docker daemon:

Docker API 的作用包括:
1. 容器管理
创建和启动容器:通过 API,可以程序化地创建新的容器并启动它们。例如,
通过 POST /containers/create 和 POST /containers/(id or name)/start。
停止和删除容器:可以通过 POST /containers/(id or name)/stop 停止容器,
通过 DELETE /containers/(id or name) 删除容器。

2. 镜像管理
拉取和推送镜像:可以使用 API 拉取新的镜像(POST /images/create)或将镜像推送到 Docker 仓库(POST /images/(name)/push)。
列出和删除镜像:通过 GET /images/json 列出本地镜像,通过 DELETE /images/(name) 删除镜像。

3. 网络管理
创建和删除网络:可以通过 API 创建新的网络(POST /networks/create)或删除现有网络(DELETE /networks/(id))。
管理网络设置:可以查看网络配置和连接状态(GET /networks/(id))。

4. 卷管理
创建和删除卷:通过 API 可以创建新的数据卷(POST /volumes/create)或删除现有卷(DELETE /volumes/(name))。
查看卷信息:可以获取卷的详细信息(GET /volumes/(name))。

5. 日志和监控
获取容器日志:可以获取特定容器的日志输出(GET /containers/(id or name)/logs),帮助调试和监控容器运行状态。
查看容器状态:通过 GET /containers/(id or name)/json 获取容器的详细状态信息。

6. 系统信息
查看 Docker 版本:通过 GET /version 获取 Docker 引擎的版本信息。
获取系统统计信息:通过 GET /system/df 获取 Docker 使用的磁盘空间统计信息。

7. 安全性和权限
管理访问权限:API 可以用于设置和管理 Docker 引擎的访问权限,控制不同用户或应用的操作权限。


8. 自动化和集成
与 CI/CD 工具集成:Docker API 允许在持续集成和持续部署(CI/CD)流程中自动化容器的构建、测试和部署。
自定义管理工具:开发者可以使用 Docker API 创建自定义的管理界面或工具,以满足特定的业务需求。

 

使用场景

 

2. containerd:负责容器的生命周期

containerd 是 Docker 的一个核心组件,主要用于容器的运行时管理。它负责以下几个方面:

3. runc:用于创建和启动容器

runc是OCI容器运行时规范的参考实现,它使用与OCI兼容的bundle(2?)来启动容器。runc生来只有一个作用——创建容器!

Docker使用runc作为其默认的容器运行时

 

二. 启动容器的过程

下面的docker container run命令会基于alpine:latest镜像启动一个新容器。

$ docker container run --name ctr1 -it alpine:latest sh

1. 启动过程

当使用Docker命令行工具执行如上命令时,

现在,容器启动完毕了。如下图容器启动过程:

 

在这里插入图片描述

 

2. docker daemon的维护不会影响到运行中的容器

为什么对于docker daemon的维护和升级不会影响到运行中的容器

在旧模型中,所有容器运行时的逻辑都在daemon中实现,启动和停止daemon会导致宿主机上所有运行中的容器被杀掉。这在生产环境中是一个大问题——想一想新版Docker的发布频次吧!每次daemon的升级都会杀掉宿主机上所有的容器。

 

3. shim:让容器独立于docker daemon

上图展示了shim组件。shim是将运行中的容器与daemon解耦(,以便daemon进行升级等操作)不可或缺的工具。

containerd指挥runc来创建新容器。事实上,每次创建容器时它都会fork一个新的runc实例。不过,一旦容器创建完毕,对应的runc进程就会退出。因此,即使运行上百个容器,也无须保持上百个运行中的runc实例。

 
一旦runc退出,相关联的containerd-shim进程就会成为容器的父进程。作为容器的父进程,shim用于管理容器与容器运行时之间的通信。它主要承担以下功能:

在 Docker 中,shim 的作用是让容器进程独立于 Docker 守护进程,使得容器可以更稳定地运行,同时也提供了更好的隔离和资源管理。

 

 

举报

相关推荐

0 条评论