🐳 Docker容器运维与故障排查实战手册
1. 理解Docker日志系统
Docker的日志系统是排查容器问题的首要工具。默认情况下,Docker使用json-file日志驱动,将容器的标准输出(STDOUT)和标准错误(STDERR)保存为JSON格式的文件。
1.1 日志查看基础命令
docker logs命令是与容器日志交互的主要方式:
bash
# 实时跟踪日志输出
docker logs -f <container-name>
# 显示最后10行日志
docker logs --tail 10 <container-name>
# 显示带时间戳的日志
docker logs -t <container-name>
# 从特定时间点开始查看日志
docker logs --since="2023-10-27T10:00:00" <container-name>
# 组合使用多个参数
docker logs --tail 20 -t -f <container-name>
1.2 日志文件存储位置
容器日志文件默认存储在/var/lib/docker/containers/<container-id>/<container-id>-json.log。你可以使用以下命令定位具体路径:
bash
docker inspect --format='{{.LogPath}}' <container-name>
2. 常见Docker故障排查指南
2.1 容器启动故障
问题现象:容器无法启动或立即退出。
- 检查容器状态 :使用
docker ps -a查看所有容器状态,确认容器是否处于"Exited"状态 - 查看详细日志 :使用
docker logs <container-name>分析错误信息 - 常见错误与解决方案 :
- "exec user process caused: no such file or directory" :检查Dockerfile中
WORKDIR设置和文件路径 - "manifest for not found":验证镜像名称和标签是否正确
- "executable file not found in $PATH":确认命令存在于容器的PATH环境变量中
- "exec user process caused: no such file or directory" :检查Dockerfile中
2.2 磁盘空间不足问题
问题现象:磁盘占用率达100%,容器功能异常。
-
检查磁盘空间 :使用
df -h查看磁盘使用情况 -
定位大文件目录 :使用
du -h --max-depth=1 /var/lib/docker定位Docker相关大目录 -
清理无用资源 :
bash# 清理停止的容器、无用网络和构建缓存 docker system prune -a # 清理卷(谨慎操作) docker volume prune
2.3 网络连接问题
问题现象:容器间通信失败,端口访问不通。
-
检查容器网络配置 :使用
docker inspect <container-name> | grep -A 10 "NetworkSettings" -
验证端口映射 :使用
docker port <container-name>查看端口映射情况 -
解决端口冲突 :
bash# 检查端口占用 netstat -tulnp | grep <port> # 更改容器映射端口 docker run -p <new-port>:<container-port> ...
3. Docker守护进程问题排查
当Docker服务本身无法启动时,需要排查守护进程问题。
3.1 守护进程启动失败
错误信息 :"Job for docker.service failed because the control process exited with error code"
- 查看服务状态 :
sudo systemctl status docker.service - 检查详细日志 :
sudo journalctl -u docker.service - 排查步骤 :
- 检查配置文件语法:
/etc/docker/daemon.json - 验证文件权限:确保
/etc/docker和/var/lib/docker目录权限正确 - 检查端口冲突:
netstat -tuln | grep 2375
- 检查配置文件语法:
4. Docker日志轮转配置
防止日志文件无限增长导致磁盘空间耗尽。
4.1 配置全局日志轮转
编辑/etc/docker/daemon.json文件:
json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
}
}
应用配置:sudo systemctl daemon-reload && sudo systemctl restart docker
4.2 为单个容器设置日志轮转
bash
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
4.3 不同环境的日志配置建议
| 环境 | max-size参数 | max-file参数 |
|---|---|---|
| 开发环境 | 5m | 3 |
| 测试环境 | 10m | 5 |
| 生产环境 | 50m | 10 |
5. 高级运维技巧
5.1 容器内直接调试
使用docker exec命令进入容器内部进行诊断:
bash
# 进入容器shell
docker exec -it <container-name> /bin/bash
# 在容器内运行特定诊断命令
docker exec -it <container-name> ps aux
docker exec -it <container-name> cat /etc/config.conf
5.2 系统资源监控
-
实时监控 :使用
docker stats查看容器资源使用情况 -
设置资源限制 :在运行时限制容器资源
bashdocker run -d --name limited-container \ --memory=512m \ --cpus=1.5 \ myapp:latest
6. 系统化故障排查流程
当遇到Docker问题时,遵循系统化的排查流程可以提高效率:
问题出现 检查容器状态
docker ps -a 查看日志
docker logs 识别问题类型 启动故障 运行异常 性能问题 资源不足 检查镜像
和配置 进入容器
调试 监控资源
使用情况 清理磁盘
和镜像 解决问题 记录解决方案
7. 日常维护最佳实践
- 定期检查日志文件大小,防止磁盘空间耗尽
- 配置监控告警,对容器异常状态进行实时监控
- 使用Docker Compose管理多容器应用,确保正确的启动顺序和依赖关系
- 定期更新Docker和镜像,修复已知安全漏洞
- 备份重要数据卷,防止数据丢失
通过本手册介绍的方法和流程,你可以建立起系统的Docker运维和故障排查能力。关键是要养成良好的日常维护习惯,在问题发生前预防,在问题发生时能快速定位和解决。