第15章:故障排查与面试题
本章目标:掌握 Docker 常见故障的排查方法,准备企业级面试题。
15.1 常见故障排查
15.1.1 容器无法启动
bash
# 查看容器日志
docker logs <container>
# 查看容器退出码
docker inspect <container> --format='{{.State.ExitCode}}'
# 常见退出码
# 0 正常退出
# 1 应用错误
# 126 权限问题
# 127 命令不存在
# 137 OOM Killed (内存不足)
# 139 段错误
# 143 被 SIGTERM 终止
# 查看容器详细信息
docker inspect <container>
# 检查容器资源限制
docker stats --no-stream <container>
15.1.2 容器网络问题
bash
# 检查容器网络配置
docker inspect --format='{{json .NetworkSettings}}' <container>
# 进入容器测试网络
docker exec -it <container> ping <target>
docker exec -it <container> curl -v http://<target>:<port>
# 检查 DNS 解析
docker exec -it <container> cat /etc/resolv.conf
docker exec -it <container> nslookup <hostname>
# 检查端口映射
docker port <container>
# 检查 iptables 规则
sudo iptables -t nat -L -n | grep <container>
15.1.3 磁盘空间问题
bash
# 查看 Docker 磁盘使用
docker system df
# 清理未使用的资源
docker system prune -a --volumes
# 清理特定类型的资源
docker container prune -f
docker image prune -a -f
docker volume prune -f
docker network prune -f
# 查找大文件
sudo du -sh /var/lib/docker/*
# 查看容器日志大小
find /var/lib/docker/containers -name "*.log" -exec ls -lh {} \;
15.1.4 镜像拉取失败
bash
# 检查网络连接
curl https://registry-1.docker.io/v2/
# 配置镜像加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
EOF
sudo systemctl restart docker
# 使用代理
export HTTP_PROXY=http://proxy:port
export HTTPS_PROXY=http://proxy:port
docker pull nginx:latest
# 检查 DNS 配置
cat /etc/resolv.conf
15.1.5 Docker Daemon 问题
bash
# 查看 Docker 状态
systemctl status docker
# 查看 Docker 日志
journalctl -u docker.service --no-pager -n 100
# 重启 Docker
sudo systemctl restart docker
# 检查 Docker 配置
docker info
# 检查 Docker 版本
docker version
15.2 性能调优
15.2.1 镜像优化
dockerfile
# 优化前(1.2GB)
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3 python3-pip
COPY . /app
RUN pip3 install -r /app/requirements.txt
CMD ["python3", "/app/app.py"]
# 优化后(150MB)
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python3", "app.py"]
15.2.2 容器资源优化
bash
# 合理设置资源限制
docker run -d \
--cpus="2" \
--memory="1g" \
--memory-swap="1g" \
--pids-limit=100 \
myapp
# 使用健康检查
docker run -d \
--health-cmd "curl -f http://localhost/ || exit 1" \
--health-interval 30s \
--health-timeout 5s \
--health-retries 3 \
myapp
# 使用重启策略
docker run -d --restart=unless-stopped myapp
15.2.3 网络优化
bash
# 使用 host 网络(高性能场景)
docker run -d --network host myapp
# 使用自定义网络(隔离场景)
docker network create my-network
docker run -d --network my-network myapp
# 优化 DNS 配置
docker run -d --dns 8.8.8.8 --dns 8.8.4.4 myapp
15.3 企业面试题
15.3.1 基础概念题
Q1:Docker 和虚拟机的区别是什么?
答:
1. 架构区别:
- 虚拟机:通过 Hypervisor 虚拟化硬件,每个 VM 有独立的 OS
- 容器:共享宿主机内核,通过 Namespace 和 Cgroups 实现隔离
2. 性能区别:
- 虚拟机:启动慢(分钟级),资源占用大(GB 级)
- 容器:启动快(秒级),资源占用小(MB 级)
3. 隔离级别:
- 虚拟机:硬件级隔离,安全性更高
- 容器:进程级隔离,隔离性相对较弱
4. 适用场景:
- 虚拟机:需要强隔离、运行不同 OS 的场景
- 容器:微服务、CI/CD、快速伸缩的场景
Q2:Docker 的三大核心概念是什么?
答:
1. 镜像(Image):
- 只读模板,包含运行应用所需的一切
- 采用分层存储,多个镜像可共享基础层
2. 容器(Container):
- 镜像的运行实例
- 拥有独立的文件系统、网络和进程空间
3. 仓库(Registry):
- 存储和分发镜像的服务
- 如 Docker Hub、Harbor
Q3:Docker 镜像的分层原理是什么?
答:
1. 每条 Dockerfile 指令生成一个新的只读层
2. 层与层之间通过内容哈希去重
3. 容器启动时在镜像层之上添加可写层
4. 读取文件时从上到下查找
5. 修改文件时使用写时复制(Copy-on-Write)
优势:
- 节省存储空间
- 加速镜像拉取
- 提高构建缓存命中率
15.3.2 实践操作题
Q4:如何优化 Dockerfile 减小镜像体积?
答:
1. 使用精简基础镜像(alpine、slim、distroless)
2. 使用多阶段构建分离构建和运行环境
3. 合并 RUN 指令减少层数
4. 使用 .dockerignore 排除无关文件
5. 清理包管理器缓存(rm -rf /var/lib/apt/lists/*)
6. 使用 --no-install-recommends 安装依赖
7. 避免安装不必要的包
Q5:Docker 容器的日志管理有哪些方案?
答:
1. Docker 内置日志驱动:
- json-file(默认)
- syslog
- journald
- fluentd
2. 日志收集方案:
- ELK(Elasticsearch + Logstash + Kibana)
- EFK(Elasticsearch + Fluentd + Kibana)
- Loki + Promtail
3. 日志最佳实践:
- 输出到 stdout/stderr
- 使用结构化日志(JSON)
- 配置日志轮转
- 设置合理的日志级别
Q6:如何实现 Docker 容器的数据持久化?
答:
1. Volume(数据卷):
- Docker 管理的存储区域
- 独立于容器生命周期
- 适合生产环境
2. Bind Mount(绑定挂载):
- 直接映射宿主机目录
- 适合开发环境
- 需要注意权限问题
3. tmpfs(临时文件系统):
- 存储在内存中
- 容器停止即丢失
- 适合敏感数据
15.3.3 架构设计题
Q7:如何设计一个高可用的 Docker 部署架构?
答:
1. 负载均衡:
- 使用 Nginx/HAProxy 做反向代理
- 配置健康检查和故障转移
2. 多副本部署:
- 每个服务运行多个实例
- 使用 Docker Swarm 或 Kubernetes 管理
3. 数据持久化:
- 使用分布式存储(Ceph、NFS)
- 配置数据备份和恢复策略
4. 监控告警:
- Prometheus + Grafana 监控
- 配置告警规则和通知
5. 灰度发布:
- 蓝绿部署或金丝雀发布
- 支持快速回滚
Q8:Docker 在微服务架构中的应用?
答:
1. 服务容器化:
- 每个微服务独立容器化
- 使用 Docker Compose 或 Kubernetes 编排
2. 服务发现:
- 使用 Docker DNS 或 Consul
- 配置服务注册和发现
3. 配置管理:
- 使用环境变量或配置中心
- 支持配置热更新
4. 日志聚合:
- 集中收集所有服务日志
- 使用 ELK 或 Loki 分析
5. 链路追踪:
- 使用 Jaeger 或 Zipkin
- 追踪请求调用链
15.3.4 安全相关题
Q9:Docker 安全最佳实践有哪些?
答:
1. 镜像安全:
- 使用可信的基础镜像
- 定期扫描漏洞
- 使用多阶段构建
2. 运行时安全:
- 不使用 root 用户运行
- 使用只读文件系统
- 限制 capabilities
3. 网络安全:
- 网络隔离
- 端口最小化
- 使用 TLS 加密
4. 密钥管理:
- 不在镜像中存储密钥
- 使用 Docker Secrets
- 使用外部密钥管理
5. 审计监控:
- 启用审计日志
- 监控容器行为
- 定期安全检查
Q10:如何防止容器逃逸?
答:
1. 不使用 --privileged 模式
2. 最小化 capabilities(--cap-drop ALL)
3. 使用 seccomp 限制系统调用
4. 使用 AppArmor/SELinux
5. 定期更新 Docker 和内核
6. 监控容器行为
7. 使用安全扫描工具
15.4 面试准备建议
15.4.1 技术深度
面试准备清单:
□ 基础概念
├── Docker 和虚拟机的区别
├── 镜像分层原理
├── 容器生命周期
└── 网络模式
□ 实践技能
├── Dockerfile 编写
├── Docker Compose 使用
├── 镜像构建优化
└── 容器管理
□ 进阶知识
├── 容器安全
├── 日志管理
├── 监控告警
└── CI/CD 集成
□ 架构设计
├── 高可用部署
├── 微服务架构
├── 灰度发布
└── 性能优化
15.4.2 实战经验
准备一些实战案例:
1. 描述一个你使用 Docker 部署的应用
- 架构设计
- 遇到的问题
- 解决方案
2. 描述一个 Docker 性能优化的案例
- 优化前的问题
- 优化方案
- 优化效果
3. 描述一个 Docker 安全加固的案例
- 安全风险
- 加固措施
- 效果验证
15.5 本章小结
| 内容 | 重点 |
|---|---|
| 故障排查 | 日志查看、网络诊断、资源检查 |
| 性能调优 | 镜像优化、资源限制、网络优化 |
| 面试题 | 基础概念、实践操作、架构设计、安全 |
15.6 课后练习
- 复习题:回顾整个文档系列,梳理知识体系。
- 模拟面试:找同事或朋友模拟 Docker 面试。
- 实战练习:完成一个完整的 Docker 项目部署。
🎉 恭喜你完成了企业级 Docker 实战教程的全部内容!
希望这份文档能帮助你从零基础到掌握 Docker 的核心技能。
祝你在容器化技术的道路上越走越远!