Docker 部署运维实战:47个典型故障场景的诊断与修复
1. Docker启动类故障排查实战遇到Docker启动失败时先别急着重装系统。根据我处理过的上百个案例90%的启动问题都能通过以下方法解决。先来个最简单的场景当你输入docker ps却看到Cannot connect to the Docker daemon时别慌这就像电脑没插电源——Docker服务压根没启动。经典报错1docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?这个报错就像汽车打不着火首先要检查火花塞——Docker服务状态systemctl status docker # 查看服务状态 journalctl -xe -u docker # 查看详细日志如果是CentOS/RHEL系统SELinux经常是罪魁祸首。我曾在生产环境花了3小时才定位到这个问题# 临时关闭SELinux生产环境慎用 setenforce 0 # 永久修改需要编辑/etc/selinux/config更棘手的场景当你发现/var/run/docker.sock变成目录而不是socket文件时可以这样处理# 先停止Docker服务 sudo systemctl stop docker # 删除异常文件注意备份 sudo rm -rf /var/run/docker.sock # 重新启动 sudo systemctl start docker2. 镜像构建与仓库问题深度解析镜像构建失败就像做菜时食材变质需要从源头排查。常见错误COPY failed: file not found往往是因为忽略了.dockerignore文件的影响。我曾遇到一个案例构建耗时30分钟却失败最后发现是.dockerignore排除了node_modules但Dockerfile中又尝试复制。镜像拉取超时问题的终极解决方案是配置国内镜像源# 创建或修改daemon.json sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://registry.docker-cn.com, https://docker.mirrors.ustc.edu.cn ] } EOF # 重载配置 sudo systemctl daemon-reload sudo systemctl restart docker镜像层损坏的情况也不少见这时候需要彻底清理# 删除所有未使用的镜像 docker system prune -a --volumes # 手动清理存储目录危险操作 sudo rm -rf /var/lib/docker/overlay2/*3. 容器资源管理实战技巧内存泄漏就像容器里的定时炸弹。当看到OOMKilled状态时你需要立即行动# 查看容器内存限制 docker inspect --format{{.HostConfig.Memory}} 容器ID # 临时增加内存限制 docker update --memory 2g 容器ID磁盘空间不足是另一个高频问题。有次我们的CI/CD流水线突然失败原因是/var/lib/docker用了100%。紧急处理方案# 查看Docker磁盘使用 docker system df # 清理无用资源 docker system prune -a # 限制日志大小添加到daemon.json log-opts: {max-size: 10m, max-file: 3}对于生产环境我强烈建议设置资源限制# docker-compose.yml示例 services: app: deploy: resources: limits: cpus: 0.5 memory: 512M reservations: memory: 256M4. 网络问题排查指南网络问题就像血管堵塞会让整个系统瘫痪。遇到IPv4 forwarding is disabled错误时# 启用IP转发 echo 1 /proc/sys/net/ipv4/ip_forward # 永久生效 echo net.ipv4.ip_forward 1 /etc/sysctl.conf sysctl -p端口冲突是新手常踩的坑。有次我们的Nginx容器一直重启原来是宿主机80端口被占用# 查找占用端口的进程 sudo lsof -i :80 # 或者使用netstat sudo netstat -tulnp | grep :80跨容器通信问题可以通过创建自定义网络解决# 创建自定义网络 docker network create mynet # 运行容器时指定网络 docker run --networkmynet -d --name app1 myimage docker run --networkmynet -d --name app2 myimage5. Docker Compose排错全攻略Compose文件格式错误就像错谱的乐谱。当看到service depends on non-existent service时要检查# 正确示例 services: web: depends_on: - db db: image: postgres:13环境变量问题也很常见。我建议使用.env文件管理变量# .env文件示例 DB_USERadmin DB_PASSsecret然后在Compose文件中引用environment: - DB_USER${DB_USER} - DB_PASS${DB_PASS}健康检查配置不当会导致服务不稳定。正确的做法healthcheck: test: [CMD, curl, -f, http://localhost:8080/health] interval: 30s timeout: 10s retries: 3 start_period: 5s6. 存储与Volume疑难杂症权限问题就像门锁坏了。当容器无法写入挂载目录时可以# 查看容器内用户ID docker exec -it 容器ID id # 修改宿主机目录权限 sudo chown -R 1000:1000 /host/path数据丢失预防至关重要。有次我们误删容器导致业务数据丢失现在都这样做# 使用命名Volume docker volume create app_data docker run -v app_data:/data myimage # 备份Volume数据 docker run --rm -v app_data:/source -v $(pwd):/backup busybox \ tar czf /backup/app_data_$(date %Y%m%d).tar.gz -C /source .7. 生产环境最佳实践经过多次血泪教训我们总结出这些黄金法则镜像规范永远不用latest标签而是用应用名-版本号-构建号格式资源隔离每个容器设置CPU、内存限制日志管理统一收集到ELK或Graylog监控告警PrometheusGranfa监控容器指标安全加固非root用户运行容器定期扫描镜像漏洞最后记住Docker问题排查就像破案日志是你的最佳助手。养成查看日志的习惯# 查看实时日志 docker logs -f 容器ID # 带时间戳的日志 docker logs -t 容器ID # 查看最后100行 docker logs --tail 100 容器ID