1. Docker 基础回顾:架构、核心组件与企业部署规范

1.1 Docker 整体架构

Docker 采用典型的 C/S(Client-Server) 架构。客户端通过 REST API 与守护进程通信,守护进程负责管理镜像、容器、网络与存储卷。理解这一分层是排查一切 Docker 故障的前提。

架构要点: 客户端(docker CLI / API)→ Docker Host(dockerd)→ containerd → runc。生产环境中任何一层出现异常,都会导致容器编排或业务中断。
Docker 核心架构图 Docker Client docker build / run / ps REST API Docker Host dockerd 守护进程 containerd 容器生命周期管理 runc OCI 运行时 Registry Docker Hub / Harbor 容器 / 镜像 UnionFS / 层 🔍 故障排查入口:Client 超时 → 检查 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 必须遵循标准化规范,否则会引发权限、网络、存储等连锁故障。以下是经过验证的部署清单:

  1. 操作系统选型: 推荐 Ubuntu 20.04+/CentOS 7.9+ / Rocky Linux 8+,内核版本 ≥ 4.18。
  2. Docker 版本: 使用官方稳定版(CE/EE),锁定版本号,避免自动升级。
  3. 存储驱动: 优先使用 overlay2,避免 devicemapper 的 loop-lvm 模式。
  4. 数据目录分离: 将 /var/lib/docker 挂载到独立磁盘或 LVM 卷,防止根分区写满。
  5. 日志策略: 配置 log-driver: json-file + max-size: 10m + max-file: 3,防止日志撑爆磁盘。
  6. 网络规划: 使用 bridge 或 overlay 网络,避免 --net=host 滥用。
  7. 安全加固: 启用 userns-remap、限制 --privileged、配置镜像签名验证。
  8. 监控与告警: 部署 cAdvisor / Prometheus 采集容器指标,设置磁盘、CPU、内存告警阈值。
企业级 Docker 部署规范流程 OS 选型 版本锁定 存储驱动 数据目录 日志策略 网络规划 安全加固 监控告警 📌 规范落地:每个节点对应一个配置项,建议使用 Ansible/Puppet 统一下发 daemon.json 和系统参数。

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 服务不可用。