Docker Compose容器编排的核心概念
Docker Compose是Docker官方的多容器编排工具,通过YAML文件定义服务、网络和卷,一条命令完成多容器应用的启动、停止和重建。在网站运维和DevOps实践中,Docker Compose是从小规模到中等规模应用部署的首选方案,比Kubernetes轻量,比手动docker run可靠。
docker-compose.yml的核心结构包含services、networks和volumes三个顶层键。每个service定义一个容器,包括镜像、端口映射、环境变量、依赖关系、健康检查等。networks定义容器间通信网络,volumes定义持久化存储。理解这三个组件的交互方式是用好Docker Compose的基础。
多服务应用编排实战:Web应用完整部署
以一个典型的Web应用为例,包含Nginx前端代理、Python应用服务、Redis缓存和MySQL数据库四个服务。完整编排配置如下:
# docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./ssl:/etc/nginx/ssl:ro
- nginx_logs:/var/log/nginx
depends_on:
web:
condition: service_healthy
restart: always
networks:
- frontend
web:
build: ./app
expose:
- "8000"
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_NAME=myapp
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=redis
- REDIS_PORT=6379
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
restart: always
networks:
- frontend
- backend
mysql:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d:ro
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=myapp
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
restart: always
networks:
- backend
redis:
image: redis:7-alpine
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redis_data:/data
restart: always
networks:
- backend
volumes:
mysql_data:
redis_data:
nginx_logs:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
网络隔离与安全加固策略
上例中frontend和backend两个网络实现了网络隔离。Nginx同时连接frontend和backend,对外暴露80/443端口;web应用连接两个网络,接收Nginx转发请求并访问数据库;MySQL和Redis只连接backend网络,且backend设为internal: true,不对外暴露任何端口。这种架构确保数据库和缓存服务无法被外部直接访问。
环境变量通过.env文件管理,避免敏感信息硬编码在YAML中。.env文件加入.gitignore,通过CI/CD流水线或密钥管理系统注入。Docker自动化部署时建议在CI流水线中做配置校验,确保生产环境的.env文件内容完整。
多环境配置管理
Docker Compose支持通过多文件覆盖实现多环境管理。基础文件定义通用配置,环境文件覆盖差异部分:
# docker-compose.yml(基础配置)
# docker-compose.override.yml(开发环境,自动加载)
# docker-compose.prod.yml(生产环境,需-f指定)
# 生产环境启动
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# docker-compose.prod.yml 覆盖示例
version: '3.8'
services:
web:
build:
context: ./app
args:
- ENV=production
deploy:
replicas: 3
resources:
limits:
cpus: '2'
memory: 2G
environment:
- DEBUG=false
nginx:
ports:
- "443:443"
volumes:
- ./ssl/prod:/etc/nginx/ssl:ro
健康检查与依赖启动顺序控制
depends_on的condition参数控制服务启动顺序,service_healthy等待依赖服务健康检查通过后再启动,service_started只等待容器启动。MySQL的健康检查用mysqladmin ping,web应用用HTTP健康端点。start_period参数给予应用启动宽限期,避免启动慢的服务被误判为不健康。
没有健康检查的依赖链会导致启动时序混乱。例如web应用在MySQL完全就绪前尝试连接数据库,触发连接失败。通过condition: service_healthy可以确保MySQL可接受连接后再启动web服务。
容器日志管理与监控集成
Docker Compose默认使用json-file日志驱动,日志写入容器内部文件。生产环境应配置日志轮转,防止磁盘被撑满:
# /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
查看容器日志用docker compose logs命令,-f参数实时跟踪,–since指定时间范围。对于集中式日志分析,可以添加Fluentd或Loki容器作为日志收集端,通过logging驱动将日志直接发送到收集器。
# 在docker-compose.yml中配置日志收集
web:
logging:
driver: fluentd
options:
fluentd-address: localhost:24224
tag: myapp.web
容器化部署的备份与恢复方案
数据卷是容器化部署中需要重点保护的资产。MySQL数据卷应定期备份,备份策略可以是定时任务执行docker exec mysqldump导出SQL文件,或用docker run临时容器挂载卷做文件级备份。
# 备份MySQL数据
docker compose exec -T mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} myapp | gzip > backup_$(date +%Y%m%d).sql.gz
# 备份Docker Volume
docker run --rm -v mysql_data:/data -v $(pwd):/backup alpine tar czf /backup/volume_backup_$(date +%Y%m%d).tar.gz /data
恢复时先停止相关服务,导入备份文件,再重新启动。建议编写自动化恢复脚本并定期演练,确保灾难恢复流程可靠。docker compose config命令可以校验YAML语法,部署前务必执行检查,避免语法错误导致服务启动失败。故障应急响应流程中应包含容器化部署的回滚步骤,保留上一版本镜像以便快速回退。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/dockercompose-duo-rong-qi-bian-pai-bu-shu-shi-zhan-cong-kai/