LIVE_STREAM_CONNECTED
Docker Compose 完整使用指南
A
Mastermind
admin
Dimension
Docker
Timestamp
2025年12月21日
Docker Compose 用于定义和运行多容器 Docker 应用,通过 YAML 文件配置服务。
安装
Docker Desktop
Docker Desktop 已内置 Docker Compose。
Linux 单独安装
# 插件方式(推荐)
sudo apt install docker-compose-plugin
# 验证
docker compose version
基础配置
最小配置
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
完整示例
version: '3.8'
services:
# 前端应用
frontend:
build: ./frontend
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- backend
# 后端 API
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
- DB_HOST=db
- DB_PORT=5432
- REDIS_HOST=redis
depends_on:
- db
- redis
volumes:
- ./backend:/app
- /app/node_modules
# 数据库
db:
image: postgres:15
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
# 缓存
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
# Nginx 反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- frontend
- backend
volumes:
postgres_data:
redis_data:
networks:
default:
name: myapp-network
常用命令
启动服务
# 启动所有服务
docker compose up
# 后台运行
docker compose up -d
# 指定文件
docker compose -f docker-compose.prod.yml up -d
# 只启动特定服务
docker compose up -d backend db
# 强制重新构建
docker compose up -d --build
# 重新创建容器
docker compose up -d --force-recreate
停止服务
# 停止服务
docker compose stop
# 停止并删除容器
docker compose down
# 同时删除卷
docker compose down -v
# 同时删除镜像
docker compose down --rmi all
查看状态
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs
docker compose logs -f # 实时追踪
docker compose logs backend # 指定服务
docker compose logs --tail 100 # 最后 100 行
# 查看资源使用
docker compose top
服务管理
# 重启服务
docker compose restart
docker compose restart backend
# 暂停/恢复
docker compose pause
docker compose unpause
# 进入容器
docker compose exec backend sh
docker compose exec backend bash
# 运行一次性命令
docker compose run backend npm test
docker compose run --rm backend npm install
# 扩展服务实例
docker compose up -d --scale backend=3
构建镜像
# 构建所有服务
docker compose build
# 构建指定服务
docker compose build backend
# 不使用缓存
docker compose build --no-cache
# 拉取最新镜像
docker compose pull
配置详解
build 构建配置
services:
app:
build:
context: ./app # 构建上下文
dockerfile: Dockerfile.prod # 指定 Dockerfile
args: # 构建参数
NODE_ENV: production
target: production # 多阶段构建目标
cache_from:
- myapp:latest
端口映射
services:
web:
ports:
- "80:80" # 主机:容器
- "443:443"
- "8080-8090:8080-8090" # 端口范围
- "127.0.0.1:3000:3000" # 绑定特定 IP
环境变量
services:
app:
# 方式一:直接定义
environment:
- NODE_ENV=production
- DB_HOST=db
# 方式二:键值对
environment:
NODE_ENV: production
DB_HOST: db
# 方式三:从文件加载
env_file:
- .env
- .env.local
卷挂载
services:
app:
volumes:
# 绑定挂载
- ./src:/app/src
- ./config:/app/config:ro # 只读
# 命名卷
- app_data:/app/data
# 匿名卷
- /app/node_modules
volumes:
app_data:
driver: local
网络配置
services:
frontend:
networks:
- frontend-net
backend:
networks:
- frontend-net
- backend-net
db:
networks:
- backend-net
networks:
frontend-net:
backend-net:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
依赖关系
services:
app:
depends_on:
- db
- redis
# 带健康检查的依赖
app:
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
健康检查
services:
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
重启策略
services:
app:
restart: always # 总是重启
# restart: on-failure # 失败时重启
# restart: unless-stopped # 除非手动停止
# restart: "no" # 不重启
资源限制
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
日志配置
services:
app:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
多环境配置
基础配置 + 覆盖
# docker-compose.yml (基础)
version: '3.8'
services:
app:
build: .
environment:
- NODE_ENV=development
# docker-compose.override.yml (开发环境,自动加载)
version: '3.8'
services:
app:
volumes:
- .:/app
ports:
- "3000:3000"
# docker-compose.prod.yml (生产环境)
version: '3.8'
services:
app:
environment:
- NODE_ENV=production
restart: always
使用:
# 开发环境(自动加载 override)
docker compose up
# 生产环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
使用 .env 文件
# .env
POSTGRES_USER=admin
POSTGRES_PASSWORD=secret
APP_PORT=3000
# docker-compose.yml
services:
db:
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
app:
ports:
- "${APP_PORT}:3000"
实用示例
LNMP 环境
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./www:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- php
php:
build: ./php
volumes:
- ./www:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Node.js + MongoDB
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- MONGODB_URI=mongodb://mongo:27017/myapp
depends_on:
- mongo
mongo:
image: mongo:6
volumes:
- mongo_data:/data/db
volumes:
mongo_data:
WordPress
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: root
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
故障排查
# 查看配置
docker compose config
# 验证配置
docker compose config --quiet
# 查看服务日志
docker compose logs -f service_name
# 进入容器调试
docker compose exec service_name sh
# 查看容器详情
docker compose ps -a
docker inspect container_name
总结
Docker Compose 核心功能:
- YAML 定义多容器应用
- 一键启动/停止所有服务
- 服务依赖管理
- 网络和卷管理
- 多环境配置支持
是本地开发和小规模部署的理想选择。