Docker Compose の初心者ガイド

本日その翻訳を公開するこの記事の著者は、この記事は Docker Compose を学び、Docker を使用した最初のクライアント サーバー アプリケーションの作成に向けて取り組んでいる開発者を対象としていると述べています。 この資料の読者は Docker の基本を理解していることを前提としています。 そうでない場合は、以下を参照してください。 この 一連の資料 この Docker の基本と Kubernetes の基本をカバーする投稿、および この 初心者向けの記事。

Docker Compose の初心者ガイド

Docker Compose とは何ですか?

Docker Compose は Docker に含まれるツールです。 プロジェクトの展開に関連する問題を解決するように設計されています。

Docker の基本を学習しているときに、外部データ ソースや特定のサービスなどに依存せず、自律的に動作する単純なアプリケーションの作成に遭遇したことがあるかもしれません。 実際には、そのようなアプリケーションはまれです。 実際のプロジェクトには、通常、連携して動作する一連のアプリケーションが含まれます。

プロジェクトをデプロイするときに Docker Compose を使用する必要があるかどうかは、どうすればわかりますか? 実はとてもシンプルなのです。 このプロジェクトを機能させるために複数のサービスを使用する場合は、Docker Compose が役立つ可能性があります。 たとえば、ユーザーを認証するためにデータベースに接続する必要がある Web サイトを作成する場合です。 このようなプロジェクトは、サイトの運用を保証するサービスとデータベースの保守を担当するサービスの XNUMX つのサービスで構成される場合があります。

Docker Compose テクノロジーを簡単に説明すると、XNUMX つのコマンドで多くのサービスを起動できます。

Docker と Docker Compose の違い

Docker は、アプリケーションを構成する個々のコンテナ (サービス) を管理するために使用されます。

Docker Compose は、アプリケーションを構成する複数のコンテナを同時に管理するために使用されます。 このツールは Docker と同じ機能を提供しますが、より複雑なアプリケーションを操作できるようになります。

Docker Compose の初心者ガイド
Docker (単一コンテナ) および Docker Compose (複数コンテナ)

Docker Compose の一般的な使用例

Docker Compose は、適切に使用すると、複雑なアーキテクチャを持つアプリケーションを非常に迅速にデプロイできる非常に強力なツールになります。 ここでは、Docker Compose の実際の使用例を見ていきます。これを分析することで、Docker Compose を使用することで得られるメリットを評価できるようになります。

あなたが Web プロジェクトの開発者であると想像してください。 このプロジェクトには XNUMX つの Web サイトが含まれています。 XNUMX つ目は、ビジネスマンが数回クリックするだけでオンライン ストアを作成できるようにするものです。 XNUMX つ目は顧客サポートを目的としています。 これら XNUMX つのサイトは同じデータベースと対話します。

あなたのプロジェクトはますます人気が高まっており、それを実行するサーバーの能力ではもはや十分ではないことが判明しました。 その結果、プロジェクト全体を別のマシンに移動することにしました。

残念ながら、Docker Compose のようなものは使用していませんでした。 したがって、その過程で何も忘れないようにしながら、サービスを一度に XNUMX つずつ転送および再構成する必要があります。

Docker Compose を使用している場合、プロジェクトを新しいサーバーに移動することは、いくつかのコマンドを実行することで解決できます。 プロジェクトの新しい場所への転送を完了するには、いくつかの設定を行って、データベースのバックアップ コピーを新しいサーバーにアップロードするだけです。

Docker Compose を使用したクライアント/サーバー アプリケーションの開発

Docker Compose を何に使用するかがわかったので、次はこのツールを使用して最初のクライアント サーバー アプリケーションを作成します。 つまり、テキストの断片を含むファイルを出力できる小さな Web サイト (サーバー) を 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、その内容は後で Web ページに表示されます。

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 Compose

お気づきかと思いますが、サーバーとクライアントという XNUMX つの異なるプロジェクトを作成しました。 それぞれに独自のファイルがあります 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

コメントを追加します