关于 docker-compose
面向运行多容器应用和构建可复现环境的开发者的 Docker Compose 技能,介绍声明式服务配置、应用栈操作、网络、配置档案及开发工作流。
主要功能
- 01声明式多服务 YAML 配置
- 02服务依赖与网络
- 03卷、端口和资源限制
- 04配置档案与 Compose 文件覆盖
- 05容器生命周期和构建命令
- 06开发监视与热重载
适用场景
- 01运行本地多容器应用
- 02搭建开发环境
- 03用配置档案区分可选服务
- 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 文件中(不要提交)
- 使用覆盖文件配置特定环境
- 固定镜像版本以确保可复现性
- 使用网络隔离服务组
- 在开发中利用监视模式
相关技能
- docker-management - Docker 基础知识
- kubernetes-ops - 生产环境编排
- reverse-proxy - 生产环境路由
评论
支持 Markdown