1. Docker 基础回顾:架构、核心组件与企业部署规范
1.1 Docker 整体架构
Docker 采用典型的 C/S(Client-Server) 架构。客户端通过 REST API 与守护进程通信,守护进程负责管理镜像、容器、网络与存储卷。理解这一分层是排查一切 Docker 故障的前提。
架构要点: 客户端(docker CLI / API)→ Docker Host(dockerd)→ containerd → runc。生产环境中任何一层出现异常,都会导致容器编排或业务中断。
1.2 三大核心组件:镜像、容器、仓库
| 组件 | 定义 | 企业级关键特性 | 常见故障点 |
|---|---|---|---|
| 镜像(Image) | 只读模板,包含应用及其依赖 | 分层构建、不可变性、签名验证 | 层过多导致构建慢;基础镜像漏洞 |
| 容器(Container) | 镜像的运行实例,可读写层 | 资源隔离(cgroups/namespace)、健康检查 | OOM、磁盘写满、僵尸进程 |
| 仓库(Registry) | 镜像存储与分发中心 | 私有仓库(Harbor)、镜像同步、GC | 磁盘空间不足、认证失败、推送超时 |
排查提示: 当容器启动失败时,优先检查镜像是否存在(
docker images)、仓库是否可达(docker pull)、容器日志(docker logs)。这三步覆盖 80% 的启动故障。
1.3 Docker 与虚拟机的核心区别
Docker 容器共享宿主机内核,而虚拟机包含完整 Guest OS。这一差异决定了资源效率、启动速度和隔离级别的不同。
| 对比维度 | Docker 容器 | 虚拟机(VM) |
|---|---|---|
| 内核 | 共享宿主机内核 | 独立 Guest OS 内核 |
| 启动时间 | 毫秒级 | 秒级到分钟级 |
| 资源开销 | 仅进程级隔离,轻量 | 完整 OS 开销,较重 |
| 隔离级别 | 进程/文件系统隔离(namespace) | 硬件级虚拟化(Hypervisor) |
| 适用场景 | 微服务、CI/CD、弹性伸缩 | 多租户强隔离、不同内核需求 |
⚠️ 企业避坑: 不要在容器内运行 systemd 或直接管理内核参数。容器共享宿主机内核,修改内核参数会影响宿主机及其他容器。必须调整时,使用
sysctl 或 security_context 限制。
1.4 企业级 Docker 环境部署规范
生产环境部署 Docker 必须遵循标准化规范,否则会引发权限、网络、存储等连锁故障。以下是经过验证的部署清单:
- 操作系统选型: 推荐 Ubuntu 20.04+/CentOS 7.9+ / Rocky Linux 8+,内核版本 ≥ 4.18。
- Docker 版本: 使用官方稳定版(CE/EE),锁定版本号,避免自动升级。
- 存储驱动: 优先使用
overlay2,避免devicemapper的 loop-lvm 模式。 - 数据目录分离: 将
/var/lib/docker挂载到独立磁盘或 LVM 卷,防止根分区写满。 - 日志策略: 配置
log-driver: json-file+max-size: 10m+max-file: 3,防止日志撑爆磁盘。 - 网络规划: 使用
bridge或overlay网络,避免--net=host滥用。 - 安全加固: 启用
userns-remap、限制--privileged、配置镜像签名验证。 - 监控与告警: 部署 cAdvisor / Prometheus 采集容器指标,设置磁盘、CPU、内存告警阈值。
1.5 企业级 daemon.json 配置示例
以下配置适用于生产环境,直接写入 /etc/docker/daemon.json 并重启 dockerd:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"data-root": "/data/docker",
"live-restore": true,
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 3,
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"insecure-registries": [],
"userns-remap": "default"
}
关键参数说明:
•
•
•
•
live-restore: true — dockerd 重启时保持容器运行,减少业务中断。•
userns-remap: default — 启用用户命名空间重映射,提升容器逃逸防护。•
data-root — 必须指向独立磁盘分区,避免根分区写满导致宿主机异常。
1.6 常见部署错误与快速排查
| 错误现象 | 根因 | 快速修复 |
|---|---|---|
docker: Error response from daemon: cgroups: cannot find cgroup mount destination |
cgroup v2 未正确挂载或内核参数缺失 | 检查 /sys/fs/cgroup 挂载状态,升级 systemd 至 244+ |
failed to start daemon: error initializing graphdriver: driver not supported |
存储驱动与内核不匹配 | 确认内核支持 overlay2,执行 modprobe overlay |
No space left on device 但 df 显示有空间 |
inode 耗尽或 overlay2 元数据占满 | df -i 检查 inode,清理无用镜像/容器 |
docker pull 超时或失败 |
仓库不可达、DNS 解析失败、镜像过大 | 配置 registry-mirrors,检查网络连通性 |
最佳实践: 每次修改 daemon.json 后,先执行
dockerd --validate 或 docker info 验证配置,再重启服务。避免因配置错误导致整个 Docker 服务不可用。