Docker Compose

什么是 Docker Compose?

Docker Compose 是一个用于 定义和运行多容器 Docker 应用程序 的工具。

你可以将它想象成:

  • 剧本 (YAML 文件 docker-compose.yml): 描述你的应用程序所需的“演员”(容器)以及它们之间的协作方式。
  • 指挥家 (Docker Compose 工具): 读取剧本,指挥 Docker 创建、启动、停止和管理所有容器。

为什么需要 Docker Compose?

在实际应用中,应用程序通常由多个容器组成,例如:

  • Web 服务器 (Nginx, Apache)
  • 应用服务器 (Python, Node.js, Java 应用)
  • 数据库 (MySQL, PostgreSQL, MongoDB)
  • 缓存 (Redis, Memcached)
  • 消息队列 (RabbitMQ, Kafka)

手动管理这些容器会很繁琐且容易出错,需要记住启动顺序、网络配置、端口映射、卷挂载等。

Docker Compose 的出现就是为了简化多容器应用的编排和管理。

Docker Compose 的核心:docker-compose.yml 文件

docker-compose.yml 是一个 YAML 格式 的文件,用于定义应用程序的各个服务(容器)。

示例 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3.9"

services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app

app:
image: python:3.9-slim-buster
command: python app.py
volumes:
- ./app:/app
environment:
- DEBUG=true
ports:
- "5000:5000"

文件内容分解:

  • version: "3.9": 指定 Docker Compose 文件格式版本。建议使用较新版本。
  • services:: 定义应用程序的服务 (容器)。
    • web:: 名为 web 的服务。
      • image: nginx:latest: 使用 nginx:latest 镜像。
      • ports: - "80:80": 宿主机 80 端口映射到容器 80 端口。
      • volumes: - ./html:/usr/share/nginx/html: 宿主机 ./html 目录挂载到容器 /usr/share/nginx/html 目录。
      • depends_on: - app: 依赖于 app 服务,先启动 app 再启动 web
    • app:: 名为 app 的服务。
      • image: python:3.9-slim-buster: 使用 python:3.9-slim-buster 镜像。
      • command: python app.py: 容器启动后执行 python app.py 命令。
      • volumes: - ./app:/app: 宿主机 ./app 目录挂载到容器 /app 目录。
      • environment: - DEBUG=true: 设置环境变量 DEBUG=true
      • ports: - "5000:5000": 宿主机 5000 端口映射到容器 5000 端口。

常用 Docker Compose 命令

docker-compose.yml 文件所在目录执行:

  • docker-compose up -d: 创建并启动所有服务 (后台运行)。
    1
    docker-compose up -d
  • docker-compose down: 停止并删除所有服务、网络和卷。
    1
    docker-compose down
  • docker-compose stop: 停止所有服务容器 (不删除)。
    1
    docker-compose stop
  • docker-compose start: 启动已停止的服务容器。
    1
    docker-compose start
  • docker-compose restart: 重启所有服务容器。
    1
    docker-compose restart
  • docker-compose ps: 列出容器状态。
    1
    docker-compose ps
  • docker-compose logs <service_name>: 查看指定服务日志。例如查看 web 服务日志:
    1
    docker-compose logs web
  • docker-compose exec <service_name> <command>: 在指定服务容器中执行命令。例如进入 web 服务容器的 bash shell:
    1
    docker-compose exec web bash
  • docker-compose build: 构建或重新构建镜像 (当服务使用 build 指令时)。
    1
    docker-compose build

Docker Compose 的优势总结

  • 简化多容器应用管理: 通过 docker-compose.yml 和简单命令管理复杂应用。
  • 提高开发效率: 快速搭建开发环境,方便本地测试和调试。
  • 环境一致性: 确保开发、测试和生产环境一致性。
  • 易于部署: docker-compose.yml 作为应用配置方便部署。
  • 版本控制: docker-compose.yml 可纳入版本控制系统,方便协作。

实际应用场景示例

开发一个简单的 Web 应用程序,包含:

  1. 前端 Web 服务器 (Nginx)
  2. 后端 Python 应用 (Flask)
  3. 数据库 (PostgreSQL)

可以使用 docker-compose.yml 定义这三个服务,并轻松管理它们。