Docker Compose 允许你用一个 YAML 文件定义和运行多容器应用。本速查表涵盖从基本服务定义到生产级栈配置的所有内容。
文件结构
docker-compose.yml 文件由四个主要部分组成:
# docker-compose.yml
services: # Container definitions
web:
image: nginx:alpine
api:
build: ./api
volumes: # Persistent storage
db-data:
networks: # Custom networks
frontend:
backend:服务配置
镜像 vs 构建
services:
# Use a pre-built image
db:
image: postgres:16
# Build from Dockerfile
api:
build: ./api
# Build with custom options
web:
build:
context: ./frontend
dockerfile: Dockerfile.prod
args:
NODE_ENV: production端口映射
services:
web:
ports:
- "80:80" # host:container
- "443:443"
- "3000:3000" # Expose to localhost
- "127.0.0.1:8080:80" # Bind to specific interface环境变量
services:
api:
# Inline environment variables
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
# From external file
env_file:
- .env
- .env.production重启策略
services:
web:
restart: "no" # Default: never restart
api:
restart: always # Always restart
db:
restart: unless-stopped # Restart unless manually stopped
worker:
restart: on-failure # Restart only on failure
# restart: on-failure:5 # Max 5 retries健康检查
services:
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s卷
services:
db:
volumes:
# Bind mount (host path : container path)
- ./data:/var/lib/postgresql/data
# Named volume
- db-data:/var/lib/postgresql/data
# Read-only mount
- ./config:/etc/app/config:ro
volumes:
db-data: # Named volume declaration
driver: local网络
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # No external access完整栈示例
Node.js + MongoDB + Redis
services:
app:
build: .
ports:
- "3000:3000"
environment:
- MONGO_URL=mongodb://mongo:27017/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- mongo
- redis
mongo:
image: mongo:7
volumes:
- mongo-data:/data/db
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
mongo-data:Django + PostgreSQL
services:
web:
build: .
command: gunicorn myapp.wsgi:application --bind 0.0.0.0:8000
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://postgres:secret@db:5432/myapp
depends_on:
db:
condition: service_healthy
volumes:
- static:/app/static
db:
image: postgres:16
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: secret
volumes:
- pg-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 5s
timeout: 5s
retries: 5
volumes:
pg-data:
static:WordPress + MySQL + phpMyAdmin
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_pass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-content:/var/www/html
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass
MYSQL_ROOT_PASSWORD: root_secret
volumes:
- db-data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin:latest
ports:
- "8081:80"
environment:
PMA_HOST: db
volumes:
wp-content:
db-data:常用 CLI 命令
| 命令 | 说明 |
|---|---|
| docker compose up -d | Start services in background |
| docker compose down | Stop and remove containers |
| docker compose down -v | Stop and remove containers + volumes |
| docker compose logs -f | Follow service logs |
| docker compose logs api | Logs for specific service |
| docker compose ps | List running containers |
| docker compose exec api sh | Shell into running container |
| docker compose build | Build/rebuild images |
| docker compose pull | Pull latest images |
| docker compose restart api | Restart specific service |
| docker compose config | Validate and view config |
| docker compose top | Show running processes |
环境文件 (.env)
Docker Compose 自动读取同目录下的 .env 文件:
# .env file
POSTGRES_VERSION=16
POSTGRES_PASSWORD=my_secret_pass
APP_PORT=3000
# docker-compose.yml
services:
db:
image: postgres:${POSTGRES_VERSION}
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
app:
ports:
- "${APP_PORT}:3000"常见错误
| 错误 | 修复 |
|---|---|
| 生产环境使用 `latest` 标签 | 使用特定版本标签(如 `postgres:16.1`) |
| 在 docker-compose.yml 中存储密钥 | 使用 .env 文件或 Docker secrets |
| 不使用命名卷存储数据 | 命名卷在 `docker compose down` 后保留 |
| 缺少重启策略 | 为生产服务添加 `restart: unless-stopped` |
| 未设置资源限制 | 使用 `deploy.resources.limits` 限制内存/CPU |
常见问题
docker-compose 和 docker compose 有什么区别?
docker-compose(带连字符)是旧的 Python 工具(V1)。docker compose(空格)是新的 Go 插件(V2),已集成到 Docker CLI。V2 是默认推荐版本。
如何在 Docker Compose 中持久化数据?
使用命名卷。命名卷在 docker compose down 后保留。绑定挂载直接映射主机目录,适合开发环境。
Docker Compose 中容器如何通信?
同一 docker-compose.yml 中的所有服务共享默认网络。服务可以使用服务名作为主机名互相访问。
Docker Compose 可以用于生产环境吗?
可以,但大规模部署建议使用 Docker Swarm 或 Kubernetes。Docker Compose 适合单机部署、开发环境和 CI/CD。