分享
  1. 首页
  2. 文章

【13章】Go + AI 从0到1开发 Docker 引擎

dffghhg · · 227 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

获课:itazs.fun/16995/ 一、 现代 Docker 引擎架构概览 首先,要理解现代 Docker 引擎不再是单一的二进制文件,而是一个由多个组件构成的生态系统,遵循了 OCI(Open Container Initiative) 标准。 text +-----------------------------------+ +------------------------+ | Docker Client | | containerd-shim |<--(容器进程) | (docker CLI, docker-compose, etc.)| | (每个容器一个) | +-----------------------------------+ +------------------------+ | ^ | (通过 gRPC over UNIX Socket) | (管理容器生命周期) v | +-----------------------------------+ +------------------------+ | dockerd (Docker Daemon) | | containerd | | (API Server, Image Management, | |(核心容器运行时管理器) | | Network, Volumes, Orchestration) | +------------------------+ +-----------------------------------+ ^ | | (通过 runC 操作) | (管理高阶功能) v | +------------------------+ +---------------------->| runC | | (低层次运行时工具) | +------------------------+ 二、 核心模块详解 1. Docker Client (docker) 职责:用户与 Docker 引擎交互的主要命令行界面(CLI)。 功能: 接收用户命令(如 docker run, docker build)。 解析命令和参数。 通过 Docker API 与 dockerd 守护进程通信(通常是本地的 UNIX Socket /var/run/docker.sock 或远程的 TCP 端口)。 接收并格式化 dockerd 返回的结果,展示给用户。 2. Docker Daemon (dockerd) 职责: Docker 引擎的大脑,常驻后台的守护进程,提供完整的容器生命周期管理。 核心子模块: API Server:暴露 RESTful API 端点,接收来自 Client 或其他工具的请求。这是所有操作的入口。 Image Manager:负责镜像的拉取(Pull)、推送(Push)、构建(Build)、存储和管理。它与存储驱动(Storage Driver) 交互来管理镜像的分层文件系统。 Volume Manager:管理数据卷的生命周期,提供与容器无关的数据持久化存储。与卷驱动(Volume Driver) 交互,支持本地、NFS、云存储等多种后端。 Network Manager:管理容器网络的生命周期(创建、删除、连接)。与网络驱动(Network Driver) 交互,支持 bridge、overlay、macvlan 等多种网络模式。 Orchestration:内置了 Swarm 模式,用于管理容器集群(服务、栈、任务等)。 3. containerd 职责:一个行业标准的核心容器运行时。Docker 将其容器生命周期管理功能剥离出来,形成了 containerd。它更轻量、更专注,现已成为 Kubernetes 等平台的默认容器运行时。 功能: 镜像的传输、存储和管理。 容器的执行和监控(通过 runc)。 存储和网络附加功能的低级接口。 通过 gRPC API 向上层(如 dockerd)提供服务。dockerd 现在更像一个功能丰富的"客户端",而 containerd 是执行引擎。 4. runC 职责:一个轻量级的、符合 OCI 运行时规范 的命令行工具。它是真正创建和运行容器的组件。 功能: 根据 OCI 容器配置规范(config.json) 文件来创建容器。 利用 Linux 内核特性(Namespaces、Cgroups、Capabilities)来生成一个隔离的进程环境。 它本身是一个短命的进程,创建完容器后就会退出。 5. containerd-shim 职责:一个巧妙的设计,用于实现无守护进程的容器(daemonless containers),是 containerd 架构中的关键一环。 为什么需要它? 保持 IO 流:当 containerd 或 dockerd 重启时,shim 可以保证容器的 stdin/stdout/stderr 不会中断,日志也不会丢失。 维护退出状态:shim 会在容器退出后继续存在,收集其退出状态、退出码等信息,并向上汇报,确保不会出现"僵尸"容器。 解耦:它将容器进程与 containerd 守护进程完全解耦,允许升级或重启 containerd 而不影响正在运行的容器。 6. 底层驱动(Drivers) 这些是 dockerd 和 containerd 实现具体功能的插件式模块。 存储驱动(Storage Driver):如 overlay2、aufs、devicemapper。负责实现镜像的分层(Layer)和联合文件系统(Union FS),以及容器可写层的管理。overlay2 是目前推荐的首选。 网络驱动(Network Driver):如 bridge、overlay、host、macvlan。负责实现容器的网络连接、隔离和端口映射等功能。 卷驱动(Volume Driver):如 local、nfs、cifs 以及各种云存储商的驱动(如 azurefile)。负责对接外部存储系统。 7. 容器镜像与 OCI 标准 OCI 镜像规范:定义了容器镜像的格式(Manifest、Layer、Config)。Docker 镜像本质上是一个符合 OCI 规范的压缩包。 OCI 运行时规范:定义了如何运行一个"文件系统包"(即镜像)。runc 是该规范的一个参考实现。 三、 模块间协作流程(以docker run nginx为例) Client:用户输入 docker run nginx,CLI 解析命令并通过 API 发送给 dockerd。 dockerd: API Server 接收请求。 Image Manager 检查本地是否有 nginx 镜像,若无则从仓库拉取。 准备容器的配置(网络、卷、环境变量等)。 containerd:dockerd 通过 gRPC 调用 containerd,告知其要创建一个容器。 runc:containerd 调用 runc 命令,并传递根据 OCI 规范生成的 config.json 文件。 runc:runc 使用 Linux 系统调用(clone, setns等)创建新的 Namespace 和 Cgroups,并在这个隔离环境中启动容器进程(如 nginx)。 containerd-shim:runc 退出后,containerd 会启动一个 containerd-shim 进程来接管容器进程。从此,容器进程的父进程是 shim,由 shim 负责其生命周期并与 containerd 通信。 资源管理:整个过程中,Network Manager 和 Volume Manager 会调用相应的驱动来设置容器的网络和存储。 总结 Docker 引擎的核心模块设计体现了关注点分离和模块化的软件工程思想: docker:用户界面。 dockerd:高阶功能聚合器(API、镜像、网络、卷)。 containerd:核心容器生命周期管理(行业标准)。 runc:低层运行时工具(符合 OCI 标准)。 containerd-shim:实现稳定性和解耦的"胶水"组件。 各种驱动:提供插件式的扩展能力。 这种架构使得 Docker 生态系统更加健壮、灵活,也促进了容器技术的标准化和普及(例如 containerd 被 Kubernetes 直接采用)。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
227 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏