
6.1 为什么需要Docker Compose?
在上一章的实战中,我们已经体验到了管理多个容器的复杂性。如果应用包含更多服务(比如Web服务器、数据库、缓存、消息队列等),手动管理会变得非常繁琐:
- 需要依次启动多个容器
- 需要记住复杂的参数(端口映射、环境变量、挂载目录等)
- 需要处理服务之间的依赖关系
- 停止和清理也很麻烦
Docker Compose就是为了解决这些问题而生的,它就像一个"指挥家",能够统一编排和管理多个容器。
6.2 Docker Compose核心概念
6.2.1 服务(Service)
服务是Compose中的核心概念,代表一个可运行的容器。一个服务可以运行多个相同容器实例(副本)。
6.2.2 项目(Project)
项目是Compose的一个隔离环境,通常对应一个应用。项目名称默认为目录名。
6.2.3 编排文件(docker-compose.yml)
这是Compose的"乐谱",用YAML格式描述应用的服务、网络和数据卷。
6.3 编写docker-compose.yml文件
让我们以一个典型的Web应用为例,包含Nginx、Flask和MySQL:
yaml
version: '3.8'
# 定义服务
services:
# Nginx服务
nginx:
image: nginx:alpine
container_name: my-nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./static:/static
depends_on:
- flask
networks:
- frontend
# Flask应用服务
flask:
build: ./flask-app
container_name: my-flask
ports:
- "5000:5000"
environment:
- DATABASE_URL=mysql://user:pass@mysql:3306/mydb
volumes:
- ./flask-app:/app
depends_on:
- mysql
networks:
- frontend
- backend
# MySQL数据库服务
mysql:
image: mysql:5.7
container_name: my-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: pass
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
# 定义数据卷
volumes:
mysql_data:
# 定义网络
networks:
frontend:
backend:
6.4 Compose常用命令
bash
# 启动所有服务(首次运行会自动构建镜像)
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs
# 停止所有服务
docker-compose stop
# 启动已停止的服务
docker-compose start
# 重启服务
docker-compose restart
# 停止并删除所有服务、网络、数据卷
docker-compose down
# 执行单次命令(比如数据库迁移)
docker-compose run flask python manage.py db upgrade
6.5 实战:用Compose部署WordPress
WordPress是一个流行的博客系统,依赖Apache/Web服务器和MySQL数据库。我们用Compose来部署它:
yaml
version: '3.8'
services:
wordpress:
image: wordpress:latest
container_name: my-wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- mysql
networks:
- app-network
mysql:
image: mysql:5.7
container_name: my-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- mysql_data:/var/lib/mysql
networks:
- app-network
volumes:
wordpress_data:
mysql_data:
networks:
app-network:
保存为docker-compose.yml,然后执行:
bash
docker-compose up -d
几分钟后,访问http://localhost:8080,就能看到WordPress的安装界面了!
Docker Compose大大简化了多容器应用的管理,是Docker生态系统中不可或缺的工具。
下一章,我们将学习Docker Swarm,它是Docker原生的集群编排工具。