Get the FREE Ultimate OpenClaw Setup Guide →
npx machina-cli add skill chaterm/terminal-skills/compose --openclaw
Files (1)
SKILL.md
6.7 KB

Docker Compose 编排

概述

多容器编排、环境变量、网络配置等技能。

基础命令

# 启动服务
docker compose up
docker compose up -d                # 后台运行
docker compose up --build           # 重新构建

# 停止服务
docker compose down
docker compose down -v              # 同时删除卷
docker compose down --rmi all       # 同时删除镜像

# 查看状态
docker compose ps
docker compose ps -a

# 查看日志
docker compose logs
docker compose logs -f              # 实时跟踪
docker compose logs service_name

# 执行命令
docker compose exec service_name sh
docker compose run service_name command

# 重启服务
docker compose restart
docker compose restart service_name

# 扩缩容
docker compose up -d --scale web=3

配置文件

基础结构

# docker-compose.yml
version: "3.9"

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - api

  api:
    build: ./api
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

volumes:
  db_data:

networks:
  default:
    driver: bridge

服务配置详解

build

services:
  app:
    # 简单形式
    build: ./app
    
    # 完整形式
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        - VERSION=1.0
      target: production
      cache_from:
        - myapp:cache

ports

services:
  web:
    ports:
      - "80:80"                     # HOST:CONTAINER
      - "443:443"
      - "8080-8090:8080-8090"       # 端口范围
      - "127.0.0.1:3000:3000"       # 绑定特定 IP

volumes

services:
  app:
    volumes:
      # 命名卷
      - data:/var/lib/data
      # 绑定挂载
      - ./config:/etc/app/config:ro
      # 匿名卷
      - /var/lib/data

volumes:
  data:
    driver: local

environment

services:
  app:
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://localhost/db
    # 或使用映射形式
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://localhost/db
    # 从文件加载
    env_file:
      - .env
      - .env.local

depends_on

services:
  web:
    depends_on:
      - db
      - redis
    # 带条件
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

healthcheck

services:
  web:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

deploy(Swarm 模式)

services:
  web:
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

网络配置

自定义网络

services:
  frontend:
    networks:
      - frontend
  
  backend:
    networks:
      - frontend
      - backend
  
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true              # 内部网络,无外部访问

网络别名

services:
  db:
    networks:
      backend:
        aliases:
          - database
          - postgres

环境变量

.env 文件

# .env
POSTGRES_VERSION=15
POSTGRES_PASSWORD=secret
APP_PORT=3000
# docker-compose.yml
services:
  db:
    image: postgres:${POSTGRES_VERSION}
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  
  app:
    ports:
      - "${APP_PORT}:3000"

多环境配置

# docker-compose.override.yml(开发环境,自动加载)
# docker-compose.prod.yml(生产环境)

# 使用多个配置文件
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# docker-compose.yml(基础配置)
services:
  app:
    image: myapp:latest

# docker-compose.override.yml(开发覆盖)
services:
  app:
    build: .
    volumes:
      - .:/app
    environment:
      - DEBUG=true

# docker-compose.prod.yml(生产覆盖)
services:
  app:
    restart: always
    environment:
      - DEBUG=false

常见场景

场景 1:Web 应用栈

version: "3.9"

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app

  app:
    build: .
    environment:
      - DATABASE_URL=postgres://postgres:secret@db:5432/mydb
      - REDIS_URL=redis://redis:6379
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

场景 2:开发环境热重载

version: "3.9"

services:
  app:
    build:
      context: .
      target: development
    volumes:
      - .:/app
      - /app/node_modules          # 排除 node_modules
    environment:
      - NODE_ENV=development
    command: npm run dev
    ports:
      - "3000:3000"

场景 3:数据库初始化

services:
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    environment:
      POSTGRES_PASSWORD: secret

场景 4:日志配置

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

故障排查

# 查看配置
docker compose config

# 查看服务日志
docker compose logs service_name --tail=100

# 进入容器
docker compose exec service_name sh

# 查看网络
docker network ls
docker network inspect project_default

# 重建服务
docker compose up -d --force-recreate service_name
问题排查方法
服务无法启动docker compose logs, 检查依赖
网络不通检查网络配置、服务名
卷挂载问题检查路径、权限
环境变量未生效docker compose config 验证

Source

git clone https://github.com/chaterm/terminal-skills/blob/main/docker/compose/SKILL.mdView on GitHub

Overview

你使用 Docker Compose 来定义一个多容器应用的服务、网络、卷和环境变量。通过 docker compose up、down、ps、logs、exec 等命令,你可以在本地开发、测试和生产环境中获得一致的生命周期管理。该技能覆盖基础服务配置、环境变量、依赖关系、健康检查,以及 Swarm 下的 deploy 配置和多环境覆盖等能力。

How This Skill Works

Compose 读取一个或多个 docker-compose.yml 配置文件,将各服务、网络和卷合并成一个项目,对应的容器、网络和卷由 Docker 管理。你可以在服务中使用 build、ports、volumes、environment、depends_on、healthcheck、deploy 等字段来描述行为。你还可以使用 -f 指定额外的配置文件,使用 docker compose config 进行验证,并通过 env_file 或环境变量(以及 .env 文件)注入配置。对 Swarm,deploy 提供副本数、资源限制及重启策略等元数据。

When to Use It

  • 你想用一个单独的配置文件描述整个应用栈(前端、后端、数据库、缓存等),并在不同环境中快速部署。
  • 你需要快速启动、停止、扩容或回滚一组相关服务,同时保持网络、卷及日志的一致性。
  • 你要在开发、测试和生产之间切换环境配置(使用 -f 引入 override 文件或额外的 production 配置),以避免重复配置。
  • 你希望通过 healthcheck 和 depends_on 的条件来控制服务的启动顺序与健康性,提升栈的可靠性。

Quick Start

  1. 确保你安装了 Docker 与内置的 Docker Compose v2。
  2. 在项目根创建或更新 docker-compose.yml,定义一个或多个 services。
  3. 运行 docker compose up -d 启动栈;使用 docker compose ps 查看状态。
  4. 需要停止并清理时,执行 docker compose down;若要同时移除卷或镜像,可加上相应选项。

Best Practices

  • 在文件顶部指定版本号,优先使用兼容的 3.9 版本以获得稳定的行为。
  • 通过 env_file 或 .env 文件管理环境变量,避免将敏感信息硬编码到 compose 文件中。
  • 使用命名卷与显式 networks,确保数据持久性与网络边界清晰。
  • 配置 healthcheck,确保服务健康后再被 depend_on 的依赖方使用。
  • 为开发与生产使用单独的覆盖文件,通过 docker compose -f 来组合配置;使用 docker compose config 验证最终配置。
  • 不要在宿主机暴露大量端口,优先使用内部网络或受控的端口映射;对外暴露的端口要有合理防火墙策略。
  • 如果需要水平扩容,使用 --scale 进行简单扩容(仅对非 Swarm 部署生效),并测试应用的可伸缩性。
  • 对日志进行治理:可配置 logging 驱动和选项以满足可观测性与成本考量。

Example Use Cases

  • 场景:Web 应用栈。定义前端 Nginx、后端应用、数据库和缓存服务,确保通过网络和 depends_on 进行正确初始化,便于一键启动整套栈。
  • 场景:开发环境热重载。将应用代码目录挂载到容器中,启用开发命令,实现热重载。
  • 场景:数据库初始化。通过挂载 init.sql 到数据库容器的初始化脚本目录,在容器首次启动时自动执行初始化。
  • 场景:日志配置。为容器配置日志驱动和轮转策略,提升可观测性并控制磁盘使用。
  • 场景:多环境部署。维护 base 配置并通过覆盖文件快速在开发、测试和生产之间切换。

Frequently Asked Questions

Add this skill to your agents

Related Skills

Sponsor this space

Reach thousands of developers