Docker容器化工作流 docker-workflow

Docker容器化工作流技能提供从开发到生产的完整容器化解决方案,涵盖多阶段构建、镜像优化、Docker Compose编排、调试技巧和生产部署最佳实践。适用于DevOps工程师、后端开发者和云原生应用部署,关键词包括Docker容器化、镜像优化、多阶段构建、Docker Compose、容器编排、云原生部署、DevOps工具链。

Docker/K8s 0 次安装 0 次浏览 更新于 3/2/2026

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: 优化

减少镜像大小

策略:

  1. 使用更小的基础镜像(alpine > slim > debian)
  2. 多阶段构建排除构建工具
  3. 合并RUN命令以减少层数
  4. 在同一层中清理
  5. 使用.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