题目
什么是 Docker Compose?
答案
`Compose` 项目是 Docker 官方的开源项目(https://github.com/docker/compose),负责实现对 Docker 容器集群的快速编排
`Compose` 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
我们知道使用一个 `Dockerfile` 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
`Compose` 恰好满足了这样的需求。它允许用户通过一个单独的 `docker-compose.yml` 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
`Compose` 中有两个重要的概念:
- 服务 (`service`):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
- 项目 (`project`):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。
`Compose` 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
`Compose` 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 `Compose` 来进行编排管理。
以下是一个 **Spring Boot + MySQL + Redis** 的完整 `docker-compose.yml` 示例:
```yaml
# docker-compose.yml
version: '3.8' # Compose 文件版本(高版本兼容性更好)
services:
# MySQL 数据库服务
mysql-db:
image: mysql:8.0
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: userpass
volumes:
- mysql-data:/var/lib/mysql # 持久化数据库数据
ports:
- "3306:3306"
networks:
- app-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 5
# Redis 缓存服务
redis-cache:
image: redis:7-alpine
container_name: redis-container
ports:
- "6379:6379"
networks:
- app-network
volumes:
- redis-data:/data
command: redis-server --save 60 1 --loglevel warning
# Spring Boot 应用服务
springboot-app:
# 使用当前目录的 Dockerfile 构建镜像
build: .
container_name: app-container
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/app_db
SPRING_DATASOURCE_USERNAME: app_user
SPRING_DATASOURCE_PASSWORD: userpass
SPRING_REDIS_HOST: redis-cache
ports:
- "8080:8080"
networks:
- app-network
depends_on:
mysql-db:
condition: service_healthy # 等待数据库健康检查通过
redis-cache:
condition: service_started # 等待 Redis 启动
# 定义网络和数据卷
volumes:
mysql-data:
redis-data:
networks:
app-network:
driver: bridge
```
关键配置解析:
1. 服务定义:
- `mysql-db`:使用官方 MySQL 镜像,配置数据库用户、密码,并通过卷持久化数据。
- `redis-cache`:使用轻量级 Redis 镜像,配置持久化策略。
- `springboot-app`:基于本地 Dockerfile 构建镜像,注入数据库和 Redis 连接信息。
2. 网络配置:所有服务加入同一自定义网络,直接通过服务名(如 `mysql-db`)相互访问,无需暴露端口到宿主机。
```yaml
networks:
app-network:
driver: bridge
```
3. 数据持久化:数据卷独立于容器生命周期,确保数据不丢失。
```yaml
volumes:
mysql-data: # MySQL 数据卷
redis-data: # Redis 数据卷
```
4. 健康检查与依赖控制:应用服务等待 MySQL 健康检查通过后再启动,避免连接失败
```yaml
depends_on:
mysql-db:
condition: service_healthy
```
使用方法:
1. 启动所有服务:
```bash
docker-compose up -d # -d 表示后台运行
```
2. 查看服务状态:
```bash
docker-compose ps
```
3. 查看日志:
```bash
docker-compose logs -f springboot-app # 实时追踪应用日志
```
4. 停止并清理环境:
```bash
docker-compose down -v # -v 删除关联的数据卷
```
