Docker 容器进阶面试题及答案
1. Docker 的联合文件系统(UnionFS)是如何工作的?
答案:
- 原理:联合文件系统通过分层叠加实现,每个镜像层是只读的,容器层是可写的。
- 镜像层:由 Dockerfile 的每条指令生成,不可修改。
- 容器层:在镜像层之上添加可写层,所有修改(如文件写入)在此层进行。
- 优势:节省存储空间(多个镜像共享基础层),提高构建效率。
2. 如何配置容器的健康检查(Health Check)?
答案:
在 Dockerfile 或 docker run
中定义健康检查指令:
# Dockerfile 示例
HEALTHCHECK --interval=30s --timeout=3s \CMD curl -f http://localhost:8080/health || exit 1
# 运行命令示例
docker run --health-cmd="curl -f http://localhost || exit 1" --health-interval=5s nginx
3. Docker 的 Overlay 网络是如何实现跨主机通信的?
答案:
- 原理:使用 VXLAN 协议封装数据包,跨主机传输容器流量。
- 配置步骤:
- 初始化 Docker Swarm:
docker swarm init
- 创建 Overlay 网络:
docker network create -d overlay my-overlay
- 将服务连接到网络:
docker service create --network my-overlay nginx
- 初始化 Docker Swarm:
4. 如何优化 Docker 镜像的体积?
答案:
- 多阶段构建:分离编译环境和运行环境。
- 基础镜像选择:使用 Alpine Linux 等轻量镜像。
- 清理缓存:在
RUN
指令中合并命令并清理临时文件:RUN apt-get update && apt-get install -y package \&& apt-get clean \&& rm -rf /var/lib/apt/lists/*
- 使用
.dockerignore
文件:排除不必要的文件。
5. 解释 Docker 的默认桥接网络(bridge)和主机网络(host)的区别。
答案:
- bridge 模式:
- 容器通过虚拟网桥(
docker0
)连接到宿主机。 - 需要端口映射(
-p
)才能从宿主机外部访问容器。
- 容器通过虚拟网桥(
- host 模式:
- 容器直接使用宿主机的网络命名空间,无需端口映射。
- 性能更高,但牺牲了网络隔离性。
6. 如何动态调整容器的资源限制(如 CPU 和内存)?
答案:
使用 docker update
命令:
docker update --cpus 2 --memory 1g container_name
7. 什么是 Docker 的 BuildKit?它有哪些优势?
答案:
- BuildKit:Docker 的下一代镜像构建工具,替代传统构建引擎。
- 优势:
- 并行构建层,提升构建速度。
- 缓存管理更高效(仅重建变化的层)。
- 支持密钥安全管理(如
--secret
参数)。
- 启用方式:
export DOCKER_BUILDKIT=1 docker build -t my-image .
8. 如何备份和恢复 Docker 卷(Volume)?
答案:
- 备份:
docker run --rm -v volume_name:/data -v $(pwd):/backup busybox \tar czvf /backup/volume_backup.tar.gz /data
- 恢复:
docker run --rm -v volume_name:/data -v $(pwd):/backup busybox \tar xzvf /backup/volume_backup.tar.gz -C /data
9. 如何实现 Docker 容器的日志轮转(Log Rotation)?
答案:
配置 Docker Daemon 的日志驱动和参数(/etc/docker/daemon.json
):
{"log-driver": "json-file","log-opts": {"max-size": "10m","max-file": "3"}
}
10. 如何排查容器内应用性能问题?
答案:
- 容器内工具:
docker exec -it container_id top # 查看进程资源占用 docker exec -it container_id free -h # 查看内存使用
- 宿主机工具:
docker stats # 实时监控容器资源 perf top -p $(docker inspect -f '{{.State.Pid}}' container_id) # 分析容器进程性能
11. 如何限制容器访问特定外部 IP 地址?
答案:
使用 iptables
规则控制容器网络流量:
# 允许容器访问 8.8.8.8
iptables -A DOCKER -s <container_ip> -d 8.8.8.8 -j ACCEPT
# 拒绝其他所有外部流量
iptables -A DOCKER -s <container_ip> ! -d 8.8.8.8 -j DROP
12. 解释 Docker Swarm 的服务发现和负载均衡机制。
答案:
- 服务发现:Swarm 通过内置 DNS 服务器将服务名称解析为 VIP(虚拟 IP)。
- 负载均衡:
- Ingress 模式:外部请求通过 Swarm 的路由网格(Routing Mesh)分发到所有节点。
- Host 模式:直接访问节点 IP 和端口,无负载均衡。
13. 如何为 Docker 容器设置环境变量?有哪些方式?
答案:
- Dockerfile:
ENV KEY=value
- 命令行:
docker run -e KEY=value my-image
- 文件注入:
docker run --env-file .env my-image
14. 如何监控 Docker 容器和宿主机的资源使用情况?
答案:
- 内置命令:
docker stats
- 第三方工具:
- cAdvisor:容器资源监控和可视化。
- Prometheus + Grafana:构建监控仪表盘。
- Datadog:云原生监控平台。
15. 如何处理容器中的僵尸进程(Zombie Processes)?
答案:
- 原因:父进程未正确回收子进程资源。
- 解决方案:
- 在容器中使用
init
进程(如tini
):ENTRYPOINT ["/usr/bin/tini", "--"] CMD ["my-app"]
- 启动容器时添加
--init
参数:docker run --init my-image
- 在容器中使用
16. 如何配置容器的 OOM(内存不足)保护?
答案:
通过 --oom-kill-disable
和内存限制参数:
docker run -m 512m --oom-kill-disable my-image
# 注意:禁用 OOM Killer 需谨慎,可能导致宿主机不稳定
17. 如何实现 Docker 容器的零停机部署?
答案:
- 滚动更新(Docker Swarm 或 Kubernetes):
docker service update --image my-image:2.0 --update-parallelism 2 --update-delay 10s my-service
- 蓝绿部署:通过负载均衡切换新旧版本容器。
18. 如何调试 Docker 容器的网络问题?
答案:
- 容器内网络诊断:
docker exec -it container_id ping 8.8.8.8 # 测试连通性 docker exec -it container_id netstat -tuln # 查看端口监听
- 宿主机检查:
iptables -L -n -v # 查看防火墙规则 tcpdump -i docker0 port 80 # 抓取网桥流量
19. 如何配置私有 Docker 镜像仓库(Registry)?
答案:
- 启动 Registry 容器:
docker run -d -p 5000:5000 --name registry registry:2
- 推送镜像到私有仓库:
docker tag my-image localhost:5000/my-image docker push localhost:5000/my-image
- 配置 TLS 认证(生产环境必选)。
20. Docker 与 Kubernetes 的关系是什么?如何选择?
答案:
- Docker:容器运行时工具,用于构建、分发和运行单个容器。
- Kubernetes:容器编排平台,管理跨主机的容器集群(调度、扩缩容、自愈)。
- 选择场景:
- 单机或简单应用:使用 Docker 或 Docker Compose。
- 大规模集群:结合 Kubernetes 实现自动化管理。