总体思路
在 CentOS 上让 Docker 稳定运行,关键在于:运行时隔离与资源可控、镜像与进程最小权限、存储与日志不失控、网络与防火墙可预期、以及可观测与持续维护。以下从五个维度给出可落地的配置与操作要点。
一 运行时隔离与资源可控
- 为容器设置硬边界,避免“吵闹邻居”效应与级联故障:
- CPU:使用 –cpus 限制可用核数,或用 –cpuset-cpus 绑定到指定核心,提升可预期性。
- 内存:使用 –memory 限制最大内存,必要时配合 –memory-swap 控制内存+交换总量。
- 磁盘 I/O:通过 –blkio-weight 设置相对权重,控制相对带宽分配。
- 磁盘吞吐:对设备读写限速,示例:–device-read-bps=/dev/sda:1mb、–device-write-bps=/dev/sda:1mb。
- 示例:docker run --name app --cpus=“0.5” --memory=“512m” --device-read-bps=/dev/sda:1mb my-image
- 编排场景(如 Docker Compose v3+)用 deploy.resources.limits/requests 统一管理资源,便于横向扩展与调度稳定。
二 镜像与进程最小权限
- 以非 root 运行:在 Dockerfile 中创建并切换用户(如 USER myuser),或在运行期用 -u/–user 指定 UID/GID,缩小被攻破后的影响面。
- 禁用特权与精细授权:避免使用 –privileged;按需使用 –cap-add/–cap-drop 只授予必要能力,遵循最小权限原则。
- 最小化镜像与可信来源:优先选择精简基础镜像(如 alpine),减少攻击面;建立私有镜像仓库(如 Harbor),启用镜像扫描与签名,确保镜像完整性与可追溯。
- 持续更新与补丁:定期更新宿主机 CentOS、Docker 引擎 与所有容器镜像,及时修复已知漏洞。
三 存储与日志治理
- 存储驱动:在 /etc/docker/daemon.json 配置使用 “storage-driver”: “overlay2”(推荐、稳定),并重启 Docker 生效。
- 日志轮转与容量上限:避免容器日志无限增长拖垮磁盘,配置 json-file 日志驱动的大小与数量上限:
- 示例:
{
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “10m”,
“max-file”: “3”
}
}
- 数据持久化:优先使用 Docker Volumes 或绑定挂载管理业务数据,避免容器重建导致数据丢失。
四 网络与防火墙稳态
- 端口与防火墙:使用 firewalld 明确放行业务端口(如 80/tcp),变更后执行 firewall-cmd --reload;避免粗暴关闭防火墙。
- 网桥与连通性:确认 docker0 网桥存在并分配了 IP,必要时排查 NAT/网桥转发与端口映射是否正确。
- 高性能网络场景:在明确代价与复杂度前提下,考虑 macvlan/ipvlan 减少 NAT 开销,但需正确规划 IP 与 VLAN。
五 可观测性与日常维护
- 监控与日志审计:启用容器与宿主机层面的监控告警,集中收集容器日志,便于快速发现与定位异常。
- 定期巡检与清理:例行检查容器/镜像/卷占用,清理无用资源;保持 Docker、containerd 与系统组件为最新稳定版本。
- 变更与回滚:镜像与配置变更采用可回滚策略(如标签化版本、编排的滚动更新),降低发布风险。