Docker 优化 Ubuntu 系统资源的实用方案
一 存储与镜像层优化
- 使用 overlay2 存储驱动(推荐):性能与稳定性更好,需确保底层文件系统支持 d_type。在 /etc/docker/daemon.json 中设置:
{
“storage-driver”: “overlay2”
}
修改后执行:sudo systemctl daemon-reload && sudo systemctl restart docker。
- 配置镜像加速与并发拉取,缩短拉取时间并降低带宽抖动:
{
“registry-mirrors”: [“https://<你的镜像加速地址>”],
“max-concurrent-downloads”: 10,
“max-concurrent-uploads”: 10
}
- 设置默认日志轮转,避免容器日志撑满磁盘:
{
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “10m”,
“max-file”: “3”
}
}
- 如 /var/lib/docker 所在磁盘成为瓶颈,可将数据根目录迁移至更快或更大的磁盘:
{
“data-root”: “/mnt/docker-data”
}
迁移步骤建议:停 Docker → 拷贝数据 → 修改 daemon.json → 启动 Docker。
二 容器资源限制与隔离
- 运行时限制(docker run):
- CPU:–cpus=“1.5”(最多使用 1.5 核)、–cpu-shares=1024(相对权重,默认 1024)、–cpuset-cpus=“0,1”(绑定 CPU0/1)。
- 内存:-m 512m(最大 512MB)、–memory-reservation=256m(内存保留/软限制)。
- 磁盘 I/O:–device-write-bps=/dev/sda:1mb(限制写 1MB/s)。
- Docker Compose(示例):
version: ‘3’
services:
web:
image: nginx:latest
deploy:
resources:
limits:
cpus: ‘0.50’
memory: 512M
reservations:
cpus: ‘0.25’
memory: 256M
- 验证与观察:使用 docker stats 实时查看 CPU%、MEM%、MEM USAGE/LIMIT 等指标,确认限制是否生效。
三 磁盘空间治理与维护
- 先评估再清理:docker system df 查看镜像/容器/卷占用;按需执行清理:
- 常规清理:docker system prune(删除停止容器、悬挂网络、dangling 镜像等)。
- 深度清理:docker system prune -a --volumes(同时清理未使用镜像与数据卷,谨慎操作)。
- 定位异常日志:日志常位于 /var/lib/docker/containers//.log。快速找出大日志:
find /var/lib/docker/containers/ -name ".log" -exec du -h {} + | sort -hr | head -n 10
临时释放空间可用:truncate -s 0 /var/lib/docker/containers/<容器ID>/-json.log(治标,需配合日志轮转策略)。
- 变更日志策略后,已存在容器不会自动继承,需重建或调整日志驱动/选项。
四 系统层与网络优化
- 启用内存与 swap 限制(Ubuntu/Debian 常见警告 “WARNING: No swap limit support” 的成因是未开启 swap accounting):
- 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 增加:cgroup_enable=memory swapaccount=1
- 更新并重启:sudo update-grub && sudo reboot
- 重启后用 docker info 检查 swap 限制是否已启用,随后内存与 --memory-swap 限制才会准确生效。
- 可选的内核与网络调优(按业务与负载评估):
- vm.swappiness=10(降低换页倾向)、net.core.somaxconn=512(增大连接队列)、fs.file-max=65536(提升文件句柄上限)。
- Docker 网络:在 daemon.json 中可设置 “userland-proxy”: false(减少用户态转发开销)、合理 MTU 与固定 CIDR,避免网段冲突并提升吞吐。