mcpField
D
docker-compose

docker-compose

github.com/bagelhole云与 DevOps1.2k555 次安装23 周前更新
代码仓库

关于 docker-compose

面向运行多容器应用和构建可复现环境的开发者的 Docker Compose 技能,介绍声明式服务配置、应用栈操作、网络、配置档案及开发工作流。

主要功能

  1. 01声明式多服务 YAML 配置
  2. 02服务依赖与网络
  3. 03卷、端口和资源限制
  4. 04配置档案与 Compose 文件覆盖
  5. 05容器生命周期和构建命令
  6. 06开发监视与热重载

适用场景

  1. 01运行本地多容器应用
  2. 02搭建开发环境
  3. 03用配置档案区分可选服务
  4. 04管理不同环境的配置

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill docker-compose

安装后在 Claude Code 中输入/docker-compose确认已加载。

附带文件references/compose-patterns.md

详细介绍

Docker Compose

使用声明式 YAML 配置编排多容器应用。

何时使用此技能

在以下情况下使用此技能:

  • 在本地运行多容器应用
  • 设置开发环境
  • 定义服务依赖关系和网络
  • 管理包含多个服务的应用程序栈
  • 创建可复现的开发环境

前提条件

  • 安装了 Compose 插件(v2)的 Docker Engine
  • 具备基本的 Docker 知识
  • 了解 YAML 语法

基本配置

简单的应用程序栈
# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgres://postgres:secret@db:5432/myapp
    depends_on:
      - db
      - redis

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres-data:

服务配置

构建选项
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile.dev
      args:
        NODE_VERSION: "20"
      target: development
      cache_from:
        - myapp:cache
    image: myapp:dev
环境变量
services:
  app:
    environment:
      - NODE_ENV=production
      - API_KEY=${API_KEY}  # From shell or .env file
    env_file:
      - .env
      - .env.local
端口映射
services:
  web:
    ports:
      - "3000:3000"           # HOST:CONTAINER
      - "127.0.0.1:9229:9229" # Bind to localhost only
      - "8080-8090:8080-8090" # Port range
    expose:
      - "3000"                # Internal only (no host binding)
卷挂载
services:
  app:
    volumes:
      # Named volume
      - app-data:/app/data
      # Bind mount
      - ./src:/app/src
      # Read-only bind mount
      - ./config:/app/config:ro
      # Anonymous volume (for node_modules)
      - /app/node_modules

volumes:
  app-data:
    driver: local
依赖关系
services:
  web:
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

网络

自定义网络
services:
  frontend:
    networks:
      - frontend-net

  backend:
    networks:
      - frontend-net
      - backend-net

  db:
    networks:
      - backend-net

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
    internal: true  # No external access
网络别名
services:
  db:
    networks:
      backend:
        aliases:
          - database
          - postgres

networks:
  backend:

资源限制

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 1G
        reservations:
          cpus: '0.5'
          memory: 256M

多个 Compose 文件

覆盖文件
# docker-compose.yml (base)
services:
  web:
    image: myapp:latest
    ports:
      - "3000:3000"

# docker-compose.override.yml (development - auto-loaded)
services:
  web:
    build: .
    volumes:
      - ./src:/app/src
    environment:
      - DEBUG=true

# docker-compose.prod.yml (production)
services:
  web:
    deploy:
      replicas: 3
    environment:
      - DEBUG=false
使用多个文件
# Development (uses override automatically)
docker compose up

# Production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up

# Merge and view final config
docker compose -f docker-compose.yml -f docker-compose.prod.yml config

配置文件

services:
  web:
    image: myapp

  db:
    image: postgres:15

  debug:
    image: busybox
    profiles:
      - debug

  monitoring:
    image: prometheus
    profiles:
      - monitoring
# Run without profiles (web, db only)
docker compose up

# Run with debug profile
docker compose --profile debug up

# Run with multiple profiles
docker compose --profile debug --profile monitoring up

命令

生命周期
# Start services
docker compose up -d

# Start specific service
docker compose up -d web

# Stop services
docker compose stop

# Stop and remove containers
docker compose down

# Stop and remove everything including volumes
docker compose down -v --rmi all

# Restart services
docker compose restart web
构建
# Build images
docker compose build

# Build without cache
docker compose build --no-cache

# Build and start
docker compose up --build

# Pull latest images
docker compose pull
监控
# View logs
docker compose logs -f

# View specific service logs
docker compose logs -f web

# View running services
docker compose ps

# View resource usage
docker compose top
执行
# Run command in new container
docker compose run --rm web npm test

# Execute in running container
docker compose exec web /bin/sh

# Scale service
docker compose up -d --scale worker=3

开发工作流

监视模式(Compose v2.22+)
services:
  web:
    build: .
    develop:
      watch:
        - action: sync
          path: ./src
          target: /app/src
        - action: rebuild
          path: ./package.json
docker compose watch
热重载设置
services:
  web:
    build:
      context: .
      target: development
    volumes:
      - ./src:/app/src
      - /app/node_modules
    environment:
      - CHOKIDAR_USEPOLLING=true
    command: npm run dev

常见模式

数据库初始化
services:
  db:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init-scripts:/docker-entrypoint-initdb.d:ro
    environment:
      POSTGRES_DB: myapp
反向代理
services:
  proxy:
    image: traefik:v3.0
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro

  web:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.web.rule=Host(`app.localhost`)"

常见问题

问题:容器无法解析服务名称

问题:服务无法通过名称连接到另一个服务
解决方案:确保服务位于同一网络中,并检查 depends_on

问题:卷权限

问题:容器无法写入挂载的卷
解决方案:使容器用户的 UID 与主机一致,或使用命名卷

问题:端口已被占用

问题:绑定端口时出错
解决方案:更改主机端口或停止冲突的服务

问题:更改未生效

问题:代码更改未在容器中显示
解决方案:检查卷挂载;如果 Dockerfile 已更改,请重新构建

最佳实践

  • 使用命名卷保存持久化数据
  • 为数据库依赖项定义健康检查
  • 使用配置文件分隔可选服务
  • 将密钥保存在 .env 文件中(不要提交)
  • 使用覆盖文件配置特定环境
  • 固定镜像版本以确保可复现性
  • 使用网络隔离服务组
  • 在开发中利用监视模式

相关技能

评论

支持 Markdown