Docker Compose 是一种用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用一个 YAML 文件来配置应用程序服务,并使用单个命令来启动所有服务。以下是一个详细的使用实例,展示如何使用 Docker Compose 来管理一个简单的多容器应用。

1. 环境准备

假设我们有一个简单的应用程序,其中包含以下两部分:

  • Web 应用:用 Python 和 Flask 框架构建的 Web 应用。
  • 数据库:使用 MySQL 作为数据库。

2. 创建项目目录

在开始之前,先创建一个项目文件夹:

mkdir flask-docker-compose
cd flask-docker-compose

3. 创建 Flask 应用

在项目目录下,创建一个 app.py 文件,编写简单的 Flask 应用:

# app.py
from flask import Flask
import mysql.connector

app = Flask(__name__)

@app.route('/')
def hello_world():
    db = mysql.connector.connect(
        host="db",  # 这里指向docker-compose配置中的服务名
        user="root",
        password="example",
        database="test_db"
    )
    cursor = db.cursor()
    cursor.execute("SELECT 'Hello, World!'")
    result = cursor.fetchone()
    return result[0]

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

4. 创建 requirements.txt

在同一目录下创建一个 requirements.txt 文件来管理 Python 依赖:

flask
mysql-connector-python

5. 创建 Dockerfile

为了容器化 Flask 应用,需要创建一个 Dockerfile 来定义如何构建应用的镜像:

# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . /app

# 安装 Python 依赖
RUN pip install -r requirements.txt

# 设置环境变量
ENV FLASK_APP=app.py

# 暴露 Flask 服务的端口
EXPOSE 5000

# 启动 Flask 应用
CMD ["flask", "run", "--host=0.0.0.0"]

6. 创建 MySQL 数据库的 Docker 配置

接下来,创建一个 Docker Compose 文件 docker-compose.yml,用来定义所有服务(包括 Flask 应用和 MySQL 数据库)的配置:

version: '3.8'

services:
  # 定义 Flask 应用服务
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      - FLASK_ENV=development

  # 定义 MySQL 服务
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: test_db
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql

volumes:
  mysql-data:

7. 启动服务

在项目目录下执行以下命令来启动 Docker Compose 服务:

docker-compose up

该命令将自动构建 Flask 应用的 Docker 镜像,并启动 Flask 应用和 MySQL 服务。

8. 测试应用

启动成功后,打开浏览器并访问 http://localhost:5000。如果一切顺利,您应该会看到页面显示 Hello, World!,这表明 Flask 应用已成功连接到 MySQL 数据库并从中获取数据。

9. 其他常见 Docker Compose 命令

  • 查看当前运行的容器:docker-compose ps
  • 停止服务:docker-compose down
  • 查看服务日志:docker-compose logs
  • 在后台运行 Docker Compose(不阻塞终端):docker-compose up -d

10. 优化与扩展

如果你的应用更加复杂,比如需要连接缓存(如 Redis),你可以在 docker-compose.yml 中继续添加服务。例如,添加 Redis 服务:

  redis:
    image: redis
    ports:
      - "6379:6379"

然后,修改 Flask 应用或其他服务以便与 Redis 进行交互。

总结

通过 Docker Compose,您可以轻松地定义、运行和管理多容器应用。Compose 文件使得服务配置更加简洁明了,并能够快速启动和停止整个应用栈。使用 Docker Compose 的好处是,您可以将不同的服务(如数据库、缓存、Web 应用)组合在一起,避免了在不同的 Docker 容器中手动管理依赖项。