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 初學者指南

來源: www.habr.com

添加評論