Docker Compose 初学者指南

我们今天发布的这篇文章的作者表示,它是为那些想要学习 Docker Compose 并正在使用 Docker 创建第一个客户端-服务器应用程序的开发人员准备的。 假设本材料的读者熟悉 Docker 的基础知识。 如果不是这种情况,您可以看一下 系列材料 一篇涵盖 Docker 基础知识和 Kubernetes 基础知识的文章,以及 适合初学者的文章。

Docker Compose 初学者指南

什么是 Docker Compose?

Docker Compose 是 Docker 附带的一个工具。 它旨在解决与项目部署相关的问题。

在学习 Docker 基础知识时,您可能遇到过创建自主工作的最简单的应用程序,而不依赖于外部数据源或某些服务等。 实际上,这样的应用很少见。 真实的项目通常涉及一整套协作应用程序。

部署项目时如何知道是否需要使用 Docker Compose? 其实很简单。 如果您使用多个服务来运行该项目,那么 Docker Compose 可能会派上用场。 例如,在您创建一个网站的情况下,为了执行用户身份验证,需要连接到数据库。 这样的项目可能包含两项服务 - 一项服务确保站点的运行,另一项服务负责支持数据库。

Docker Compose 技术,如果用简单的方式描述的话,可以让你用一个命令启动很多服务。

Docker 和 Docker Compose 之间的区别

Docker 用于管理组成应用程序的各个容器(服务)。

Docker Compose 用于同时管理属于应用程序一部分的多个容器。 该工具提供与 Docker 相同的功能,但允许您使用更复杂的应用程序。

Docker Compose 初学者指南
Docker(单个容器)和 Docker Compose(多个容器)

典型的 Docker Compose 用例

在正确的人手中,Docker Compose 是一个非常强大的工具,可让您快速部署具有复杂架构的应用程序。 现在我们将看一个 Docker Compose 的实际使用示例,通过分析该示例,您可以评估使用 Docker Compose 给您带来的好处。

想象一下您是一个 Web 项目的开发人员。 该项目包括两个网站。 第一个允许商务人士只需点击几下即可创建在线商店。 第二个目标是客户支持。 这两个站点与同一个数据库交互。

您的项目变得越来越受欢迎,但事实证明它所运行的服务器的容量已经不够了。 因此,您决定将整个项目转移到另一台机器上。

不幸的是,您还没有使用过像 Docker Compose 这样的东西。 因此,您必须一次迁移并重新配置一项服务,希望您在这项工作的过程中不会忘记任何事情。

如果您使用 Docker Compose,那么将项目迁移到新服务器是一个可以通过运行几个命令来解决的问题。 要完成项目到新位置的转移,您只需进行一些设置并将数据库的备份副本上传到新服务器即可。

使用 Docker Compose 开发客户端-服务器应用程序

现在您已经知道我们将使用 Docker Compose 做什么,是时候使用此工具创建您的第一个客户端/服务器应用程序了。 也就是说,我们正在谈论用Python开发一个小型网站(服务器),它可以生成一个带有文本片段的文件。 该文件由同样用 Python 编写的程序(客户端)从服务器请求。 程序从服务器接收到文件后,将其中存储的文本显示在屏幕上。

请注意,我们假设您具备 Docker 基础知识并且已经安装了 Docker 平台。

让我们开始处理该项目。

▍1. 创建一个项目

为了构建您的第一个客户端/服务器应用程序,我建议您首先创建一个项目文件夹。 它应包含以下文件和文件夹:

  • 文件 docker-compose.yml。 这是一个 Docker Compose 文件,其中包含启动和配置服务所需的指令。
  • server。 它将包含使服务器工作所需的文件。
  • client。 这是客户端应用程序文件所在的位置。

因此,项目主文件夹的内容应如下所示:

.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file

▍2. 服务器创建

这里我们在创建服务器的过程中,会接触到一些关于Docker的基本知识。

2a. 创建文件

转到文件夹 server 并在其中创建以下文件:

  • 文件 server.py。 它将包含服务器代码。
  • 文件 index.html。 该文件将包含客户端应用程序应显示的一段文本。
  • 文件 Dockerfile。 这是 Docker 文件,其中包含创建服务器环境所需的指令。

这就是你的文件夹的内容应该是什么样的 server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files

2b. 编辑 Python 文件。

添加到文件 server.py 下面的代码:

#!/usr/bin/env python3

# Импорт системных библиотек python.
# Эти библиотеки будут использоваться для создания веб-сервера.
# Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python.

import http.server
import socketserver

# Эта переменная нужна для обработки запросов клиента к серверу.

handler = http.server.SimpleHTTPRequestHandler

# Тут мы указываем, что сервер мы хотим запустить на порте 1234. 
# Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose.

with socketserver.TCPServer(("", 1234), handler) as httpd:

    # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента.

   httpd.serve_forever()

此代码允许您创建一个简单的 Web 服务器。 他会给客户一份文件 index.html,其内容稍后将显示在网页上。

2c. 编辑 HTML 文件

至文件 index.html 添加以下文本:

Docker-Compose is magic!

该文本将发送给客户端。

2d. 编辑 Dockerfile

现在我们将创建一个简单的文件 Dockerfile,它将负责组织Python服务器的运行时环境。 作为创建图像的基础,我们将使用 正式地,旨在运行用 Python 编写的程序。 以下是 Dockerfile 的内容:

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа.
# Для этого используется ключевое слово 'FROM'.
# Здесь нам нужно импортировать образ python (с DockerHub).
# В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'.

FROM python:latest

# Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'.
# Для того чтобы это сделать, мы используем ключевое слово 'ADD'.
# Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере.
# Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе.
# Здесь мы помещаем файл в папку образа '/server/'.

ADD server.py /server/
ADD index.html /server/

# Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас.
# Она позволяет изменить рабочую директорию образа.
# В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'.

WORKDIR /server/

现在我们来处理客户端。

▍3. 创建一个客户端

在创建项目的客户端时,我们会回顾一些 Docker 基础知识。

3a. 创建文件

转到您的项目文件夹 client 并在其中创建以下文件:

  • 文件 client.py。 这是客户端代码所在的位置。
  • 文件 Dockerfile。 该文件与服务器文件夹中的类似文件起着相同的作用。 即,它包含一个描述如何创建执行客户端代码的环境的语句。

结果,你的文件夹 client/ 在这个阶段,它应该看起来像这样:

.
├── client.py
└── Dockerfile
0 directories, 2 files

3b. 编辑 Python 文件

添加到文件 client.py 下面的代码:

#!/usr/bin/env python3

# Импортируем системную библиотеку Python.
# Она используется для загрузки файла 'index.html' с сервера.
# Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python.

import urllib.request

# Эта переменная содержит запрос к 'http://localhost:1234/'.
# Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'.
# localhost указывает на то, что программа работает с локальным сервером.
# 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода.

fp = urllib.request.urlopen("http://localhost:1234/")

# 'encodedContent' соответствует закодированному ответу сервера ('index.html').
# 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран).

encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")

# Выводим содержимое файла, полученного с сервера ('index.html').

print(decodedContent)

# Закрываем соединение с сервером.

fp.close()

通过这段代码,客户端应用程序可以从服务器下载数据并将其显示在屏幕上。

3c. 编辑 Dockerfile

与服务器的情况一样,我们为客户端创建一个简单的 Dockerfile,负责塑造 Python 客户端应用程序运行的环境。 这是客户端代码 Dockerfile:

# То же самое, что и в серверном Dockerfile.

FROM python:latest

# Импортируем 'client.py' в папку '/client/'.

ADD client.py /client/

# Устанавливаем в качестве рабочей директории '/client/'.

WORKDIR /client/

▍4. Docker 组合

正如您所看到的,我们创建了两个不同的项目:服务器和客户端。 他们每个人都有自己的文件 Dockerfile。 到目前为止,发生的一切都没有超出使用 Docker 的基础知识。 现在我们开始使用 Docker Compose。 为此,请参阅该文件 docker-compose.yml位于项目的根文件夹中。

请注意,这里我们并不打算涵盖绝对可以使用的所有命令 docker-compose.yml。 我们的主要目标是分解一个实际示例,让您了解 Docker Compose 的基本知识。

这是要放入文件中的代码 docker-compose.yml:

# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.

version: "3"

# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.

services:

  # Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
  # Это означает, что нам нужно два сервиса.
  # Первый сервис (контейнер): сервер.
  # Назвать его можно так, как нужно разработчику.
  # Понятное название сервиса помогает определить его роль.
  # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.

  server:
 
    # Ключевое слово "build" позволяет задать
    # путь к файлу Dockerfile, который нужно использовать для создания образа,
    # который позволит запустить сервис.
    # Здесь 'server/' соответствует пути к папке сервера,
    # которая содержит соответствующий Dockerfile.

    build: server/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./server.py".

    command: python ./server.py

    # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
    # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
    # мы должны организовать перенаправление этого порта на порт компьютера.
    # Сделать это нам поможет ключевое слово 'ports'.
    # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
    # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
    # 1234 контейнера (так как именно на этот порт сервер 
    # ожидает поступления запросов).

    ports:
      - 1234:1234

  # Второй сервис (контейнер): клиент.
  # Этот сервис назван 'client'.

  client:
    # Здесь 'client/ соответствует пути к папке, которая содержит
    # файл Dockerfile для клиентской части системы.

    build: client/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./client.py".
 
    command: python ./client.py

    # Ключевое слово 'network_mode' используется для описания типа сети.
    # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.

    network_mode: host

    # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
    # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
    # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
 
    depends_on:
      - server

▍5. 项目建设

之后在 docker-compose.yml 所有必要的说明均已制定,项目需要组装。 我们工作的这一步类似于命令的使用 docker build,但是对应的命令是和几个服务相关的:

$ docker-compose build

▍6. 项目启动

现在项目已经构建完毕,是时候运行它了。 我们工作的这一步对应于使用单个容器时执行命令的步骤 docker run:

$ docker-compose up

执行此命令后,客户端从服务器加载的文本应出现在终端中: Docker-Compose is magic!.

正如已经提到的,服务器使用计算机端口 1234 以满足客户的要求。 因此,如果您在浏览器中访问该地址 http://localhost:1234/,它将显示一个带有文本的页面 Docker-Compose is magic!.

有用的命令

让我们看一下在使用 Docker Compose 时可能有用的一些命令。

此命令允许您停止和删除该命令创建的容器和其他资源 docker-compose up:

$ docker-compose down

此命令打印服务日志:

$ docker-compose logs -f [service name]

例如,在我们的项目中可以使用这种形式: $ docker-compose logs -f [service name].

使用此命令,您可以显示容器列表:

$ docker-compose ps

此命令允许您在正在运行的容器中执行命令:

$ docker-compose exec [service name] [command]

例如,它可能看起来像这样: docker-compose exec server ls.

此命令允许您显示图像列表:

$ docker-compose images

结果

我们已经介绍了使用 Docker Compose 技术的基础知识,这些知识将使您能够使用该技术,并且如果需要,可以开始更深入地研究它。 这里 包含我们在这里考虑的项目代码的存储库。

亲爱的读者! 您在项目中使用 Docker Compose 吗?

Docker Compose 初学者指南

来源: habr.com

添加评论