题目
什么是 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 删除关联的数据卷 ```