Skip to content

整体架构

Docker 架构概览

Docker 采用客户端-服务端(C/S)架构,主要由以下组件构成:

┌─────────────────────────────────────────────────────┐
│                   Docker Client                      │
│           docker build / pull / run                  │
└──────────────────────┬──────────────────────────────┘
                       │ REST API / Unix Socket
┌──────────────────────▼──────────────────────────────┐
│                  Docker Host                         │
│  ┌─────────────────────────────────────────────┐    │
│  │              Docker Daemon (dockerd)         │    │
│  │                                             │    │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  │    │
│  │  │Container │  │Container │  │Container │  │    │
│  │  └──────────┘  └──────────┘  └──────────┘  │    │
│  │                                             │    │
│  │  ┌──────────┐  ┌──────────┐                 │    │
│  │  │  Image   │  │  Image   │                 │    │
│  │  └──────────┘  └──────────┘                 │    │
│  └─────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────┘

┌──────────────────────▼──────────────────────────────┐
│                Docker Registry                       │
│          Docker Hub / 私有仓库                        │
└─────────────────────────────────────────────────────┘

核心组件

Docker Client(客户端)

Docker 客户端是用户与 Docker 交互的主要方式。当你运行 docker rundocker build 等命令时,就是在使用 Docker 客户端。

  • 客户端通过 REST API 与 Docker 守护进程通信
  • 可以通过 Unix Socket(本地)或 TCP(远程)连接
  • 一个客户端可以连接多个 Docker 守护进程
bash
# 本地通信(通过 Unix Socket)
docker ps

# 远程通信(通过 TCP)
docker -H tcp://remote-host:2376 ps

# 查看 Docker 客户端版本
docker version

Docker Daemon(守护进程)

dockerd 是 Docker 的核心守护进程,监听 Docker API 请求,管理 Docker 对象(镜像、容器、网络、数据卷)。

  • 以后台进程方式运行
  • 管理容器的完整生命周期
  • 可与其他 Docker 守护进程通信,形成 Swarm 集群
bash
# 查看 Docker 守护进程状态
systemctl status docker

# 启动/停止 Docker 服务
systemctl start docker
systemctl stop docker

# 查看守护进程配置
cat /etc/docker/daemon.json

Docker Registry(镜像仓库)

镜像仓库用于存储 Docker 镜像,Docker 守护进程从仓库拉取镜像或推送镜像到仓库。

  • 公共仓库:Docker Hub(默认)
  • 私有仓库:企业内部搭建,如 Harbor
  • 云仓库:各大云厂商提供的托管服务

containerd

containerd 是工业级容器运行时,Docker 守护进程底层使用 containerd 来管理容器生命周期。

  • 负责镜像的拉取和存储
  • 管理容器的执行和监控
  • 已成为 CNCF 毕业项目,被 Kubernetes 等直接使用

runc

runc 是 OCI(Open Container Initiative)标准的轻量级容器运行时,负责真正地创建和运行容器进程。

Docker Client

Docker Daemon (dockerd)

containerd

containerd-shim

runc(创建容器进程)

Docker 网络架构

Docker 提供多种网络模式,用于控制容器间及容器与外部的通信:

┌─────────────────────────────────────────┐
│              Docker Host                │
│                                         │
│  ┌─────────┐    ┌─────────┐             │
│  │Container│    │Container│             │
│  │  eth0   │    │  eth0   │             │
│  └────┬────┘    └────┬────┘             │
│       │              │                  │
│  ┌────▼──────────────▼────┐             │
│  │     docker0 (bridge)   │             │
│  └────────────┬───────────┘             │
│               │                         │
│  ┌────────────▼───────────┐             │
│  │       iptables         │             │
│  └────────────┬───────────┘             │
└───────────────┼─────────────────────────┘

           外部网络

网络驱动类型

驱动说明
bridge默认网络,容器间通过虚拟网桥通信
host容器直接使用宿主机网络
none容器没有网络接口
overlay跨主机容器通信,用于 Swarm
macvlan容器获得真实 MAC 地址,直接接入物理网络

Docker 存储架构

存储驱动(Storage Driver)

Docker 使用存储驱动实现镜像分层和写时复制(Copy-on-Write):

  • overlay2:推荐使用,现代 Linux 内核的默认驱动
  • aufs:较旧的驱动,Ubuntu 早期默认
  • devicemapper:基于 LVM,适用于 RHEL/CentOS
  • btrfs / zfs:基于特定文件系统

数据持久化

容器的可写层随容器删除而消失,持久化数据需要使用:

┌─────────────────────────────────────┐
│           Docker Host               │
│                                     │
│  ┌─────────────┐                    │
│  │  Container  │                    │
│  │  ┌────────┐ │    ┌────────────┐  │
│  │  │ /data  ├─┼────│   Volume   │  │
│  │  └────────┘ │    └────────────┘  │
│  └─────────────┘                    │
│                                     │
│  /host/path ←── Bind Mount          │
└─────────────────────────────────────┘
  • Volume(数据卷):由 Docker 管理,存储在 /var/lib/docker/volumes/
  • Bind Mount(绑定挂载):将宿主机目录挂载到容器内
  • tmpfs Mount:仅存在于内存中,容器停止即消失

查看 Docker 系统信息

bash
# 查看 Docker 详细信息
docker info

# 查看 Docker 版本
docker version

# 查看磁盘使用情况
docker system df

# 查看系统事件
docker system events

总结

Docker 的架构体现了清晰的分层设计:

  1. Docker Client 负责接收用户命令,通过 API 发送给 Daemon
  2. Docker Daemon 是核心,管理所有 Docker 对象
  3. containerd + runc 实际执行容器的创建和运行
  4. Registry 提供镜像的存储和分发
  5. 网络和存储驱动 提供容器的网络连通性和数据持久化

理解这一架构有助于排查问题、优化配置和进行高级操作。下一节将介绍如何规划 Docker 的学习路线。