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. 存储驱动选型

主流驱动对比:

图1

配置建议

# 查看当前驱动
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

生产环境建议

  1. 所有容器添加--restart=on-failure:5策略
  2. 关键服务配置健康检查:

    HEALTHCHECK --interval=30s --timeout=3s \
      CMD curl -f http://localhost/ || exit 1

记住:良好的日志规范和资源监控是预防问题的关键。推荐结合ELK或Prometheus+Grafana搭建完整的监控体系。

添加新评论