第十八篇:《Docker 监控与性能优化》
容器化带来了部署的便利性但也增加了监控的复杂度每个容器都是一个动态的、短暂的目标。如何实时查看容器的资源使用情况如何持久化存储监控数据并可视化当容器性能不佳时如何定位瓶颈本文将介绍 Docker 内置的 docker stats、cAdvisor Prometheus Grafana 监控栈以及常见的性能优化策略。一、实时监控docker statsdocker stats 命令可以实时显示运行中容器的资源使用情况dockerstats输出字段CONTAINER ID / NAMECPU %CPU 使用百分比相对于宿主机总 CPUMEM USAGE / LIMIT内存使用量 / 限制若未限制显示宿主机总内存MEM %内存使用百分比NET I/O网络收发数据量BLOCK I/O磁盘读写数据量PIDS进程数需设置 --pids-limit 才能显示限制常用选项dockerstats --no-stream# 只输出一次dockerstats--formattable {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}二、持久化监控cAdvisor Prometheus Grafana对于生产环境需要历史数据和可视化图表。开源方案通常是 cAdvisor 收集容器指标Prometheus 存储和查询Grafana 展示。2.1 cAdvisorContainer AdvisorcAdvisor 是 Google 开源的容器资源监控工具自动发现本机所有容器暴露 Prometheus 格式的指标。运行 cAdvisordockerrun-d\--namecadvisor\--restartalways\--volume/:/rootfs:ro\--volume/var/run:/var/run:ro\--volume/sys:/sys:ro\--volume/var/lib/docker/:/var/lib/docker:ro\--volume/dev/disk/:/dev/disk:ro\--publish8080:8080\gcr.io/cadvisor/cadvisor:latest访问 http://localhost:8080 可查看简洁的 UI但通常只作为指标收集器。2.2 Prometheus 配置创建 prometheus.ymlglobal:scrape_interval:15sscrape_configs:-job_name:cadvisorstatic_configs:-targets:[cadvisor:8080]启动 Prometheus 容器dockerrun-d--nameprometheus\-p9090:9090\-v$(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml\prom/prometheus2.3 Grafana 仪表盘dockerrun-d--namegrafana-p3000:3000 grafana/grafana访问 http://localhost:3000添加 Prometheus 数据源URL http://prometheus:9090然后导入 Docker 监控仪表盘例如 ID 193 或 893即可看到每个容器的 CPU、内存、网络、磁盘图表。三、关键性能指标解读四、性能优化策略4.1 合理设置资源限制dockerrun-d--nameapp--cpus1--memory512m --memory-reservation256m myapp–cpus限制 CPU 核心数可为小数。–memory硬限制超过会触发 OOM Kill。–memory-reservation软限制当宿主机内存紧张时优先回收。4.2 CPU 优化对于多核应用分配 --cpus2 或使用 --cpuset-cpus0-1 绑定特定核心提升缓存命中率。避免使用 --cpu-shares 来控制权重相对值不如直接限制更明确。4.3 内存优化应用内减少对象分配降低 GC 频率。使用 --oom-score-adj 调整 OOM 优先级。考虑使用 --memory-swap 控制 swap 使用设为 -1 禁用 swap 可提升性能但降低稳定性。4.4 磁盘 I/O 优化使用 --device-read-bps、–device-write-bps 限制磁盘带宽。对于写密集的容器挂载 tmpfs 到临时目录如 /tmp减少真实磁盘压力。使用 --blkio-weight 设置 I/O 权重。dockerrun-d--namemysql\--device-read-bps /dev/sda:10mb\--tmpfs/var/lib/mysql/tmp:rw,noexec,nosuid,size256m\mysql4.5 网络优化使用 host 网络模式可以提升性能但牺牲隔离。调整网络驱动–network host 或自定义 bridge 并开启 mtu 设置。避免频繁创建和销毁网络命名空间例如短生命周期容器。五、性能排查实用工具六、实践定位 CPU 飙升问题发现 docker stats 显示某容器 CPU 持续 100%。进入容器docker exec -it highcpu bash。运行 top 查看进程 PID。宿主机上使用 perf top -p 分析热点函数。若为 Java 应用使用 jstack 或 async-profiler若为 Node.js使用 --prof 标志。七、最佳实践总结监控优先部署 cAdvisor Prometheus Grafana设置告警如 CPU 80% 持续 5 分钟。资源限制必须做防止单容器拖垮整个宿主机。日志分离结合日志管理避免日志 I/O 影响性能。镜像优化小的镜像不仅节省空间也减少启动时间。定期巡检使用 docker system df 查看空间使用清理无用资源。八、小结Docker 监控和性能优化是一个持续的过程。从 docker stats 实时查看到搭建完整的监控栈再到针对具体瓶颈调优每一步都能提升系统的稳定性和效率。记住没有监控的容器部署就像闭眼开车。