compose
Scannednpx machina-cli add skill chaterm/terminal-skills/compose --openclawDocker 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
- 确保你安装了 Docker 与内置的 Docker Compose v2。
- 在项目根创建或更新 docker-compose.yml,定义一个或多个 services。
- 运行 docker compose up -d 启动栈;使用 docker compose ps 查看状态。
- 需要停止并清理时,执行 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
Related Skills
image-management
chaterm/terminal-skills
Docker 镜像管理
container-ops
chaterm/terminal-skills
Docker 容器操作与管理
dockerfile
chaterm/terminal-skills
Dockerfile 编写最佳实践
networking
chaterm/terminal-skills
Docker 容器网络
unified-review
athola/claude-night-market
'Use this skill when orchestrating multiple review types. Use when general
Plan Review
smith-horn/product-builder-starter
Multi-perspective plan review with VP Product, VP Engineering, and VP Design. Use when reviewing implementation plans, design docs, architecture proposals, or wave plans for blockers, anti-patterns, conflicts, and regressions.