docker compose 是 Docker 官方提供的一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务,并可以一键启动、停止、重建服务。

本文将以一个实际的案例来介绍如何使用 Docker Compose 在一个镜像上运行多个容器实例。我们将创建一个简单的 Web 应用程序,并使用 Docker Compose 来启动多个实例来处理不同的请求。

准备工作

在开始之前,我们需要安装 Docker 和 Docker Compose。可以根据官方文档的说明进行安装。

安装完成后,我们可以通过运行以下命令来验证安装是否成功:

docker --version
docker-compose --version

如果显示了 Docker 和 Docker Compose 的版本信息,则说明安装成功。

创建一个简单的 Web 应用程序

我们将创建一个简单的 Web 应用程序,它使用 Flask 框架来提供一个简单的 "Hello, World!" 页面。我们使用 Python 来编写应用程序的代码。

首先,创建一个名为 app.py 的文件,并将以下代码复制到文件中:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

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

上述代码创建了一个 Flask 应用程序,并定义了一个路由,当访问根路径时返回 "Hello, World!"。

接下来,我们需要创建一个名为 Dockerfile 的文件,并将以下代码复制到文件中:

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

上述代码定义了一个 Docker 镜像,它基于 Python 3.8 镜像,并将应用程序的代码复制到镜像中。然后,它安装了应用程序所需的依赖,并启动应用程序。

最后,我们需要创建一个名为 requirements.txt 的文件,并将以下代码复制到文件中:

flask

上述代码列出了应用程序所需的依赖库,这里只有 Flask。

编写 Docker Compose 配置文件

现在我们可以编写 Docker Compose 的配置文件了。创建一个名为 docker-compose.yml 的文件,并将以下代码复制到文件中:

version: '3'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - FLASK_ENV=development

上述代码定义了一个服务名为 web 的服务。它使用当前目录中的 Dockerfile 来构建镜像,并将容器的 5000 端口映射到主机的 5000 端口。此外,它还定义了一个环境变量 FLASK_ENV,其值为 development,用于指定 Flask 运行在开发环境。

启动容器实例

现在,我们可以使用 Docker Compose 来启动容器实例了。在终端中,进入包含 docker-compose.yml 文件的目录,并运行以下命令:

docker-compose up --scale web=3

上述命令将会启动 3 个 web 服务的容器实例,每个实例都将会监听主机的 5000 端口。

验证应用程序

当容器实例启动后,我们可以在浏览器中访问 http://localhost:5000 来验证应用程序是否正常工作。可以多次访问该 URL,观察到不同的实例处理了不同的请求。

此外,我们可以使用 docker ps 命令来查看当前正在运行的容器实例:

docker ps

关系图

下面是一个使用 Docker Compose 运行多个容器实例的关系图:

erDiagram
    web --|> container

上述关系图表示 web 服务是由多个容器实例组成的。

状态图

下面是一个使用 Docker Compose 运行多个容器实例的状态图:

stateDiagram
    [*] --> Stopped