Appearance
整体架构
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 run、docker build 等命令时,就是在使用 Docker 客户端。
- 客户端通过 REST API 与 Docker 守护进程通信
- 可以通过 Unix Socket(本地)或 TCP(远程)连接
- 一个客户端可以连接多个 Docker 守护进程
bash
# 本地通信(通过 Unix Socket)
docker ps
# 远程通信(通过 TCP)
docker -H tcp://remote-host:2376 ps
# 查看 Docker 客户端版本
docker versionDocker Daemon(守护进程)
dockerd 是 Docker 的核心守护进程,监听 Docker API 请求,管理 Docker 对象(镜像、容器、网络、数据卷)。
- 以后台进程方式运行
- 管理容器的完整生命周期
- 可与其他 Docker 守护进程通信,形成 Swarm 集群
bash
# 查看 Docker 守护进程状态
systemctl status docker
# 启动/停止 Docker 服务
systemctl start docker
systemctl stop docker
# 查看守护进程配置
cat /etc/docker/daemon.jsonDocker 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 的架构体现了清晰的分层设计:
- Docker Client 负责接收用户命令,通过 API 发送给 Daemon
- Docker Daemon 是核心,管理所有 Docker 对象
- containerd + runc 实际执行容器的创建和运行
- Registry 提供镜像的存储和分发
- 网络和存储驱动 提供容器的网络连通性和数据持久化
理解这一架构有助于排查问题、优化配置和进行高级操作。下一节将介绍如何规划 Docker 的学习路线。