第15章:docker故障排查与面试题

第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 课后练习

  1. 复习题:回顾整个文档系列,梳理知识体系。
  2. 模拟面试:找同事或朋友模拟 Docker 面试。
  3. 实战练习:完成一个完整的 Docker 项目部署。

🎉 恭喜你完成了企业级 Docker 实战教程的全部内容!

希望这份文档能帮助你从零基础到掌握 Docker 的核心技能。

祝你在容器化技术的道路上越走越远!

相关推荐
张忠琳14 分钟前
【k3s】AutoK3s v0.9.3 Part 1 入口与 CLI 命令模块 — 超深度逐行分析之三
云原生·容器·kubernetes·k3s·autok3s
我是谁??2 小时前
Ubuntu22.04更换清华源
linux·运维·服务器
不吃鱼的羊2 小时前
Git识别未修改的文件有修改
git
Shell运维手记3 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
2503_931712483 小时前
OpenInsight领衔:企业AI数据分析平台(Data Agent/智能问数/智能数据报告)
大数据
朴马丁3 小时前
国际与国产PLM在精细化工赛道的布局:2026年主要厂商技术特色
大数据·运维·人工智能·流程行业plm·化工新材料
~央千澈~4 小时前
从“拟声”到“生成”:AI音效背后的技术原理·优雅草AI音乐·AI音乐技术研究
大数据·人工智能·ai·音频
Elastic 中国社区官方博客4 小时前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索
测试运维日常笔记4 小时前
Linux系统安装配置TigerVNC服务器完整指南
linux·运维·服务器
阿里云大数据AI技术4 小时前
AI Search+ES 9.4.X最佳实践:“更快、更准、更安全的企业级搜索引擎”"为AI Agent提供坚实底座”
人工智能·elasticsearch·agent