Docker Compose:多容器编排
Docker Compose:多容器编排
Docker Compose简介
Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过一个YAML文件配置应用的服务,然后一键创建和启动所有服务。
安装与配置
# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
# V2版本(作为Docker插件)
docker compose version
docker-compose.yml详解
基本结构
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
depends_on:
- app
restart: unless-stopped
app:
build: ./app
environment:
- DB_HOST=db
- DB_PORT=3306
networks:
- frontend
- backend
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
volumes:
- db_data:/var/lib/mysql
networks:
- backend
volumes:
db_data:
networks:
frontend:
backend:
服务配置
services:
app:
build:
context: ./app
dockerfile: Dockerfile.prod
args:
NODE_ENV: production
ports:
- "3000:3000"
- "3001:3001"
environment:
- NODE_ENV=production
- DATABASE_URL=mysql://db:3306/myapp
env_file:
- .env
volumes:
- ./app:/app
- /app/node_modules
depends_on:
db:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '0.5'
memory: 512M
restart: unless-stopped
网络配置
自定义网络
services:
web:
networks:
frontend:
aliases:
- web.local
api:
networks:
frontend:
backend:
aliases:
- api.local
db:
networks:
backend:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 不与外部网络连接
数据卷管理
命名卷
volumes:
db_data:
driver: local
redis_data:
driver: local
绑定挂载
services:
app:
volumes:
- ./config:/app/config:ro
- ./logs:/app/logs
- app_data:/app/data
常用命令
# 启动所有服务
docker-compose up -d
# 后台启动并自动重建
docker-compose up -d --build
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
docker-compose logs -f web
# 停止服务
docker-compose down
# 停止并删除数据卷
docker-compose down -v
# 扩展服务
docker-compose up -d --scale web=3
# 执行一次性命令
docker-compose run --rm app python manage.py migrate
环境配置
环境变量文件
# .env文件
DB_ROOT_PASSWORD=rootpass
DB_NAME=myapp
REDIS_PASSWORD=redispw
APP_SECRET=mysecret
# docker-compose.yml引用
services:
db:
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
多环境配置
# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
实践:完整Web应用栈
# docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- app
networks:
- frontend
restart: unless-stopped
app:
build: ./app
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
networks:
- frontend
- backend
depends_on:
mysql:
condition: service_healthy
restart: unless-stopped
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: myapp
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
secrets:
- db_root_password
restart: unless-stopped
redis:
image: redis:alpine
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis_data:/data
networks:
- backend
restart: unless-stopped
volumes:
mysql_data:
redis_data:
networks:
frontend:
backend:
internal: true
secrets:
db_root_password:
file: ./secrets/db_root_password.txt
性能优化
# 使用BuildKit构建
DOCKER_BUILDKIT=1 docker-compose build
# 并行构建
docker-compose build --parallel
# 使用缓存
docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
故障排查
# 查看服务日志
docker-compose logs --tail=100 web
# 检查服务配置
docker-compose config
# 进入容器调试
docker-compose exec web sh
# 检查网络
docker network ls
docker network inspect myapp_frontend
总结
Docker Compose是开发和测试环境中编排多容器应用的理想工具。掌握Compose的配置和使用,可以快速搭建复杂的开发环境。