Docker故障排查手册
大约 6 分钟Docker指南Docker故障排查
Docker故障排查手册
概述
Docker故障排查是运维工作中的重要环节。本手册将介绍Docker常见问题的诊断方法和解决方案,帮助快速定位和解决Docker运行中的各种问题。
1. Docker守护进程问题
1.1 Docker服务无法启动
问题现象
systemctl start docker
Job for docker.service failed
诊断步骤
# 查看Docker服务状态
systemctl status docker
# 查看详细错误信息
journalctl -u docker.service
# 检查Docker配置文件
cat /etc/docker/daemon.json
解决方案
# 修复配置文件语法错误
# 重新加载systemd配置
systemctl daemon-reload
# 启动Docker服务
systemctl start docker
1.2 Docker守护进程响应缓慢
诊断步骤
# 查看Docker系统信息
docker info
# 检查磁盘空间
df -h
# 检查内存使用情况
free -h
# 查看Docker进程
ps aux | grep docker
解决方案
# 清理无用资源
docker system prune -a
# 重启Docker服务
systemctl restart docker
2. 容器启动问题
2.1 容器启动后立即退出
问题现象
docker run ubuntu
# 容器启动后立即退出
诊断步骤
# 查看容器日志
docker logs container_name
# 查看容器详细信息
docker inspect container_name
解决方案
# 以交互模式运行
docker run -it ubuntu /bin/bash
# 指定长期运行的命令
docker run ubuntu tail -f /dev/null
2.2 容器端口无法访问
问题现象
容器启动后,映射的端口无法从宿主机访问。
诊断步骤
# 检查端口映射
docker port container_name
# 检查容器网络
docker inspect container_name | grep -i network
# 检查防火墙设置
iptables -L
解决方案
# 正确映射端口
docker run -p 8080:80 nginx
# 检查应用是否监听正确端口
docker exec -it container_name netstat -tlnp
2.3 容器权限问题
问题现象
容器内应用无法访问文件或执行操作。
诊断步骤
# 检查容器用户
docker exec -it container_name whoami
# 检查文件权限
docker exec -it container_name ls -l /path/to/file
解决方案
# 以特定用户运行容器
docker run --user 1000:1000 ubuntu
# 修改文件权限
docker exec -it container_name chmod 755 /path/to/file
3. 镜像相关问题
3.1 拉取镜像失败
问题现象
docker pull nginx
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host
诊断步骤
# 检查网络连接
ping registry-1.docker.io
# 检查DNS配置
cat /etc/resolv.conf
# 检查代理设置
env | grep -i proxy
解决方案
# 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mirror.example.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3.2 构建镜像失败
问题现象
docker build -t myapp .
Error response from daemon: manifest for myapp:latest not found
诊断步骤
# 检查Dockerfile语法
docker run --rm -v $(pwd):/data alpine sh -c "cd /data && cat Dockerfile"
# 查看构建日志
docker build -t myapp . --no-cache
解决方案
# 确保基础镜像存在
FROM nginx:latest
# 检查指令语法
RUN apt-get update && apt-get install -y package_name
4. 网络问题
4.1 容器间无法通信
问题现象
同一网络中的容器无法互相访问。
诊断步骤
# 检查容器网络
docker network ls
# 检查容器网络连接
docker network inspect network_name
# 测试网络连通性
docker exec container1 ping container2
解决方案
# 创建自定义网络
docker network create my-network
# 将容器连接到同一网络
docker run --network my-network --name container1 nginx
docker run --network my-network --name container2 nginx
4.2 DNS解析失败
问题现象
容器内无法解析域名。
诊断步骤
# 检查容器DNS配置
docker exec container_name cat /etc/resolv.conf
# 测试DNS解析
docker exec container_name nslookup google.com
解决方案
# 指定DNS服务器
docker run --dns 8.8.8.8 nginx
# 使用自定义DNS配置
docker run --dns-opt ndots:2 nginx
5. 存储问题
5.1 磁盘空间不足
问题现象
no space left on device
诊断步骤
# 检查磁盘使用情况
df -h
# 检查Docker磁盘使用
docker system df
# 查看大文件
du -sh /var/lib/docker/containers/* | sort -hr | head -10
解决方案
# 清理无用资源
docker system prune -a
# 删除停止的容器
docker container prune
# 删除无用镜像
docker image prune -a
# 删除无用数据卷
docker volume prune
5.2 数据卷权限问题
问题现象
容器无法写入挂载的数据卷。
诊断步骤
# 检查宿主机目录权限
ls -ld /host/path
# 检查容器内权限
docker exec -it container_name ls -ld /container/path
解决方案
# 设置正确的目录权限
sudo chown -R 1000:1000 /host/path
# 使用用户映射
docker run -v /host/path:/container/path --user 1000:1000 ubuntu
6. 性能问题
6.1 容器CPU使用率过高
诊断步骤
# 实时监控容器资源使用
docker stats
# 查看容器详细信息
docker inspect container_name
解决方案
# 限制CPU使用
docker run --cpus="1.0" nginx
# 限制CPU核心
docker run --cpuset-cpus="0-1" nginx
6.2 容器内存不足
问题现象
OOM killed
诊断步骤
# 查看容器内存使用
docker stats
# 查看系统日志
journalctl -u docker | grep OOM
解决方案
# 限制内存使用
docker run -m 512m nginx
# 设置内存交换
docker run -m 512m --memory-swap 1024m nginx
7. 安全问题
7.1 容器被攻击
诊断步骤
# 检查容器进程
docker exec -it container_name ps aux
# 检查网络连接
docker exec -it container_name netstat -tlnp
# 检查文件修改时间
docker exec -it container_name find / -type f -mtime -1
解决方案
# 限制容器能力
docker run --cap-drop=ALL nginx
# 使用只读文件系统
docker run --read-only nginx
# 以非root用户运行
docker run --user 1000:1000 nginx
8. Docker Compose问题
8.1 服务依赖问题
问题现象
服务启动顺序不正确导致应用启动失败。
诊断步骤
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs service_name
解决方案
version: '3'
services:
db:
image: postgres
web:
image: nginx
depends_on:
- db
8.2 环境变量未正确传递
问题现象
容器内无法获取预期的环境变量。
诊断步骤
# 检查环境变量
docker exec -it container_name env
# 查看Compose配置
docker-compose config
解决方案
version: '3'
services:
web:
image: nginx
environment:
- ENV_VAR=value
env_file:
- .env
9. 常用故障排查命令
9.1 系统级诊断
# 查看Docker系统信息
docker info
# 查看Docker版本
docker version
# 查看Docker磁盘使用情况
docker system df
# 查看Docker事件
docker events
9.2 容器级诊断
# 查看容器详细信息
docker inspect container_name
# 查看容器日志
docker logs -f container_name
# 进入容器调试
docker exec -it container_name /bin/bash
# 复制文件到容器
docker cp local_file container_name:/path/to/file
9.3 网络诊断
# 查看网络列表
docker network ls
# 查看网络详细信息
docker network inspect network_name
# 测试网络连通性
docker run --rm --network network_name alpine ping other_container
10. 预防性维护
10.1 定期清理任务
#!/bin/bash
# Docker定期清理脚本
# 每周清理无用资源
if [ $(date +%u) -eq 7 ]; then
docker system prune -f
fi
# 每月清理所有未使用资源
if [ $(date +%d) -eq 1 ]; then
docker system prune -a -f
fi
10.2 监控告警设置
#!/bin/bash
# Docker监控脚本
# 检查容器运行状态
docker ps -q | xargs -r docker inspect --format='{{.State.Running}}' | grep -q false
if [ $? -eq 0 ]; then
echo "Some containers are not running" | mail -s "Docker Alert" admin@example.com
fi
# 检查磁盘使用率
if [ $(df /var/lib/docker | awk 'NR==2 {print $5}' | sed 's/%//') -gt 80 ]; then
echo "Docker disk usage is over 80%" | mail -s "Docker Alert" admin@example.com
fi
总结
Docker故障排查需要系统性的方法,从守护进程、容器、镜像、网络、存储等多个维度进行诊断。掌握常用的诊断命令和工具,建立完善的监控告警机制,可以有效提高故障处理效率,保障Docker环境的稳定运行。