Docker容器化工作流Skill docker-workflow

本技能提供全面的Docker容器化工作流指南,涵盖多阶段构建、Docker Compose编排、镜像优化、调试技巧和生产部署最佳实践。适用于开发人员、DevOps工程师和系统管理员,帮助实现应用程序的快速容器化、环境标准化和高效部署。关键词:Docker容器化、多阶段构建、Docker Compose、镜像优化、容器编排、DevOps部署、云原生应用、微服务架构、容器安全、生产环境配置。

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

name: docker-workflow description: 全面的Docker容器化工作流,涵盖多阶段构建、docker-compose编排、镜像优化、调试和生产最佳实践。适用于容器化应用程序、设置开发环境或使用Docker部署时。

Docker工作流

概述

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