首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
【Docker深入浅出】【一】Docker引擎架构介绍
📅 2026/11/3 9:14:48
✍️ 爱科研究院
👁 阅读 3,247
文章目录一. docker引擎介绍1. Docker daemon实现Docker API通过API管理容器2. containerd负责容器的生命周期3. runc用于创建和启动容器二. 启动容器的过程1. 启动过程2. docker daemon的维护不会影响到运行中的容器3. shim让容器独立于docker daemon一. docker引擎介绍docker基于OCI的开放标准引擎采用模块化设计。OCI 规范定义了容器镜像的格式使得不同的工具和平台能够创建、分享和运行容器镜像而不受限于特定的实现。兼容 OCI 镜像格式的系统可以使用标准化的镜像文件进行容器部署。OCI 还定义了容器运行时的规范确保容器能够在任何支持 OCI 运行时规范的环境中启动和运行。这使得容器的运行不依赖于特定的实现或平台。Docker引擎的组成Docker引擎由如下主要的组件构成Docker客户端Docker Client、Docker守护进程Docker daemon、containerd以及runc。它们共同负责容器的创建和运行。如下图1. Docker daemon实现Docker API通过API管理容器Docker daemonDocker daemon实现了Docker APIDocker API 是 Docker 提供的应用编程接口允许开发者通过编程方式与 Docker 引擎进行交互。Docker daemon中的功能包括但不限于API、镜像管理、身份认证、安全特性、核心网络以及卷。daemon使用一种CRUD风格的API通过gRPC与containerd进行通信。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 创建自定义的管理界面或工具以满足特定的业务需求。使用场景自动化管理通过 API 可以编写脚本或程序自动化容器的创建、启动、停止等操作。集成和扩展将 Docker 功能集成到现有的应用程序或系统中比如在云平台、监控工具或开发环境中。自定义应用构建自定义的用户界面或控制面板提供更符合业务需求的容器管理功能。2. containerd负责容器的生命周期containerd 是 Docker 的一个核心组件主要用于容器的运行时管理。它负责以下几个方面容器生命周期管理启动、停止、删除容器。容器镜像管理拉取、存储和管理容器镜像。资源管理管理容器的资源分配和限制。日志管理处理容器的日志输出。3. runc用于创建和启动容器runc是OCI容器运行时规范的参考实现它使用与OCI兼容的bundle2来启动容器。runc生来只有一个作用——创建容器Docker使用runc作为其默认的容器运行时containerd调用runc并确保Docker镜像以OCI bundle的格式交给runc。runc可以作为独立的CLI工具来创建容器。它基于Libcontainer3也可被其他项目或第三方工具使用。二. 启动容器的过程下面的docker container run命令会基于alpine:latest镜像启动一个新容器。$ docker container run--name ctr1-it alpine:latest sh1. 启动过程当使用Docker命令行工具执行如上命令时Docker客户端会将其转换为合适的API格式并发送到正确的API端点(3?)。一旦daemon接收到创建新容器的命令它就会向containerd发出调用。daemon已经不再包含任何创建容器的代码了。containerd指导runc启动容器containerd不负责创建容器而是指挥runc去做。containerd将Docker镜像转换为OCI bundle并让runc基于此创建一个新的容器。runc与操作系统内核接口进行通信基于所有必要的工具Namespace、CGroup等来创建容器。容器进程作为runc的子进程启动启动完毕后runc将会退出。现在容器启动完毕了。如下图容器启动过程2. docker daemon的维护不会影响到运行中的容器为什么对于docker daemon的维护和升级不会影响到运行中的容器因为Docker将所有的用于启动、管理容器的逻辑和代码从daemon中移除意味着容器运行时与Docker daemon是解耦的有时称之为“无守护进程的容器daemonless container”所以对Docker daemon的维护和升级工作不会影响到运行中的容器。在旧模型中所有容器运行时的逻辑都在daemon中实现启动和停止daemon会导致宿主机上所有运行中的容器被杀掉。这在生产环境中是一个大问题——想一想新版Docker的发布频次吧每次daemon的升级都会杀掉宿主机上所有的容器。3. shim让容器独立于docker daemon上图展示了shim组件。shim是将运行中的容器与daemon解耦以便daemon进行升级等操作不可或缺的工具。containerd指挥runc来创建新容器。事实上每次创建容器时它都会fork一个新的runc实例。不过一旦容器创建完毕对应的runc进程就会退出。因此即使运行上百个容器也无须保持上百个运行中的runc实例。一旦runc退出相关联的containerd-shim进程就会成为容器的父进程。作为容器的父进程shim用于管理容器与容器运行时之间的通信。它主要承担以下功能保持所有STDIN和STDOUT流是开启状态从而当daemon重启的时候容器不会因为管道pipe的关闭而终止容器进程管理shim 负责启动和管理容器内的主进程并确保容器进程在后台正确运行。日志转发将容器的标准输出和错误日志转发到 Docker 引擎或日志系统。容器终止处理处理容器的正常或异常退出并将退出状态报告给 daemon。生命周期管理支持容器的启动、停止、重启等操作确保容器生命周期的正常管理。在 Docker 中shim 的作用是让容器进程独立于 Docker 守护进程使得容器可以更稳定地运行同时也提供了更好的隔离和资源管理。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/11/3 9:14:48
如何用BFS-Best-Face-Swap实现完美换脸:从基础到高级的完整指南
2026/11/3 9:14:48
【Docker深入浅出】【四】单体应用容器化与Dockerfile怎么写
2026/11/3 9:14:47
解决LTX-Best-Face-ID常见问题:从安装错误到人脸模糊的完整解决方案
2026/11/3 12:36:21
失败是数据:工具运行时的失败采集与可观测性实践
2026/11/3 12:36:21
高等数学教案落地:极限与连续教学动作、板书与课时设计
2026/11/3 12:36:21
LLM可观测性中间件:hindsight实现API调用实时诊断
2026/11/3 12:36:21
多人填Excel:从文件互传切换到共享实时共编
2026/11/3 12:36:21
RabbitMQ交换机类型详解与性能优化实践
2026/11/3 12:31:20
构建可追溯的工程认知:hindsight捕获系统实战
2026/11/3 0:03:28
淘宝商品详情API开发实战与性能优化指南
2026/11/3 0:03:28
Unity Package Manager刷新错误排查与解决方案
2026/11/3 0:03:28
Java record 规范构造器能否被反序列化或反射绕过
2026/11/3 4:05:41
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/3 4:05:35
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/3 4:05:30
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析
2026/11/3 4:05:41
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/3 4:05:35
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/3 4:05:30
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析