DevOps 面试题大全(二):Docker 容器技术 50 题详解
前言
Docker 是 DevOps 工程师的核心技能之一。本文整理了 50 道 Docker 面试题,包含详细答案和解析,从基础概念到高级应用,帮助你全面掌握 Docker 技术。
一、基础概念题(1-15 题)
1. 什么是 Docker?它和虚拟机有什么区别?
# Docker 定义:
Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到轻量级容器中。
# Docker vs 虚拟机:
| 特性 | Docker 容器 | 虚拟机 |
|------|------------|--------|
| 启动速度 | 秒级 | 分钟级 |
| 体积 | MB 级别 | GB 级别 |
| 性能 | 接近原生 | 有损耗 |
| 隔离性 | 进程级隔离 | 完全隔离 |
| 操作系统 | 共享宿主机内核 | 独立操作系统 |
| 资源占用 | 低 | 高 |
# Docker 优势:
- 轻量级,资源占用少
- 启动快,秒级启动
- 一致的运行环境
- 便于持续集成和部署
2. 解释 Docker 的核心概念
# 核心概念:
1. 镜像(Image)
- 只读模板,包含运行应用所需的代码、库、环境变量等
- 类似虚拟机的快照
- 分层存储,节省空间
2. 容器(Container)
- 镜像的运行实例
- 可以被创建、启动、停止、删除
- 拥有独立的文件系统、网络和进程空间
3. Dockerfile
- 构建镜像的脚本
- 包含一系列构建指令
- 版本控制,可重复构建
4. Docker Registry
- 存储和分发镜像的服务
- 公共 Registry:Docker Hub
- 私有 Registry:企业自建
5. Docker Compose
- 定义和运行多容器应用
- 使用 YAML 文件配置
- 一键启动整个应用栈
3. Docker 的架构是怎样的?
# Docker 架构组件:
1. Docker Daemon (dockerd)
- 后台服务,管理 Docker 对象
- 监听 API 请求
- 管理镜像、容器、网络、卷
2. Docker Client
- 命令行工具,用户与 Docker 交互
- 通过 REST API 与 Daemon 通信
- 可以远程连接 Daemon
3. Docker Registry
- 存储镜像
- Docker Hub(公共)
- 私有 Registry
4. Docker Objects
- Images(镜像)
- Containers(容器)
- Networks(网络)
- Volumes(卷)
- Plugins(插件)
# 工作流程:
用户 → Docker Client → REST API → Docker Daemon → 创建/管理容器
4. 如何安装 Docker?
# CentOS/RHEL 安装:
# 1. 卸载旧版本
sudo yum remove docker docker-client docker-common
# 2. 安装 yum 工具包
sudo yum install -y yum-utils
# 3. 设置仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io
# 5. 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
# 6. 验证安装
docker --version
docker run hello-world
# Ubuntu 安装:
# 1. 更新包索引
sudo apt-get update
# 2. 安装依赖
sudo apt-get install ca-certificates curl gnupg lsb-release
# 3. 添加 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. 设置仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
# 5. 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6. 验证
docker --version
5. 常用的 Docker 命令有哪些?
# 镜像管理:
docker pull nginx # 拉取镜像
docker push nginx # 推送镜像
docker images # 查看镜像
docker rmi nginx # 删除镜像
docker build -t myapp . # 构建镜像
docker tag nginx myapp:1.0 # 标记镜像
# 容器管理:
docker run -d nginx # 运行容器
docker ps # 查看运行容器
docker ps -a # 查看所有容器
docker stop container_id # 停止容器
docker start container_id # 启动容器
docker restart container_id # 重启容器
docker rm container_id # 删除容器
docker exec -it container bash # 进入容器
docker logs container_id # 查看日志
docker inspect container_id # 查看详细信息
# 系统管理:
docker info # 查看系统信息
docker version # 查看版本
docker system prune # 清理资源
docker network ls # 查看网络
docker volume ls # 查看卷
6. Dockerfile 常用指令有哪些?
# Dockerfile 示例:
FROM ubuntu:20.04 # 基础镜像
LABEL maintainer="user@example.com" # 元数据
ENV APP_HOME=/app # 环境变量
WORKDIR $APP_HOME # 工作目录
COPY . . # 复制文件
ADD archive.tar.gz /tmp/ # 解压复制
RUN apt-get update && \ # 运行命令
apt-get install -y python3
EXPOSE 8080 # 暴露端口
CMD ["python3", "app.py"] # 默认命令
ENTRYPOINT ["python3"] # 入口点
VOLUME ["/data"] # 数据卷
USER appuser # 切换用户
ARG BUILD_VERSION=1.0 # 构建参数
HEALTHCHECK CMD curl -f http://localhost/ || exit 1 # 健康检查
7. 如何优化 Docker 镜像大小?
# 优化策略:
1. 使用小的基础镜像
FROM alpine:latest # 5MB
FROM debian:slim # 80MB
FROM ubuntu:latest # 150MB
2. 多阶段构建
FROM golang:1.19 AS builder
RUN go build -o app
FROM alpine:latest
COPY --from=builder /app /app
CMD ["/app"]
3. 合并 RUN 指令
RUN apt-get update && \
apt-get install -y pkg1 pkg2 && \
rm -rf /var/lib/apt/lists/*
4. 使用 .dockerignore
.git
node_modules
*.log
.env
5. 清理缓存
RUN apt-get clean && rm -rf /var/cache/*
6. 避免安装不必要的包
只安装生产环境需要的包
8-15. 更多基础题(简略版)
| 题号 | 题目 | 关键点 |
|---|---|---|
| 8 | Docker 容器状态有哪些? | created, running, paused, stopped, exited, dead |
| 9 | 如何查看容器日志? | docker logs -f --tail 100 |
| 10 | 如何进入运行中的容器? | docker exec -it container bash |
| 11 | 如何复制文件到容器? | docker cp file container:/path |
| 12 | 如何查看容器资源使用? | docker stats |
| 13 | Docker 网络模式有哪些? | bridge, host, none, container |
| 14 | 什么是 Docker 卷? | 持久化存储,数据共享 |
| 15 | 如何清理 Docker 资源? | docker system prune -a |
二、进阶实战题(16-35 题)
16. Docker 网络模式详解
# Docker 网络模式:
1. Bridge 模式(默认)
docker run --network bridge nginx
- 容器有独立 IP
- 通过网桥与宿主机通信
- 端口映射:-p 8080:80
2. Host 模式
docker run --network host nginx
- 容器共享宿主机网络
- 无网络隔离
- 性能最好
3. None 模式
docker run --network none nginx
- 无网络
- 只有 lo 回环接口
- 完全隔离
4. Container 模式
docker run --network container:container1 nginx
- 共享其他容器的网络
- 相同 IP 和端口
5. 自定义网络
docker network create mynet
docker run --network mynet nginx
- DNS 解析
- 网络隔离
- 灵活配置
17. Docker 数据卷管理
# 创建卷
docker volume create myvol
# 查看卷
docker volume ls
docker volume inspect myvol
# 使用卷
docker run -d -v myvol:/data nginx
docker run -d --mount source=myvol,target=/data nginx
# 绑定挂载
docker run -d -v /host/path:/container/path nginx
# 只读挂载
docker run -d -v /data:/app:ro nginx
# 删除卷
docker volume rm myvol
docker volume prune # 删除未使用的卷
# 卷的类型:
1. 命名卷:docker volume create
2. 匿名卷:-v /path
3. 绑定挂载:-v /host:/container
18. Docker Compose 使用
# docker-compose.yml 示例:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
networks:
- app-network
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydb
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
volumes:
db-data:
networks:
app-network:
driver: bridge
# 常用命令:
docker-compose up -d # 启动
docker-compose down # 停止
docker-compose ps # 查看状态
docker-compose logs -f # 查看日志
docker-compose restart # 重启
docker-compose build # 构建
19-35. 更多进阶题(简略)
| 题号 | 题目 | 关键点 |
|---|---|---|
| 19 | 多阶段构建示例 | builder + runtime |
| 20 | Docker 健康检查 | HEALTHCHECK 指令 |
| 21 | 容器重启策略 | --restart always |
| 22 | 限制容器资源 | --memory, --cpus |
| 23 | 私有 Registry 配置 | registry 镜像 |
| 24 | Docker 安全最佳实践 | 非 root 用户,扫描漏洞 |
| 25 | 容器间通信 | 自定义网络,DNS |
| 26 | Docker 日志驱动 | json-file, syslog, journald |
| 27 | 镜像分层原理 | UnionFS, CoW |
| 28 | Docker 存储驱动 | overlay2, aufs, devicemapper |
三、高级架构题(36-50 题)
36. Docker 生产环境部署方案
# 生产环境最佳实践:
1. 镜像安全
- 使用官方或可信镜像
- 定期扫描漏洞:docker scan
- 使用最小化基础镜像
- 签名验证
2. 资源限制
docker run -d \
--memory="512m" \
--cpus="1.0" \
--restart=always \
nginx
3. 日志管理
- 配置日志驱动
- 设置日志轮转
- 集中日志收集
4. 数据持久化
- 使用卷而非绑定挂载
- 定期备份卷数据
- 使用分布式存储
5. 网络隔离
- 自定义网络
- 限制容器间通信
- 使用防火墙规则
6. 监控告警
- Prometheus + Grafana
- 容器指标监控
- 日志分析
7. 高可用
- Docker Swarm 或 K8s
- 多副本部署
- 健康检查
37-50. 高级题(简略)
| 题号 | 题目 |
|---|---|
| 37 | Docker Swarm 架构 |
| 38 | 容器编排方案对比 |
| 39 | Docker 性能优化 |
| 40 | 容器安全加固 |
| 41 | CI/CD 集成 Docker |
| 42 | 镜像仓库管理 |
| 43 | 容器网络故障排查 |
| 44 | 容器存储故障排查 |
| 45 | Docker 故障排查工具 |
| 46 | 容器化迁移策略 |
| 47 | 微服务容器化 |
| 48 | Docker 最佳实践 |
| 49 | Docker 未来趋势 |
| 50 | Docker vs Kubernetes |
总结
本文整理了 50 道 Docker 面试题,涵盖基础概念、进阶实战和高级架构。掌握这些知识点,足以应对 DevOps 面试中的 Docker 相关问题。
下一篇预告:DevOps 面试题大全(三):Kubernetes 容器编排 50 题详解
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。




