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 题详解

发表回复

后才能评论