Docker问题排查与性能调优实战指南
Docker 常见问题与调试实战指南
一、故障排查:快速定位容器问题
1. 容器启动失败排查
当容器启动失败时,两个核心命令组合能解决80%的问题:
# 查看容器日志(最后50行)
docker logs --tail 50 <container_name>
# 查看容器详细配置
docker inspect <container_name> | grep -i "error\|failed\|exit"
典型问题场景:
- 端口冲突:检查
HostConfig.PortBindings
- 挂载失败:查看
Mounts
字段验证路径 - 环境变量缺失:检查
Config.Env
实践建议:
# 组合使用示例(格式化输出关键信息)
docker inspect <container> --format \
'{{json .State}} {{json .NetworkSettings}} {{json .HostConfig}}' | jq
2. 网络连通性诊断
网络问题排查三板斧:
# 1. 检查网络配置
docker network inspect <network_name>
# 2. 进入容器测试连通性
docker exec -it <container> sh -c "ping <target_ip>"
# 3. 查看iptables规则(Linux主机)
sudo iptables -L -n -v --line-numbers
常见网络问题:
- DNS解析失败:检查
/etc/resolv.conf
- 跨网络通信:确保容器在同一自定义网络
- 端口未暴露:验证
docker run -p
参数
二、性能调优:让容器飞起来
1. 资源限制策略
通过cgroups实现精准控制:
# 限制CPU和内存
docker run -it --cpus=1.5 --memory=2g --memory-swap=3g alpine
# 查看资源使用
docker stats --no-stream <container>
最佳实践:
- 生产环境必须设置内存限制(防止OOM)
- CPU限制建议使用小数(如1.5表示1.5核)
- 交换空间通常设为内存的1.5倍
2. 存储驱动选型
主流驱动对比:
配置建议:
# 查看当前驱动
docker info | grep "Storage Driver"
# 修改驱动(需重启docker)
# /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"]
}
三、实战调试案例
案例1:容器不断重启
# 1. 查看退出码
docker inspect --format='{{.State.ExitCode}}' <container>
# 2. 常见退出码:
# 0 - 正常退出
# 137 - SIGKILL(内存不足)
# 143 - SIGTERM(优雅终止)
案例2:容器间通信延迟
# 创建优化网络(启用ICC和MTU调整)
docker network create \
--driver=bridge \
--opt "com.docker.network.bridge.enable_icc=true" \
--opt "com.docker.network.driver.mtu=1500" \
my_net
四、调试工具箱推荐
工具 | 用途 | 示例命令 |
---|---|---|
docker events | 实时监控容器事件 | docker events --filter 'event=die' |
ctop | 容器资源监控TOP工具 | ctop -a |
dive | 镜像层分析 | dive <image_name> |
nsenter | 进入容器命名空间 | nsenter -t <pid> -n ip a |
生产环境建议:
- 所有容器添加
--restart=on-failure:5
策略 关键服务配置健康检查:
HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ || exit 1
记住:良好的日志规范和资源监控是预防问题的关键。推荐结合ELK或Prometheus+Grafana搭建完整的监控体系。