什么是 Docker Compose?
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个 YAML 文件(通常命名为 docker-compose.yml
)来配置应用的多个服务、网络和卷,然后使用简单的命令一键启动、停止或管理这些容器。Docker Compose 特别适合开发、测试和生产环境中需要协调多个容器的场景,例如运行 WordPress 和 MySQL 的组合。
Docker Compose 与 Docker CLI 的区别
特性 | Docker CLI | Docker Compose |
---|---|---|
定义方式 | 通过命令行逐一运行 docker run 、docker network 等命令,手动配置容器。 | 使用单一的 YAML 文件定义多个容器、服务、网络和卷,配置更集中和声明式。 |
适用场景 | 适合单容器操作或临时测试,灵活但管理复杂多容器时繁琐。 | 适合多容器应用,简化复杂应用的部署和管理,适合开发和生产环境。 |
命令复杂度 | 需要多个命令逐一操作(如创建网络、启动容器、设置卷等)。 | 单条命令(如 docker-compose up )即可启动整个应用栈。 |
配置管理 | 配置分散在命令或脚本中,难以维护。 | 配置集中于 YAML 文件,易于版本控制和共享。 |
依赖管理 | 手动管理容器间的依赖关系(如启动顺序)。 | 自动处理服务依赖(通过 depends_on ),确保正确启动顺序。 |
可重复性 | 手动运行命令可能导致配置不一致。 | YAML 文件确保环境一致性,适合团队协作和 CI/CD 集成。 |
功能范围 | 提供完整的 Docker 功能,适合细粒度控制所有 Docker 资源。 | 专注于简化多容器应用的编排,部分高级功能(如 Swarm 模式)需要结合 CLI。 |
总结:Docker CLI 更适合单容器或低级操作,灵活但繁琐;Docker Compose 针对多容器应用,提供声明式配置和简化管理,适合复杂应用场景。
如何使用 Docker Compose?
以下是使用 Docker Compose 创建和管理 MySQL 容器的详细步骤,延续之前的 MySQL 和 WordPress 示例。
1. 安装 Docker Compose
确保已安装 Docker 和 Docker Compose:
- 检查 Docker:
docker --version
- 检查 Docker Compose:
docker-compose --version
- 如果未安装 Docker Compose,参考官方文档安装:https://docs.docker.com/compose/install/
2. 创建 Docker Compose 文件
在项目目录(例如 mysql-project
)下创建 docker-compose.yml
文件。以下是一个运行 MySQL 容器的示例:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_container
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: password
volumes:
- mysql_data:/var/lib/mysql
restart: unless-stopped
networks:
- mysql-network
volumes:
mysql_data:
networks:
mysql-network:
driver: bridge
文件说明:
version
: 指定 Docker Compose 文件格式版本(3.8
适用于较新版本的 Docker)。services
: 定义容器服务,这里是mysql
服务。image
: 使用官方 MySQL 8.0 镜像。ports
: 映射宿主机 3306 端口到容器 3306 端口。environment
: 设置 MySQL 的环境变量(根密码、数据库、用户等)。volumes
: 持久化数据到mysql_data
卷。networks
: 定义自定义网络mysql-network
,便于容器通信。restart
: 容器自动重启,除非手动停止。
3. 启动容器
在包含 docker-compose.yml
的目录下运行:
docker-compose up -d
-d
: 后台运行容器。- 命令会自动拉取镜像、创建网络和卷,并启动所有服务。
4. 验证运行
- 检查容器状态:
docker-compose ps
- 查看日志:
docker-compose logs mysql
- 连接 MySQL:
docker exec -it mysql_container mysql -u root -p
输入 rootpassword
登录。
5. 管理容器
- 停止服务:停止并保留容器和数据:
docker-compose stop
- 停止并删除:删除容器、网络,但保留卷:
docker-compose down
- 删除卷(谨慎,数据将丢失):
docker-compose down -v
- 重启服务:
docker-compose restart
6. 结合 WordPress
若要与 WordPress 配合,可扩展 docker-compose.yml
:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_container
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: wordpress_password
volumes:
- mysql_data:/var/lib/mysql
restart: unless-stopped
networks:
- wp-network
wordpress:
image: wordpress:latest
container_name: wordpress_container
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: wordpress_password
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- mysql
restart: unless-stopped
networks:
- wp-network
volumes:
mysql_data:
wordpress_data:
networks:
wp-network:
driver: bridge
运行 docker-compose up -d
,即可启动 WordPress 和 MySQL,访问 http://localhost:8080
进行 WordPress 安装。
7. 环境变量文件(可选)
为提高安全性,可将敏感信息放入 .env
文件:
MYSQL_ROOT_PASSWORD=rootpassword
MYSQL_DATABASE=mydb
MYSQL_USER=user
MYSQL_PASSWORD=password
在 docker-compose.yml
中引用:
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
注意事项
- 文件路径:确保在正确目录运行
docker-compose
命令,指向包含docker-compose.yml
的目录。 - 版本兼容:
version
字段需与 Docker Compose 版本兼容(3.8
适用于较新版本)。 - 端口冲突:检查宿主机端口(3306 或 8080)是否被占用,可修改映射端口。
- 数据持久化:使用
volumes
确保数据不因容器删除而丢失。 - 网络隔离:自定义网络(如
wp-network
)确保容器间通信安全。 - 生产环境:调整 MySQL 配置(如
my.cnf
)、使用强密码、启用 SSL 和防火墙。
示例场景
假设你需要为开发环境部署 MySQL 和 WordPress:
- 创建上述
docker-compose.yml
。 - 运行
docker-compose up -d
。 - 访问
http://localhost:8080
配置 WordPress。 - 使用
docker-compose logs
排查问题。 - 测试完成后,运行
docker-compose down
清理环境。
通过Docker Compose,你可以高效管理多容器应用,简化配置和部署流程!