Skip to content

Docker 最佳实践面试题

Docker 最佳实践是现代容器化开发的核心技能,涵盖镜像构建、安全性、性能优化等关键方面。

🔥 核心面试题

1. Docker 镜像优化策略

问题:如何优化 Docker 镜像大小和构建时间?请详细说明你使用过的优化技术。

参考答案

dockerfile
# 多阶段构建示例
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:18-alpine AS runtime
# 使用非root用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app .
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]

核心优化技术

  • 多阶段构建:分离编译环境和运行环境,减少最终镜像大小
  • 基础镜像选择:使用 Alpine 镜像(5MB vs 900MB+)
  • 层缓存优化:合理排序 COPY 命令,利用Docker层缓存
  • .dockerignore:排除不必要文件,减少构建上下文

2. Docker 安全最佳实践

问题:在生产环境中,你会采取哪些 Docker 安全措施?

参考答案

dockerfile
# Dockerfile 安全实践
FROM python:3.11-slim
# 创建非root用户
RUN groupadd -r appuser && useradd -r -g appuser appuser

# 安装依赖并清理
RUN pip install --no-cache-dir requirements.txt \
    && apt-get purge -y --auto-remove \
    && rm -rf /var/lib/apt/lists/*

# 设置用户权限
COPY --chown=appuser:appuser . /app
USER appuser
WORKDIR /app

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8000/health || exit 1

EXPOSE 8000

核心安全措施

  • 非root用户运行:避免容器内权限提升
  • 镜像扫描:使用 Trivy、Clair 扫描漏洞
  • 资源限制:CPU/内存限制防止资源耗尽
  • 只读根文件系统--read-only 防止恶意文件写入

3. Docker Compose 高级配置

问题:如何使用 Docker Compose 管理复杂的微服务架构?

参考答案

yaml
version: '3.8'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.prod
    ports:
      - "80:8000"
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/app
    depends_on:
      db:
        condition: service_healthy
    networks:
      - app-network
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d app"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - app-network

  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - app-network

volumes:
  postgres_data:
  redis_data:

networks:
  app-network:
    driver: bridge

4. 容器监控和日志管理

问题:如何实现容器的监控和日志聚合?

参考答案

bash
# 容器资源监控
docker stats --no-stream

# 日志管理最佳实践
docker run -d \
  --name app \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest

# ELK Stack 日志聚合
version: '3.8'
services:
  app:
    image: myapp:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    labels:
      - "logging.driver=fluentd"
      - "logging.fluentd.address=fluentd:24224"

监控策略

  • 健康检查:应用级和基础设施级检查
  • 资源监控:CPU、内存、网络、磁盘使用率
  • 日志聚合:ELK Stack 或 Fluentd + Prometheus
  • 告警机制:基于阈值的自动告警

💡 高级面试题

5. Docker 网络深度解析

问题:解释 Docker 网络模式的区别,以及在微服务架构中的应用场景。

参考答案

bash
# 创建自定义网络
docker network create --driver bridge \
  --subnet=172.20.0.0/16 \
  --gateway=172.20.0.1 \
  microservices-net

# 服务发现示例
docker run -d --name service-a \
  --network microservices-net \
  --network-alias api \
  service-a:latest

docker run -d --name service-b \
  --network microservices-net \
  service-b:latest

网络模式对比

  • Bridge:默认模式,容器间通过内部网络通信
  • Host:共享宿主机网络栈,性能最佳但隔离性差
  • None:完全隔离,常用于安全敏感场景
  • Overlay:跨主机容器通信,用于Docker Swarm

6. 容器编排策略对比

问题:Docker Swarm vs Kubernetes:各自适用场景和架构差异?

参考答案

Docker Swarm 优势

  • 简单易用,学习曲线平缓
  • 与 Docker 原生集成
  • 适合小到中型应用

Kubernetes 优势

  • 功能丰富,扩展性强
  • 云原生生态完善
  • 企业级特性支持
bash
# Docker Swarm 部署
docker swarm init
docker service create --name web \
  --replicas 3 \
  --publish 80:80 \
  nginx:latest

# Kubernetes 部署
kubectl create deployment web --image=nginx:latest
kubectl scale deployment web --replicas=3
kubectl expose deployment web --port=80 --type=LoadBalancer

🚀 实战场景题

7. 容器化迁移策略

问题:如何将传统单体应用迁移到容器化架构?请描述完整的迁移方案。

参考答案

dockerfile
# 阶段1:Lift and Shift
FROM openjdk:11-jre-slim
COPY app.jar /app/
EXPOSE 8080
CMD ["java", "-jar", "/app/app.jar"]

# 阶段2:优化和分离
FROM openjdk:11-jre-slim
RUN adduser --disabled-password --gecos '' appuser
COPY --chown=appuser:appuser app.jar /app/
USER appuser
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/health
EXPOSE 8080
CMD ["java", "-Xms256m", "-Xmx512m", "-jar", "/app/app.jar"]

迁移步骤

  1. 应用分析:依赖关系、数据存储、网络通信
  2. 容器化:Dockerfile 编写和镜像构建
  3. 配置外部化:环境变量和配置文件分离
  4. 数据持久化:数据卷和外部存储集成
  5. 监控集成:日志、监控、告警系统

8. 多环境部署管理

问题:如何使用 Docker 管理开发、测试、生产多环境部署?

参考答案

yaml
# docker-compose.override.yml (开发环境)
version: '3.8'
services:
  web:
    build:
      target: development
    volumes:
      - ./src:/app/src
    environment:
      - NODE_ENV=development
      - DEBUG=true

# docker-compose.prod.yml (生产环境)
version: '3.8'
services:
  web:
    image: myapp:${IMAGE_TAG}
    restart: unless-stopped
    environment:
      - NODE_ENV=production
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: '0.5'

这些面试题涵盖了 Docker 的核心概念、最佳实践和实际应用场景,帮助候选人全面展示容器化技能和实战经验。

正在精进