前言
Docker Compose是管理多容器应用的利器。本文通过实际项目演示Compose的使用方法。
一、典型Web应用架构
一个典型的Web应用包含:前端、API后端、数据库、缓存,用Compose可以一键启动所有服务。
二、完整示例
version: '3.8'
services:
# API后端
api:
build: ./api
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=mysql
- DB_PORT=3306
- DB_USER=app
- DB_PASS=secret123
- REDIS_HOST=redis
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
restart: unless-stopped
# MySQL数据库
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: app
MYSQL_PASSWORD: secret123
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
# Redis缓存
redis:
image: redis:7-alpine
command: redis-server --requirepass redispass
volumes:
- redis_data:/data
# Nginx反向代理
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- api
volumes:
mysql_data:
redis_data:
三、常用命令
# 启动所有服务
docker compose up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f api
# 重新构建
docker compose build api
# 停止并删除
docker compose down
# 仅重启某个服务
docker compose restart api
# 扩容
docker compose up -d --scale api=3
四、环境变量管理
# .env 文件
DB_PASSWORD=secret123
REDIS_PASSWORD=redispass
API_PORT=3000
# docker-compose.yml 中引用
services:
api:
environment:
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_PASSWORD=${REDIS_PASSWORD}
五、网络配置
Compose默认创建一个专用网络,所有服务可通过服务名互相访问:
# 在API容器中可直接用服务名访问
mysql -h mysql -u app -p
redis-cli -h redis -a redispass
六、数据持久化
使用named volumes确保数据不丢失:
- 数据库数据:挂载到named volume
- 配置文件:使用bind mount
- 上传文件:挂载到共享volume
Docker Compose适合单机部署。如果需要多节点编排和自动伸缩,建议使用Kubernetes。