name: docker-workflow description: 全面的Docker容器化工作流,涵盖多阶段构建、docker-compose编排、镜像优化、调试和生产最佳实践。适用于容器化应用程序、设置开发环境或使用Docker部署时使用。
Docker工作流 (来源: AutumnsGrove)
概述
Docker容器化通过将应用程序及其依赖项打包到可移植、可复现的容器中,简化了开发、测试和部署流程。本技能将指导您从开发到生产的专业Docker工作流。
核心能力
- 多阶段构建: 分离构建和运行时依赖,实现最优镜像大小
- Docker Compose编排: 通过网络和依赖关系管理多容器应用程序
- 镜像优化: 通过最佳实践将镜像大小减少50-90%
- 开发工作流: 热重载、卷挂载和环境特定配置
- 调试工具: 容器检查、健康检查和故障排除实用程序
- 生产就绪: 安全加固、健康检查和部署策略
何时使用此技能
在以下情况激活:
- 容器化新应用程序
- 使用Docker设置开发环境
- 创建生产就绪的Docker镜像
- 编排多容器应用程序
- 调试容器问题
- 优化Docker构建和镜像
工作流阶段
阶段1: 初始设置
创建 .dockerignore
从构建上下文中排除不必要的文件:
node_modules/
__pycache__/
*.pyc
.git/
.env
*.log
dist/
build/
coverage/
查看 examples/.dockerignore 获取完整模板。
关键原则:
- 排除构建产物和依赖项
- 排除敏感文件(.env, 凭证)
- 排除版本控制(.git)
- 更小的上下文 = 更快的构建
分析应用程序需求
确定:
- 运行时(Node.js, Python, Go, Java)
- 依赖项和包管理器
- 构建与运行时需求
- 端口暴露和卷需求
阶段2: 多阶段Dockerfile
选择策略
多阶段构建可将最终镜像大小减少50-90%:
# 阶段1: 构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 阶段2: 生产
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
查看 examples/Dockerfile.multi-stage 获取Node.js、Python、Go、Java和Rust的模板。
优化层缓存
顺序很重要 - 将变化的内容放在最后:
# ✅ 良好: 依赖项单独缓存
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
# ❌ 不佳: 任何文件更改都会使缓存失效
COPY . .
RUN npm ci
应用安全最佳实践
# 使用特定版本
FROM node:18.17.1-alpine
# 以非root用户运行
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
USER nodejs
# 带所有权的复制
COPY --chown=nodejs:nodejs . .
安全检查清单:
- 固定基础镜像版本
- 使用最小基础镜像(alpine, slim)
- 以非root用户运行
- 扫描漏洞
- 最小化安装包
阶段3: Docker Compose设置
定义服务
创建 docker-compose.yml:
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://db:5432/myapp
depends_on:
db:
condition: service_healthy
volumes:
- ./src:/app/src # 开发热重载
networks:
- app-network
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: myapp
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 5s
networks:
- app-network
volumes:
postgres-data:
networks:
app-network:
查看 examples/docker-compose.yml 获取包含监控、队列和缓存的完整功能设置。
环境配置
为不同环境使用覆盖文件:
开发环境 (docker-compose.override.yml):
services:
app:
build:
target: development
volumes:
- ./src:/app/src
environment:
- NODE_ENV=development
command: npm run dev
生产环境 (docker-compose.prod.yml):
services:
app:
build:
target: production
restart: always
environment:
- NODE_ENV=production
用法:
# 开发环境(自动使用覆盖文件)
docker-compose up
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
阶段4: 构建和运行
构建命令
# 基础构建
docker build -t myapp:latest .
# 构建特定阶段
docker build --target production -t myapp:prod .
# 使用BuildKit构建(更快)
DOCKER_BUILDKIT=1 docker build -t myapp:latest .
运行命令
# 单容器
docker run -d -p 3000:3000 -e NODE_ENV=production myapp:latest
# Docker Compose
docker-compose up -d
# 查看日志
docker-compose logs -f app
# 在容器中执行
docker-compose exec app sh
# 停止并移除
docker-compose down -v
阶段5: 调试和故障排除
使用辅助脚本
scripts/docker_helper.sh 实用程序提供常见的调试操作:
# 检查容器健康状态
./scripts/docker_helper.sh health myapp
# 检查详细信息
./scripts/docker_helper.sh inspect myapp
# 查看日志
./scripts/docker_helper.sh logs myapp 200
# 打开shell
./scripts/docker_helper.sh shell myapp
# 分析镜像大小
./scripts/docker_helper.sh size myapp:latest
# 清理资源
./scripts/docker_helper.sh cleanup
常见问题
容器立即退出:
docker logs myapp
docker run -it --entrypoint sh myapp:latest
网络连接:
docker network inspect myapp_default
docker exec myapp ping db
卷权限:
# 在Dockerfile中修复
RUN chown -R nodejs:nodejs /app/data
阶段6: 优化
减少镜像大小
策略:
- 使用更小的基础镜像(alpine > slim > debian)
- 多阶段构建排除构建工具
- 合并RUN命令以减少层数
- 在同一层中清理
- 使用.dockerignore
示例:
# ✅ 良好: 合并、清理
RUN apt-get update && \
apt-get install -y --no-install-recommends package1 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
构建性能
# 启用BuildKit
export DOCKER_BUILDKIT=1
# 使用缓存挂载
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
# 并行构建
docker-compose build --parallel
阶段7: 生产部署
生产Dockerfile
FROM node:18-alpine AS production
# 安全: 非root用户
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
WORKDIR /app
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
USER nodejs
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD node healthcheck.js
EXPOSE 3000
CMD ["node", "dist/index.js"]
部署命令
# 为注册表打标签
docker tag myapp:latest registry.example.com/myapp:v1.0.0
# 推送到注册表
docker push registry.example.com/myapp:v1.0.0
# 部署
docker-compose pull && docker-compose up -d
# 滚动更新
docker-compose up -d --no-deps --build app
常见模式
全栈应用程序
- 前端 + 后端 + 数据库 + Redis
- 查看
examples/docker-compose.yml
微服务
- API网关 + 多个服务 + 消息队列
- 网络隔离和服务发现
带热重载的开发
- 源代码的卷挂载
- 开发配置的覆盖文件
最佳实践总结
安全
✅ 使用特定镜像版本,而非 latest
✅ 以非root用户运行
✅ 对敏感数据使用密钥管理
✅ 扫描镜像漏洞
✅ 使用最小基础镜像
性能
✅ 使用多阶段构建 ✅ 优化层缓存 ✅ 使用.dockerignore ✅ 合并RUN命令 ✅ 使用BuildKit
开发
✅ 对多容器应用使用docker-compose ✅ 对热重载使用卷 ✅ 实施健康检查 ✅ 使用正确的依赖顺序
生产
✅ 设置重启策略 ✅ 使用编排(Swarm, Kubernetes) ✅ 通过健康检查监控 ✅ 使用反向代理 ✅ 实施滚动更新
辅助资源
- scripts/docker_helper.sh: 容器检查、健康检查、自动化
- examples/Dockerfile.multi-stage: Node.js、Python、Go、Java、Rust模板
- examples/docker-compose.yml: 完整功能的多服务设置
- examples/.dockerignore: 全面的忽略模式
快速参考
基本命令
# 构建
docker build -t myapp .
docker-compose build
# 运行
docker run -d -p 3000:3000 myapp
docker-compose up -d
# 日志
docker logs -f myapp
docker-compose logs -f
# 执行
docker exec -it myapp sh
docker-compose exec app sh
# 停止
docker-compose down
# 清理
docker system prune -a
调试
# 检查
docker inspect myapp
# 统计
docker stats myapp
# 网络
docker network inspect bridge
# 卷
docker volume ls