适用于 CentOS 的 Docker 性能优化策略
一 存储与镜像优化
- 使用推荐的 overlay2 存储驱动(现代内核与 Docker 版本优先)。在 /etc/docker/daemon.json 中配置:
{
“storage-driver”: “overlay2”
}
修改后执行:systemctl daemon-reload && systemctl restart docker。此驱动在大多数工作负载下具备更好的性能与稳定性。
- 将 Docker 数据目录迁移至更大更快的磁盘分区(示例迁移到 /home/data/docker):
- systemctl stop docker
- mv /var/lib/docker /home/data/docker
- ln -sf /home/data/docker /var/lib/docker
- systemctl start docker
- 验证:docker info | grep “Docker Root Dir”
- 精简镜像与加速构建:采用 多阶段构建、选择 Alpine 等轻量基础镜像,减少镜像层数与体积,缩短拉取与启动时间。
- 定期清理无用资源:执行 docker system prune -a 清理停止的容器、悬挂镜像、无用网络与构建缓存,避免磁盘膨胀影响性能。
- 小内存主机(如 8GB)场景:合理设置容器内存上限(如 --memory=1g),并用 docker stats 持续观察内存与 CPU 使用,避免系统 OOM 与抖动。
二 网络性能优化
- 选择高性能网络模式:对延迟敏感、吞吐要求高的服务优先使用 host 网络(共享宿主机网络栈,性能最佳);跨主机集群可选 overlay;需要与物理网络同网段可见时使用 macvlan。
- 调优 MTU:在存在封装(如 VXLAN)或链路限制的环境中,适当降低 MTU 以避免分片与重传。示例:ip link set dev docker0 mtu 1400;创建自定义 bridge 时也可指定 --mtu。
- 内核网络栈参数优化(/etc/sysctl.conf):
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_forward = 1
执行 sysctl -p 生效。
- 生产网络实践:结合 Calico/Flannel/Weave 等 CNI 插件实现高性能与可扩展的容器网络;按业务划分网络与命名空间,实施最小权限与加密通信;对关键路径配置带宽与连接限制,避免单容器占满带宽。
三 运行时资源与稳定性
- 为容器设置合理的 CPU/内存 限额,避免资源争用与“吵闹邻居”。示例:docker run --cpus=“0.5” --memory=“512m” nginx。对数据库、消息队列等有状态服务,建议设置内存上限并开启 OOM 评分调整(如 “oom-score-adjust”: -500)以降低被系统 OOM Killer 终止的概率。
- 文件句柄与默认 ulimit:为容器与 Docker 守护进程设置充足的文件句柄数,避免高并发连接时“too many open files”。示例(daemon.json):
{
“default-ulimits”: {
“nofile”: { “Name”: “nofile”, “Hard”: 65536, “Soft”: 65536 }
}
}
- 内存与交换策略:仅在明确需要时调整 vm.swappiness(如设置为 0 减少 swap 倾向),并配合容器内存限制与监控,防止抖动与 OOM。
- 长稳运行与泄漏治理:对出现内存持续增长的服务,结合日志、监控与压测定位根因;必要时更新 Docker/应用版本,设置内存上限并滚动重启策略,保障稳定性。
四 快速检查清单与实施顺序
- 核对存储驱动为 overlay2,数据目录位于高性能磁盘;镜像采用多阶段构建并定期执行 prune。
- 依据业务选择 host/bridge/overlay/macvlan,按需调整 MTU 与内核网络参数,集群场景选用合适的 CNI 插件。
- 容器必须配置 CPU/内存 限额与合理的 ulimit,在 8GB 等小内存主机上严格控制并发与内存上限。
- 建立监控基线:使用 docker stats 与系统工具持续观测 CPU、内存、网络与磁盘 IO,围绕瓶颈迭代调优。