当前位置: 首页 > news >正文

第二部分-Docker核心原理——06. Docker 架构深度解析

06. Docker 架构深度解析

1. Docker 整体架构

Docker 采用 C/S(客户端-服务器)架构,由 Docker Client、Docker Daemon、containerd、runc 等多个组件协同工作。

┌─────────────────────────────────────────────────────────────────────────┐ │ Docker 整体架构 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────┐ ┌─────────────────────────┐│ │ │ Docker Client │ │ Docker Registry ││ │ │ │ │ ││ │ │ ┌─────────────┐ │ REST API │ ┌───────────────────┐ ││ │ │ │ docker CLI │─┼───────────────────────▶│ │ Docker Hub │ ││ │ │ └─────────────┘ │ │ │ 私有仓库 │ ││ │ │ │ │ └───────────────────┘ ││ │ │ ┌─────────────┐ │ │ ││ │ │ │ REST API │ │ └─────────────────────────┘│ │ │ │ Client │─┼─────┐ │ │ │ └─────────────┘ │ │ │ │ └─────────────────┘ │ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ Docker Daemon (dockerd) │ │ │ │ ┌───────────────────────────────────────────────────────────┐ │ │ │ │ │ image management │ │ │ │ │ │ container management │ │ │ │ │ │ network management │ │ │ │ │ │ volume management │ │ │ │ │ └───────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ gRPC │ │ │ │ ▼ │ │ │ │ ┌───────────────────────────────────────────────────────────┐ │ │ │ │ │ containerd │ │ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ container lifecycle management │ │ │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ runc │ │ │ │ │ │ │ │ (OCI 运行时,实际创建容器进程) │ │ │ │ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ └───────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘

2. 各组件详解

2.1 Docker Client

Docker 客户端是与用户交互的入口,负责接收用户命令并传递给 Docker Daemon。

# 客户端常用操作# 默认连接方式:Unix Socket (/var/run/docker.sock)dockerversion# 查看客户端和服务器版本dockerinfo# 查看系统信息# 连接到远程 Dockerdocker-Htcp://192.168.1.100:2375psexportDOCKER_HOST=tcp://192.168.1.100:2375dockerps# 使用 SSH 连接docker-Hssh://user@remote-hostps# 客户端配置# ~/.docker/config.json{"auths":{},"HttpHeaders":{},"psFormat":"table {{.Names}}\t{{.Image}}","imagesFormat":"table {{.Repository}}\t{{.Tag}}"}

2.2 Docker Daemon (dockerd)

Docker 守护进程是 Docker 架构的核心,负责管理容器、镜像、网络、存储等资源。

# 查看守护进程状态systemctl statusdocker# 守护进程配置 /etc/docker/daemon.json{"debug":true,"log-level":"info","data-root":"/var/lib/docker","exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],"insecure-registries":["myregistry.com:5000"],"storage-driver":"overlay2","max-concurrent-downloads":10,"max-concurrent-uploads":5,"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"},"labels":["node=production"],"hosts":["unix:///var/run/docker.sock","tcp://0.0.0.0:2375"]}# 重启守护进程sudosystemctl daemon-reloadsudosystemctl restartdocker# 查看守护进程日志journalctl-fudocker.service

2.3 containerd

containerd 是容器运行时管理组件,负责容器的生命周期管理。

┌─────────────────────────────────────────────────────────────┐ │ containerd 架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ containerd │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ gRPC API │ │ Metrics │ │ │ │ │ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ │ │ │ ▼ ▼ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ Core Components │ │ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ │ │ Bundle │ │ Runtime │ │ Image │ │ │ │ │ │ │ │ Service │ │ Service │ │ Service │ │ │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ shim │ │ │ │ │ │ (每个容器一个 shim 进程) │ │ │ │ │ └─────────────────────┬───────────────────────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ │ │ runc │ │ │ │ │ │ (OCI 运行时创建容器) │ │ │ │ │ └─────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘
# 查看 containerd 状态systemctl status containerd# containerd 配置 /etc/containerd/config.toml# 生成默认配置containerd config default>config.toml# 使用 ctr 直接操作(调试用)ctr image pull docker.io/library/nginx:latest ctr imagelsctr container create docker.io/library/nginx:latesttesttrtask starttestctr tasklsctr taskkilltest

2.4 runc

runc 是 OCI 标准的容器运行时,负责实际创建和运行容器。

# runc 是低层工具,通常不直接使用# 查看 runc 版本runc--version# runc 容器运行时目录ls-la/run/containerd/io.containerd.runtime.v2.task/default/# 查看容器进程(可以看到 runc 启动的进程)psaux|grep-E"runc|containerd-shim"

3. 组件协作流程

3.1 容器启动流程

┌─────────────────────────────────────────────────────────────┐ │ 容器启动完整流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 用户 docker run 命令 │ │ │ │ │ ▼ │ │ Docker Client 解析命令 │ │ │ │ │ ▼ (HTTP/REST API) │ │ Docker Daemon 接收请求 │ │ │ │ │ ├──▶ 检查镜像是否存在 │ │ │ │ │ │ │ └──▶ 若不存在则从 Registry 拉取 │ │ │ │ │ ▼ │ │ 创建容器配置 │ │ │ │ │ ▼ (gRPC) │ │ containerd 接管 │ │ │ │ │ ├──▶ 创建 OCI Bundle (容器文件系统) │ │ ├──▶ 准备 rootfs │ │ └──▶ 创建容器目录 │ │ │ │ │ ▼ │ │ containerd-shim 启动 │ │ │ │ │ ▼ │ │ runc create (创建容器进程) │ │ │ │ │ ▼ │ │ runc start (启动容器) │ │ │ │ │ ▼ │ │ 容器运行中 │ │ │ └─────────────────────────────────────────────────────────────┘

3.2 容器停止流程

┌─────────────────────────────────────────────────────────────┐ │ 容器停止流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ docker stop │ │ │ │ │ ▼ │ │ Docker Daemon 收到停止请求 │ │ │ │ │ ├──▶ 发送 SIGTERM 信号给容器主进程 │ │ │ │ │ ├──▶ 等待 graceful 超时时间 (默认10秒) │ │ │ │ │ └──▶ 若未退出,发送 SIGKILL 强制杀死 │ │ │ │ │ ▼ │ │ containerd 通知 runc 停止容器 │ │ │ │ │ ▼ │ │ runc 杀死容器进程 │ │ │ │ │ ▼ │ │ containerd-shim 进程退出 │ │ │ │ │ ▼ │ │ 容器状态变为 Exited │ │ │ └─────────────────────────────────────────────────────────────┘

4. 进程模型

# 查看 Docker 相关进程psaux|grep-E"dockerd|containerd|runc|docker-proxy"# 进程关系示例# UID PID PPID COMMAND# root 1234 1 /usr/bin/dockerd# root 5678 1234 /usr/bin/containerd# root 9012 5678 /usr/bin/containerd-shim-runc-v2 -namespace moby -id container-id# root 3456 9012 /usr/bin/runc# root 7890 3456 nginx: master process# 查看容器对应的进程dockerinspect--format='{{.State.Pid}}'container_name# 通过宿主机 PID 查看容器进程ps-p<PID>-opid,comm,args# 进入容器的命名空间nsenter-t<PID>-nipaddr

5. 存储驱动

# 查看当前存储驱动dockerinfo|grep"Storage Driver"# 支持的存储驱动# - overlay2 (推荐,Linux 内核 4.0+)# - aufs (旧版 Ubuntu)# - devicemapper (CentOS/RHEL)# - overlay (被 overlay2 取代)# - btrfs, zfs, vfs# docker 数据目录结构ls-la/var/lib/docker/# ├── containers/ # 容器数据# ├── image/ # 镜像元数据# ├── network/ # 网络配置# ├── overlay2/ # 镜像层数据# ├── volumes/ # 数据卷# ├── builder/ # 构建缓存# └── tmp/ # 临时文件

6. 网络模型

# Docker 网络组件# docker-proxy: 负责端口映射dockerrun-d-p8080:80 nginx# 查看 docker-proxy 进程psaux|grepdocker-proxy# iptables 规则sudoiptables-tnat-L-n-v# 查看网桥dockernetworklsbrctl show docker0# 网络命名空间ls-la/var/run/docker/netns/# 进入容器的网络命名空间dockerinspect--format='{{.State.Pid}}'container_namesudonsenter-t<PID>-nipaddr

7. 性能优化配置

# /etc/docker/daemon.json 性能相关配置{# 使用 overlay2 驱动"storage-driver":"overlay2","storage-opts":["overlay2.override_kernel_check=true","overlay2.size=20G"],# 并发控制"max-concurrent-downloads":10,"max-concurrent-uploads":5,# 日志限制"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3","compress":"true"},# CPU 限制"cpu-rt-runtime":950000,"cpu-rt-period":1000000,# 实验性功能"experimental":true,"metrics-addr":"0.0.0.0:9323"}

8. 调试与监控

# 开启 debug 模式sudodockerd--debug# 查看守护进程状态dockersystem info# 查看守护进程事件dockersystem events# 查看磁盘使用dockersystemdf# 检查 API 版本dockerversion--format'{{.Server.APIVersion}}'# 获取 containerd 调试信息ctr version ctr imagelsctr containerls

9. 常见问题

Q1: dockerd 和 containerd 的区别?

  • dockerd:高层次的 Docker 守护进程,提供镜像管理、网络、卷等功能
  • containerd:低层次运行时,专注容器生命周期管理

Q2: 为什么需要 containerd-shim?

  • 让容器进程与 containerd 解耦
  • allow 容器退出时 containerd 可以重启
  • 保持 stdin/stdout 打开

Q3: runc 的作用?

  • OCI 规范的具体实现
  • 创建容器的实际执行者
  • 设置命名空间、Cgroups 等

10. 小结

  • C/S 架构:Client 通过 REST API 与 Daemon 通信
  • 核心组件:dockerd、containerd、containerd-shim、runc
  • containerd 管理:镜像、容器生命周期、存储、网络
  • runc:OCI 运行时,实际创建容器
  • 进程模型:dockerd → containerd → shim → runc → 容器进程
  • 存储驱动:默认使用 overlay2

http://www.jsqmd.com/news/767589/

相关文章:

  • MCP工具链兼容性检查与安全防护:mcp-lint工具全解析
  • 把Linux U盘当成本地盘:WSL2自编译内核挂载Btrfs/Ext4设备详解与性能测试
  • 怎么配合 CI/CD 流水线自动部署 Docker Compose 项目
  • 从‘哲学家就餐’到你的代码:用semaphore解决Linux多进程同步的经典思路
  • 暗黑2重制版像素级自动化:Botty深度解析与实战配置指南
  • 构建自我迭代的代码生成器:从自动化评估到智能优化闭环
  • 别再问项目了!这5个嵌入式开源宝藏,新手到高手都能用(附实战代码)
  • FreeSWITCH与ChatGPT集成:构建智能语音交互系统的实践指南
  • 别再死磕期刊论文!Paperxie 这个「一键投稿级」写作功能,我不允许还有人不知道
  • EPLAN拼柜实战:如何像搭积木一样,用快捷键快速组合多个机柜模型
  • 2026年4月做得好的云母片工厂推荐,水位计云母片/云母垫片/云母片/天然云母片,云母片公司有哪些 - 品牌推荐师
  • 容器日志安全不出境,审计留痕可追溯,Docker 27国产化配置清单来了,你漏了哪3项等保硬性要求?
  • AI编程工具精选清单:从代码补全到工程化实践的全方位指南
  • 智能音箱开发实战(二):EVT 阶段——从“点亮”到“调通”的信号排雷
  • Translumo:5分钟掌握免费实时屏幕翻译,打破语言障碍的完整指南
  • 多智能体任务编排引擎:从原理到实践,构建自动化协作系统
  • 告别重新编译!WRF运行时动态添加输出变量的保姆级教程(附Registry查找技巧)
  • 2026年江苏机动车检测公司最新TOP排行 - 品牌策略师
  • T1/E1传输脉冲控制技术与DS26334/DS26324芯片应用
  • 智能体服务集群架构设计:从单体应用到AI原生系统的工程实践
  • day40-数据结构力扣
  • 效率提升指南:借助快马AI为现有React Native项目精准配置Hermes引擎
  • N_m3u8DL-CLI-SimpleG:3分钟搞定M3U8视频下载的终极图形界面指南
  • WPOpenClaw:构建离线AI研究环境,实现数据主权与本地化部署
  • MDB Tools深度实战:如何在Linux和macOS上高效操作Access数据库的完整解决方案
  • 别再只用真彩色了!手把手教你用ENVI主成分分析(PCA)给遥感图像‘美颜’与‘瘦身’
  • 基于MCP协议与视觉理解的AI Agent网页自动化实战
  • 2026年质量好的不锈钢铸件优质厂家汇总推荐 - 行业平台推荐
  • 基于X推荐算法的爆款内容预测工具:原理、部署与优化实战
  • 别再只会看控制台了!用Docker+SEQ给你的.NET Core应用装个‘日志黑匣子’