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: bridge4. 容器监控和日志管理
问题:如何实现容器的监控和日志聚合?
参考答案:
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"]迁移步骤:
- 应用分析:依赖关系、数据存储、网络通信
- 容器化:Dockerfile 编写和镜像构建
- 配置外部化:环境变量和配置文件分离
- 数据持久化:数据卷和外部存储集成
- 监控集成:日志、监控、告警系统
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 的核心概念、最佳实践和实际应用场景,帮助候选人全面展示容器化技能和实战经验。
