Docker Compose 多服务编排实践
为什么用 Docker Compose
手动启动多个容器不仅繁琐,而且容易出错。Docker Compose 用一个 YAML 文件定义所有服务及其依赖关系,一条命令就能完成全部部署。
docker compose up -d
实际案例:博客平台部署
以一个典型的博客平台为例,需要三个服务:Nginx 反向代理、WordPress 应用、MySQL 数据库。
version: '3.8'
services:
db:
image: mysql:8.0
container_name: blog-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
networks:
- blog_net
wordpress:
image: wordpress:latest
container_name: blog-wp
restart: always
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
networks:
- blog_net
nginx:
image: nginx:alpine
container_name: blog-nginx
restart: always
depends_on:
- wordpress
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
networks:
- blog_net
volumes:
db_data:
wp_data:
networks:
blog_net:
driver: bridge
环境变量管理
敏感信息不要硬编码在 compose 文件中。使用 .env 文件:
MYSQL_ROOT_PASSWORD=your_secure_root_password
MYSQL_PASSWORD=your_secure_password
常用命令
# 启动所有服务
docker compose up -d
# 查看日志
docker compose logs -f wordpress
# 重启某个服务
docker compose restart nginx
# 停止并删除所有容器
docker compose down
# 停止并删除容器+数据卷(危险操作!)
docker compose down -v
# 更新镜像并重新部署
docker compose pull && docker compose up -d
踩坑记录
1. 数据库连接失败
WordPress 连不上 MySQL。原因:depends_on 只保证启动顺序,不保证服务就绪。
解决:使用 healthcheck 确保数据库就绪后再启动应用。
db:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 10
wordpress:
depends_on:
db:
condition: service_healthy
2. 数据卷权限问题
挂载本地目录后容器内无权写入。
解决:确保本地目录的 UID/GID 与容器内运行用户匹配。
3. 端口冲突
Error: port is already allocated
解决:用 docker ps 或 ss -tlnp 查看端口占用情况。
总结
Docker Compose 是多服务部署的利器。核心要点:
- 服务之间用自定义网络通信,不需要暴露端口
- 敏感数据用环境变量管理
- 用
healthcheck确保依赖服务就绪 - 数据持久化用 volumes