温馨提示×

Docker如何优化Ubuntu系统资源

小樊
44
2025-12-14 11:53:25
栏目: 智能运维

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,避免网段冲突并提升吞吐。

0