文章目录

Docker Compose:多容器编排

发布于 2026-04-13 10:17:20 · 浏览 35 次 · 评论 0 条

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过 YAML 文件配置应用程序的服务,使用一条命令即可创建并启动所有服务。


1. 环境准备与项目初始化

在开始之前,确保已安装 Docker Engine 和 Docker Compose 插件。

创建 一个名为 docker-compose-demo 的项目目录,并进入该目录。

mkdir docker-compose-demo
cd docker-compose-demo

在这个示例中,我们将构建一个简单的 Web 应用,包含两个容器:

  1. Web 服务:一个 Python Flask 应用。
  2. Redis 服务:用于为 Web 应用提供缓存和计数功能。

以下是两个容器之间的关系示意图:

graph LR User[用户浏览器] -->|"HTTP 请求"| Web[Web 服务] Web -->|"读写数据"| Redis[Redis 数据库] Web -.->|日志输出| Logs[(终端输出)]

2. 创建 Web 应用代码

我们需要为 Web 服务准备代码文件。

新建一个名为 app.py 的文件,并写入以下代码:

import time
import redis
from flask import Flask

app = Flask(__name__)
# 通过服务名 'redis' 连接数据库
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

这段代码的功能是连接到 Redis 服务,并在每次访问页面时增加计数器。

新建一个名为 requirements.txt 的文件,用于声明 Python 依赖包:

flask
redis

3. 编写 Web 服务的 Dockerfile

为了让 Docker 能够构建 Web 服务的镜像,我们需要定义 Dockerfile

创建一个名为 Dockerfile 的文件(注意文件名首字母大写且无后缀),并粘贴以下内容:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

这个文件的作用是:基于 Python 3.7 镜像,安装依赖,并将当前目录下的代码复制到容器中,最后启动 Flask 应用。


4. 编写 docker-compose.yml 编排文件

这是整个编排过程的核心。docker-compose.yml 文件将定义 Web 服务和 Redis 服务如何协同工作。

创建一个名为 docker-compose.yml 的文件,并写入以下内容:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

代码解析

  • version: 指定 Compose 文件的版本格式。
  • services: 定义了两个服务:webredis
  • web:
    • build: .: 告诉 Docker 使用当前目录下的 Dockerfile 来构建镜像。
    • ports: 将主机的 8000 端口映射到容器的 5000 端口。
  • redis:
    • image: 直接使用 Docker Hub 上的官方 redis:alpine 镜像,无需构建。

此时,你的项目目录结构应包含以下文件:

文件名 描述
app.py Python 应用主程序
requirements.txt Python 依赖列表
Dockerfile Web 镜像构建文件
docker-compose.yml 多容器编排配置文件

5. 启动多容器应用

配置完成后,使用 Docker Compose 命令来启动整个系统。

执行以下命令来构建并启动服务:

docker compose up

注意:如果 Docker Compose 版本较旧,可能需要使用 docker-compose(带连字符)。

当你看到终端输出包含 Hello World! I have been seen 1 times. 或者类似的启动成功日志时,说明服务已经运行。

打开浏览器,访问 http://localhost:8000

刷新页面几次,你会发现页面上的数字在不断递增。这证明 Flask 应用成功连接到了 Redis 容器,并共享了计数状态。


6. 后台运行与日志管理

在前台运行(当前模式)时,关闭终端或按下 Ctrl + C 会停止所有服务。为了在后台运行服务,请遵循以下步骤:

按下 Ctrl + C 停止当前运行的服务。

执行以下命令以“分离模式”启动服务(即在后台运行):

docker compose up -d

此时终端会返回容器 ID,但不会占据控制台。如果需要查看服务输出,运行

docker compose logs

如果只想查看特定服务的日志(例如 Web 服务),运行

docker compose logs web

实时跟踪日志输出(类似 tail -f),添加 -f 参数:

docker compose logs -f

7. 停止与清理

当实验结束或需要重新部署时,必须清理资源。

停止正在运行的服务(保留容器文件系统):

docker compose stop

停止删除所有容器、网络,以及默认创建的匿名卷:

docker compose down

如果希望彻底清理,包括删除 Redis 产生的数据卷(即重置计数器),请添加 -v 参数:

docker compose down -v

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文