容器运维面试题
核心定位 本文整理容器运维常见面试题,重点覆盖镜像分层、Dockerfile、容器运行时、CGroup、网络、挂载、日志、磁盘清理和生产排障。
1. 容器和虚拟机有什么区别
1.1. 参考答案
| 对比项 | 容器 | 虚拟机 |
|---|---|---|
| 隔离层级 | 操作系统级隔离 | 硬件虚拟化隔离 |
| 内核 | 共享宿主机内核 | 每台虚拟机有独立内核 |
| 启动速度 | 秒级或更快 | 通常较慢 |
| 资源开销 | 较低 | 较高 |
| 镜像体积 | 通常较小 | 通常较大 |
| 隔离强度 | 弱于虚拟机 | 强于容器 |
容器通过 Namespace 隔离视图,通过 CGroup 限制资源,通过联合文件系统实现镜像分层和容器可写层。
2. Docker 镜像为什么可以复用层
2.1. 参考答案
Docker 镜像由多个只读层组成。不同镜像如果使用相同基础层,可以共享本地已有 layer。容器启动时不会复制完整镜像,而是在只读镜像层上增加一个可写容器层。
核心机制:
- 镜像层只读共享。
- 容器层保存运行时变更。
- 修改只读层文件时触发写时复制。
- 删除只读层文件时通过 whiteout 标记隐藏。
3. Dockerfile 如何优化构建速度和镜像体积
3.1. 参考答案
优化原则:
- 使用
.dockerignore减少构建上下文。 - 稳定指令放前面,频繁变化的源码放后面。
- 依赖安装与缓存清理放在同一个
RUN中。 - 使用更小且合适的基础镜像。
- 使用多阶段构建,只保留运行时需要的文件。
- 不把密钥、日志、临时文件打入镜像。
示例:
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "server.js"]
4. Docker CGroup 资源限制怎么做
4.1. 参考答案
常见参数:
| 参数 | 作用 |
|---|---|
--memory / -m | 限制最大内存 |
--memory-swap | 限制内存 + Swap 总量 |
--cpus | 限制 CPU 硬上限 |
--cpu-shares | CPU 竞争时的相对权重 |
--cpuset-cpus | 绑定指定 CPU 核心 |
--pids-limit | 限制进程数量 |
--blkio-weight | 设置磁盘 IO 权重 |
示例:
docker run -d \
--memory=512m \
--memory-swap=512m \
--cpus=1 \
--pids-limit=200 \
nginx
5. 容器数据为什么不建议写在容器层
5.1. 参考答案
容器层随容器生命周期存在。删除容器后,容器层中的数据也会丢失。因此数据库文件、上传文件、业务日志等需要持久化的数据,应使用 volume 或 bind mount。
| 挂载方式 | 适用场景 |
|---|---|
| volume | 生产持久化数据 |
| bind mount | 本地调试、挂载配置文件 |
| tmpfs | 临时敏感数据或高速临时缓存 |
6. 容器网络常见模式有哪些
6.1. 参考答案
Docker 常见网络模式:
| 模式 | 说明 | 场景 |
|---|---|---|
| bridge | 默认桥接网络,通过 veth + bridge 转发 | 单机容器 |
| host | 共享宿主机网络命名空间 | 高性能或特殊网络需求 |
| none | 无网络 | 安全隔离或手动配置 |
| overlay | 跨主机容器网络 | Swarm 或多主机场景 |
| container | 共享另一个容器网络命名空间 | sidecar 模式 |
生产排查时重点关注容器 IP、宿主机 NAT、端口映射、防火墙和 DNS。
7. 容器磁盘爆满怎么排查
7.1. 参考答案
排查顺序:
- 查看 Docker 整体占用。
- 查看镜像、容器、卷和构建缓存占用。
- 查找大日志文件。
- 清理无用镜像、停止容器和 build cache。
- 对容器日志配置轮转。
常用命令:
docker system df
docker ps -a
docker images
docker volume ls
docker builder prune
清理前应确认镜像、容器和数据卷是否仍被业务使用,避免误删数据。
8. 容器启动失败怎么排查
8.1. 参考答案
排查顺序:
- 查看容器状态和退出码。
- 查看容器日志。
- 检查启动命令、环境变量和挂载路径。
- 检查端口冲突和权限问题。
- 检查镜像架构是否匹配宿主机。
命令:
docker ps -a
docker logs <container_id>
docker inspect <container_id>
docker events --since 10m
9. 容器日志过大怎么处理
9.1. 参考答案
Docker 默认 json-file 日志驱动可能导致单容器日志文件过大。生产环境应配置日志轮转。
示例 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
修改后需要重启 Docker,并重新创建容器才能对新容器生效。
10. 面试总结
标准回答 容器运维需要理解 Namespace、CGroup、联合文件系统、镜像分层、Dockerfile 构建、网络、挂载和日志。Namespace 负责隔离视图,CGroup 负责限制资源,UnionFS 支撑镜像分层和写时复制。生产排障时,应从容器状态、日志、资源限制、网络连通、挂载路径、磁盘空间和镜像构建过程逐层定位。关键数据不要写入容器层,应使用 volume 或外部存储,并对日志和镜像缓存建立清理策略。
关联文档
- Docker 联合文件系统:理解镜像层、容器层和写时复制机制。
- Dockerfile 构建原理 + 镜像分层优化:理解镜像构建和层缓存优化。
- Docker CGroup 资源限制原理:理解容器 CPU、内存、IO 和进程限制。
- Docker 三种挂载:理解容器数据持久化边界。
- Docker 磁盘爆满排查与清理:排查镜像、日志、数据卷和构建缓存占用。
