📜  Docker compose 工具来运行多容器应用程序

📅  最后修改于: 2021-10-28 02:57:43             🧑  作者: Mango

本文的目标是展示如何使用单个命令运行多容器应用程序。 Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用配置文件(YAML 文件)来配置您的 docker 容器。然后,使用单个命令,从配置中创建并启动所有服务(容器)。让我举个例子来解释一下。

本文希望您熟悉docker并有一定的使用经验。

假设我们有一个简单的应用程序,它有两个组件,flask 应用程序和一个 redis 数据库。我将在使用和不使用 docker-compose 工具的情况下运行完整的应用程序,这将使您主要使用此 compose 工具。

创建项目

创建目录gfg_docker_compose保存我们的项目

$ mkdir gfg_docker_compose

移动到那个目录

$ cd gfg_docker_compose

创建requirements.txt文件

gfg_docker_compose/ $ touch requirements.txt

复制到requirements.txt

Python
flask
redis


Python3
from flask import Flask, request, jsonify
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))


Python3
# 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


Python
version: '3'
 
services:
  app:
    build: .
    image: gfg/flask-app
    environment:
      - FLASK_ENV=development
    ports:
      - 5000:5000
 
  redis:
    image: redis:4.0.11-alpine


创建文件app.py将包含我们的烧瓶应用程序的代码

gfg_docker_compose/ $ touch app.py

复制以下代码到app.py

蟒蛇3

from flask import Flask, request, jsonify
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

gfg_docker_compose/ $ touch dockerfile

将以下代码复制到dockerfile

蟒蛇3

# 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

解释:

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

现在我们准备好了 docker 应用程序。

没有 docker-compose 工具

对于多容器应用程序来说,在没有编写工具的情况下启动和使用此应用程序会很繁琐,因为您需要记住完整的配置并在运行应用程序时使用。让我们看看它在没有撰写工具的情况下通常如何

现在您将拥有一个项目树

gfg_docker_compose
--- app.py
--- requirements.txt
--- Dockerfile

现在将运行并启动我们的 redis 服务器容器

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

redis服务器启动

因此,使用该命令,我们将拉取redis:4.0.11-alpine映像并运行一个 redis 容器。现在我们的 redis 已经启动,所以你应该获取它的容器 IP 地址

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

提取redis容器IP地址

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

现在这条线看起来像app.py

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

其中 IPAdress 是您从 redis 容器获得的 IP 地址。

构建烧瓶应用程序

gfg_docker_compose/ $  docker build -t gfg/flask-app .

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

等待一段时间,将构建应用程序映像

现在我们也将启动我们的烧瓶应用程序容器。

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

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

我们的烧瓶应用程序已启动

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

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

我们的应用程序正在运行

使用 docker-compose 工具

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

创建docker-compose.yml文件

gfg_docker_compose/ $  touch docker-compose.yml

现在项目树看起来像

gfg_docker_compose
--- app.py
--- requirements.txt
--- Dockerfile
--- docker-compose.yml

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

Python

version: '3'
 
services:
  app:
    build: .
    image: gfg/flask-app
    environment:
      - FLASK_ENV=development
    ports:
      - 5000:5000
 
  redis:
    image: redis:4.0.11-alpine

解释:

  • version:说明要使用的 docker-compose 版本,这里我们使用的是版本 3
  • services:保存我们所有的应用服务(容器)配置。
  • app:我们已经将我们的flask app命名为app service,你可以随意给它起任何你想要的名字。
  • build: Dockerfile 的相对路径
  • 图像:最终 docker 应用程序图像的名称
  • 环境:环境变量列表
  • 端口:要从容器映射到主机的端口列表
  • redis:我们的 redis 服务的名称
  • 图像:图像的名称。

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

启动应用程序

gfg_docker_compose/ $  docker-compose up --build

一个成功的 docker-compose up 输出看起来像这样

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

您可以看到应用程序如下工作

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

停止完整的应用程序

gfg_docker_compose/ $  docker-compose down

一个成功的 docker-compose down 看起来像这样

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