第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 的核心技能。

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

相关推荐
山川而川-R1 小时前
dify、docker、Git在Windows安装教程_26.7.3
git
洪恒远1 小时前
Windows 配置 Gerrit SSH Key
运维·ssh
2601_956865772 小时前
AI企业内训的“效果转化”密码:从“学AI”到“用AI”的机构能力拆解
大数据·人工智能
云飞云共享云桌面2 小时前
搭建10人SolidWorks云设计环境:云飞云在非标自动化工厂的实测方案
运维·服务器·网络·数据库·自动化·电脑
A-刘晨阳2 小时前
关键基础设施安全底座:自主可控时序大模型TimechoAI的国产化实践与深度时序分析能力
大数据·数据库·安全·时序数据库
江畔柳前堤2 小时前
第07章:Docker 网络模型
运维·网络·git·elasticsearch·docker·容器·架构
深盾科技_Virbox2 小时前
Virbox Protector 从何而来:深盾科技的软件保护演进
运维·数据库·科技
是个西兰花2 小时前
Linux:进程信号
linux·运维·服务器
云飞云共享云桌面2 小时前
智能装备制造数字化实测:10人SolidWorks云桌面部署,云飞云方案替代传统单机工作站
运维·服务器·网络·人工智能·制造