Docker Compose 运行多容器应用程序

本文讨论如何使用单个命令运行多容器应用程序。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用配置文件(YAML 文件)来配置您的 Docker 容器。然后,使用单个命令配置 Yaml 文件后,您就可以从您的配置中创建并启动所有服务(容器)。

假设我们有一个简单的应用程序,包含两个组件:一个 Flask 应用和一个 Redis 数据库。我将分别使用和不使用 docker-compose 工具来运行这个完整的应用程序,这将展示 docker-compose 工具的主要用途。

什么是 Docker Compose?它如何工作?

Docker Compose是一个软件容器化工具,旨在使用单个命令来编排多容器Docker 应用程序的定义和运行。它从单个配置 Yaml 文件中读取多个容器的定义,并使用单行命令执行编排,方便开发人员使用。

它简化了复杂应用程序的管理,允许用户指定应用程序所需的服务、网络和Docker 卷。在配置 yaml 文件中,开发人员可以指定每个服务的参数,包括Docker 镜像、环境变量、端口和依赖项。Docker Compose 通过将整个应用程序设置封装在 dockercompose.yml 文件中来确保应用程序的安全性,从而确保在不同开发环境中保持一致性,从而轻松共享和可靠地复制应用程序。

为项目创建工作环境

步骤 1:创建一个包含我们项目的目录gfg_docker_compose

$ mkdir gfg_docker_compose  

 

第 2 步:通过运行以下命令移动到该目录并将其作为工作目录。

$ cd gfg_docker_compose  

步骤 3:创建requirements.txt文件

$touch requirements.txt

  步骤 4:将下面提供的代码复制到 requirements.txt 文件中。

flask
redis

步骤 5:创建文件app.py。它将用于保存我们的Flask 应用的代码

$ touch app.py  

  步骤 6:现在将以下代码复制到app.py

from flask import Flask, request, json
from redis import Redis

# initializing a new flask app
app = Flask(__name__)

# initializing a new redis database
# Hostname will be same as the redis service name
# in the docker compose configuration
redis = Redis(host ="localhost", db = 0, socket_timeout = 5,
              charset ="utf-8", decode_responses = True)

# Our app has a single route allowing two methods POST and GET.

@app.route('/', methods =['POST', 'GET'])
def animals():

    if request.method == 'POST':
        # Take the name of the animal
        name = request.json['name']
        # push the name to the end of animals list in the redis db
        redis.rpush('animals', {'name': name})
        # return a success
        return jsonify({'status': 'success'})

    if request.method == 'GET':
        # return complete list of names from animals
        return jsonify(redis.lrange('animals', 0, -1))

容器化应用程序的解释

这里我们简单地接收GET 和 POST 两种请求方法。每当 POST 请求包含名称时,名称都会添加到动物列表的末尾。对于 GET 请求,我们将返回动物列表中的名称列表。

第七步:创建名为dockerfile的文件。

$ touch dockerfile  

  步骤 8:现在尝试将以下代码复制到创建的 dockerfile 中。

# Pulling the base image
FROM python:3.7.0-alpine3.8

# Creating a folder and moving into it
WORKDIR /usr/src/app

# Copying the dependency list 
COPY requirements.txt ./

# Installing the python dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Copying the flask code into the container
COPY . .

ENV FLASK_APP=app.py

EXPOSE 5000

# Starting the server
CMD flask run --host=0.0.0.0

Dockerfile 的解释

通过配置 Dockerfile 的定义,我们将从基础镜像python:3.7.0-alpine3.8 开始。我们将复制requirements.txt文件并安装所有 Flask 应用依赖项。然后,我们将app.py文件复制到容器中,最后运行 Flask 应用。

现在我们准备好了 docker 应用程序。首先,让我们看看如何在不使用 docker-compose 的情况下运行 docker 应用程序,然后再使用 docker-compose 工具运行,这样您就可以有效地了解 docker compose 的作用。

不使用 Docker Compose 工具部署 Docker 应用程序

对于一个多容器应用程序来说,如果没有 Docker Compose 工具,部署和使用起来会非常繁琐。因为每次运行应用程序时,你都需要记住完整的配置和使用方法。让我们看看如何在没有 Compose 工具的情况下正常部署和运行它。到目前为止,我们已经在 gfg_docker_compose 目录中创建了应用程序文件,例如 requirements.txt 、 app.py 和 Dockerfile 。

步骤 1:首先,在这种方法中,我们将使用 docker run 命令运行并启动我们的 redis 服务器容器,如下所示:

$ docker run --name=redis redis:4.0.11-alpine  

步骤2:从下面的实际截图中,您可以看到正在下载带有 alpine 镜像的redis版本 4.0.11的软件包,提取 docker hub 并启动 redis 服务器。

Screenshot20200601at33136PM-副本-(1)

步骤 3:现在我们的 redis 已经启动,因此你应该获取它的容器 IP 地址

gfg_docker_compose/ $ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis

提取 redis 容器 IP 地址

  • 这会为您提供一个 IP 地址,您需要将其放入 app.py 中的主机参数中。

  • 现在该行看起来像在 app.py

redis = Redis(host="IPAddress", db=0, socket_timeout=5,
              charset="utf-8", decode_responses=True)

其中 IPAddress 是从 redis 容器获取的 IP 地址。

步骤 4:构建 Flask 应用程序

docker build -t gfg/flask-app .

我们的 gfg/flask-app 镜像已成功构建

步骤5:等待一段时间,直到应用程序镜像构建完成。现在我们将启动Flask应用程序容器。

步骤 6:打开一个新的终端选项卡并运行以下命令

$ docker run -p 5000:5000 gfg/flask-app  

  我们的 Flask 应用已启动

步骤 7:使用该命令,我们将拉取之前构建的gfg/flask-app ,并运行 flask 应用容器。此外, -p用于将端口 5000 从容器映射到主机。

步骤 8:最后,当您在浏览器上路由到 flask 应用程序时,您应该会看到类似这样的内容。

我们的应用程序正在运行

使用 Docker Compose 工具部署 Docker 应用程序

使用 docker-compose 工具,多容器 Docker 应用程序的设置过程将变得非常简单。其背后的简单思路是,我们将完整的容器配置写入名为 docker-compose.yml 的 YAML 文件中,然后使用简单的命令即可启动和停止这些应用程序。此方法还可以帮助我们轻松地与其他开发人员共享 Docker 应用程序,只需在项目中共享 docker-compose 文件即可。

步骤1:首先创建 docker-compose.yml 文件。

$ touch docker-compose.yml

 

  • 到目前为止,我们在 gfg_docker_compose 工作目录中创建了 app.py 、requirements.txtDockerfileDocker-compose.yml 文件。项目树如下所示:
gfg_docker_compose   
--->> app.py   
--->> requirements.txt   
--->> Dockerfile   
--->> docker-compose.yml  

  第 2 步: 现在将以下 YAML 代码复制到docker-compose.yml文件。

version: '3'

services:
  app:
    build: .
    image: gfg/flask-app
    environment:
      - FLASK_ENV=development
    ports:
      - 5000:5000

  redis:
    image: redis:4.0.11-alpine

 

Docker Compose 文件及其术语的解释

以下是上面配置的Docker Compose文件中指定的关键字:

  • _version:_ 指定要使用的 docker-compose 版本,这里我们使用版本 3

  • _services:_ 保存我们所有的应用服务(容器)配置。

  • _app:_ 我们将我们的 flask 应用程序命名为应用程序服务,您可以随意给它起任何其他您想要的名字。

  • _build:_ Dockerfile 的相对路径

  • _environment:_ 环境变量列表

  • _ports:_ 从容器映射到主机的端口列表

  • _redis:_ 我们的redis服务的名称

  • _image:_ 镜像的名称。

注意:服务名称appredis也是我们运行的服务(容器)的主机名,因为 docker-compose 会自动创建一个网络,并将我们的容器添加到该网络中,这样每个容器都可以通过服务名称作为该网络中的主机名来识别其他容器。因此,我们将在 app.py文件中保留 redis 本身的 host 参数。

步骤 3: 现在使用以下 docker compose 命令启动应用程序:

$ docker-compose up --build  

  屏幕截图20200601下午42121点-副本

  • –build 用于明确提及在启动应用程序之前构建镜像。

  • 您可以看到应用程序按如下所示运行

我们的docker应用程序正在运行

步骤 4: 要停止整个应用程序,请运行以下 docker compose 命令:

$docker-compose down  

  使用 Docker compose 停止容器

  • 使用docker-compose工具,我们可以使多容器docker应用程序的设置过程比通常的方式更快、更容易。

结论

总而言之,Docker Compose 提供了一种部署和管理多容器应用程序的有效方法。它提供了一种高效的解决方案,只需一条命令即可定义、配置和运行服务。使用 Yaml 文件,开发人员可以轻松复制和共享其复杂的应用程序设置。无论是使用 Redis 部署 Flask 应用,还是处理更复杂的场景,Docker Compose 都能简化编排流程,从而实现高效且可扩展的容器化部署。

Leave a Comment