Docker Compose-Leitfaden für Anfänger

Der Autor des Artikels, den wir heute veröffentlichen, richtet sich an Entwickler, die Docker Compose kennenlernen möchten und auf dem Weg sind, ihre erste Client-Server-Anwendung mit Docker zu erstellen. Es wird vorausgesetzt, dass der Leser mit den Grundlagen von Docker vertraut ist. Falls nicht, können Sie sich die dieses Serie von Materialien ansehen, die dieses veröffentlicht wurden, in der die Grundlagen von Docker zusammen mit den Grundlagen von Kubernetes behandelt werden, sowie dieses einen Artikel für Anfänger.

Docker Compose-Leitfaden für Anfänger

Was ist Docker Compose?

Docker Compose ist ein Werkzeug, das Teil von Docker ist. Es dient der Bewältigung von Aufgaben im Zusammenhang mit der Bereitstellung von Projekten.

Beim Erlernen der Grundlagen von Docker sind Sie möglicherweise auf die Erstellung einfacher autonomer Anwendungen gestoßen, die beispielsweise nicht von externen Datenquellen oder bestimmten Diensten abhängen. In der Praxis sind solche Anwendungen jedoch selten. Echtzeitprojekte umfassen normalerweise eine Vielzahl von zusammenarbeitenden Anwendungen.

Wie erfahren Sie, ob Sie beim Bereitstellen eines Projekts Docker Compose verwenden sollten? Es ist tatsächlich ganz einfach. Wenn mehrere Dienste erforderlich sind, um das Projekt zum Laufen zu bringen, kann Docker Compose nützlich sein. Zum Beispiel in einem Szenario, in dem eine Website erstellt wird, die zur Benutzerautorisierung eine Verbindung zur Datenbank benötigt. Ein solches Projekt könnte aus zwei Diensten bestehen — einem, der die Website bereitstellt, und einem, der die Datenbankverwaltung übernimmt.

Die Technologie Docker Compose ermöglicht es, vereinfacht gesagt, mit einem einzigen Befehl mehrere Dienste zu starten.

Der Unterschied zwischen Docker und Docker Compose

Docker wird verwendet, um einzelne Container (Dienste) zu verwalten, aus denen eine Anwendung besteht.

Docker Compose wird verwendet, um mehrere Container gleichzeitig zu verwalten, die zur Anwendung gehören. Dieses Werkzeug bietet die gleichen Funktionen wie Docker, ermöglicht aber die Arbeit mit komplexeren Anwendungen.

Docker Compose-Leitfaden für Anfänger
Docker (einzelner Container) und Docker Compose (mehrere Container)

Typisches Nutzungsszenario für Docker Compose

Docker Compose ist, in den richtigen Händen, ein äußerst leistungsstarkes Werkzeug, das es ermöglicht, Anwendungen mit komplexer Architektur sehr schnell bereitzustellen. In diesem Artikel betrachten wir ein praktisches Beispiel für die Anwendung von Docker Compose, das Ihnen die Vorteile aufzeigen wird, die Sie durch dessen Nutzung erzielen können.

Stellen Sie sich vor, Sie sind Entwickler eines Webprojekts, das aus zwei Websites besteht. Die erste ermöglicht es Unternehmen, mit nur wenigen Klicks Onlineshops zu erstellen. Die zweite ist auf die Kundenbetreuung ausgerichtet. Diese beiden Websites interagieren mit einer gemeinsamen Datenbank.

Ihr Projekt wird zunehmend beliebter und der Server, auf dem es läuft, hat nicht mehr genügend Kapazitäten. Daher entscheiden Sie sich, das gesamte Projekt auf eine andere Maschine zu migrieren.

Leider haben Sie kein Werkzeug wie Docker Compose genutzt. Deshalb müssen Sie die Dienste einzeln migrieren und neu konfigurieren, wobei Sie hoffen, nichts Wichtiges zu vergessen.

Wenn Sie Docker Compose verwenden, ist der Umzug Ihres Projekts auf einen neuen Server eine Angelegenheit, die sich mit mehreren Befehlen lösen lässt. Um das Projekt an den neuen Standort zu migrieren, müssen Sie lediglich einige Einstellungen vornehmen und eine Datenbanksicherung auf den neuen Server hochladen.

Entwicklung einer Client-Server-Anwendung mit Docker Compose

Jetzt, da Sie wissen, wofür wir Docker Compose nutzen wollen, ist es an der Zeit, Ihre erste Client-Server-Anwendung mit diesem Tool zu erstellen. Es geht konkret um die Entwicklung einer kleinen Website (Server) in Python, die eine Datei mit einem Textfragment ausgeben kann. Diese Datei wird von einem Programm (Client), das ebenfalls in Python geschrieben ist, beim Server angefordert. Nach dem Erhalt der Datei vom Server zeigt das Programm den darin enthaltenen Text an.

Bitte beachten Sie, dass wir davon ausgehen, dass Sie über grundlegende Kenntnisse in Docker verfügen und die Docker-Plattform bereits installiert ist.

Lassen Sie uns mit der Arbeit am Projekt beginnen.

▍1. Projekt erstellen

Um Ihre erste Client-Server-Anwendung zu erstellen, beginnen wir mit dem Erstellen eines Projektordners. Dieser sollte folgende Dateien und Ordner enthalten:

  • Die Datei docker-compose.yml. Dies ist die Docker Compose-Datei, die die notwendigen Anweisungen zum Starten und Konfigurieren der Dienste enthält.
  • Ordner server. Dieser wird die Dateien enthalten, die für den Betrieb des Servers erforderlich sind.
  • Ordner client. Hier werden die Dateien der Client-Anwendung gespeichert.

Somit sollte der Inhalt des Hauptordners Ihres Projekts wie folgt aussehen:

.
├── client/
├── docker-compose.yml
└── server/
2 Verzeichnisse, 1 Datei

▍2. Servererstellung

Im Folgenden werden wir beim Erstellen des Servers einige grundlegende Aspekte zu Docker berücksichtigen.

2a. Erstellen von Dateien

Navigieren Sie in den Ordner server und erstellen Sie darin die folgenden Dateien:

  • Die Datei server.py. In dieser wird der Servercode untergebracht sein.
  • Die Datei index.html. In dieser Datei wird der Textausschnitt stehen, den die Client-Anwendung ausgeben soll.
  • Die Datei Dockerfile. Dies ist die Docker-Datei, die die Anweisungen zur Erstellung der Serverumgebung enthalten wird.

So sollte der Inhalt Ihres Ordners server/:

.
├── Dockerfile
├── index.html
└── server.py
0 Verzeichnisse, 3 Dateien

2b. Bearbeiten der Python-Datei.

Fügen wir in die Datei ein server.py folgender Code:

#!/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()

Dieser Code ermöglicht es, einen einfachen Webserver zu erstellen. Er wird den Clients eine Datei ausgeben, index.html, deren Inhalt später auf der Webseite angezeigt wird.

2c. Bearbeiten der HTML-Datei

In die Datei index.html fügen wir den folgenden Text ein:

Docker-Compose ist magisch!

Dieser Text wird an den Client übermittelt.

2d. Bearbeiten der Dockerfile-Datei

Jetzt erstellen wir eine einfache Datei, Dockerfiledie für die Organisation der Ausführungsumgebung des Python-Servers zuständig sein wird. Als Basis für das zu erstellende Image verwenden wir das offizielle Image,das für die Ausführung von Programmen, die in Python geschrieben sind, vorgesehen ist. Hier ist der Inhalt der 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/

Jetzt kümmern wir uns um die Arbeit am Client.

▍3. Erstellung des Clients

Bei der Erstellung des Clients unseres Projekts werden wir einige Grundlagen von Docker auffrischen.

3a. Dateien erstellen

Gehen Sie in den Ordner Ihres Projekts client und erstellen Sie darin die folgenden Dateien:

  • Die Datei client.py. Hier wird der Client-Code liegen.
  • Die Datei Dockerfile. Diese Datei erfüllt die gleiche Funktion wie die entsprechende Datei im Serverordner. Sie enthält nämlich die Anweisung zur Erstellung der Umgebung für die Ausführung des Client-Codes.

Infolgedessen sollte Ihr Ordner client/ in diesem Arbeitsabschnitt so aussehen:

.
├── client.py
└── Dockerfile
0 Verzeichnisse, 2 Dateien

3b. Bearbeiten der Python-Datei

Fügen wir in die Datei ein client.py folgender Code:

#!/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()

Dank diesem Code kann die Client-Anwendung Daten vom Server abrufen und sie auf dem Bildschirm anzeigen.

3c. Bearbeitung der Dockerfile

Wie beim Server erstellen wir für den Client eine einfache Dockerfile, die für die Einrichtung der Umgebung verantwortlich ist, in der die Client-Python-Anwendung ausgeführt wird. Hier ist der Code des Clients. Dockerfile:

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

FROM python:latest

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

ADD client.py /client/

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

WORKDIR /client/

▍4. Docker Compose

Wie Sie vielleicht bemerkt haben, haben wir zwei verschiedene Projekte erstellt: Server und Client. Jedes von ihnen hat seine eigene Dockerfile. Bisher ist alles im Rahmen der Grundlagen der Arbeit mit Docker geblieben. Jetzt beginnen wir mit der Arbeit mit Docker Compose. Dazu schauen wir uns die Datei an docker-compose.yml, die im Stammordner des Projekts zu finden ist.

Bitte beachten Sie, dass wir hier nicht alle möglichen Befehle, die man in docker-compose.yml, nutzen kann, besprechen wollen. Unser Hauptziel ist es, ein praktisches Beispiel zu behandeln, das Ihnen grundlegende Kenntnisse über Docker Compose vermittelt.

Hier ist der Code, den Sie in die Datei einfügen sollten. 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. Projektzusammenstellung

Nachdem in docker-compose.yml alle notwendigen Anweisungen eingefügt wurden, muss das Projekt kompiliert werden. Dieser Schritt unserer Arbeit ähnelt der Verwendung des Befehls docker build, jedoch bezieht sich der entsprechende Befehl auf mehrere Dienste:

$ docker-compose build

▍6. Projekt starten

Jetzt, da das Projekt erstellt ist, ist es Zeit, es zu starten. Dieser Schritt entspricht dem Prozess, bei dem, wenn man mit einzelnen Containern arbeitet, der Befehl ausgeführt wird. docker run:

$ docker-compose up

Nach der Ausführung dieses Befehls sollte im Terminal der vom Client vom Server geladene Text angezeigt werden: Docker-Compose ist magisch!.

Wie bereits erwähnt, verwendet der Server den Port des Computers 1234 um Anfragen vom Client zu bearbeiten. Wenn Sie daher im Browser die Adresse http://localhost:1234/, wird eine Seite mit Text angezeigt. Docker-Compose ist magisch!.

Nützliche Befehle

Schauen wir uns einige Befehle an, die bei der Arbeit mit Docker Compose nützlich sein können.

Dieser Befehl ermöglicht es, Container und andere mit dem Befehl erstellte Ressourcen zu stoppen und zu löschen: docker-compose up:

$ docker-compose down

Dieser Befehl gibt die Logs der Services aus:

$ docker-compose logs -f [service name]

Zum Beispiel kann er in unserem Projekt so verwendet werden: $ docker-compose logs -f [service name].

Mit einem solchen Befehl kann die Liste der Container angezeigt werden:

$ docker-compose ps

Dieser Befehl ermöglicht es, einen Befehl in einem laufenden Container auszuführen:

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

Zum Beispiel kann er so aussehen: docker-compose exec server ls.

Ein solcher Befehl ermöglicht es, die Liste der Images anzuzeigen:

$ docker-compose images

Ergebnisse

Wir haben die Grundlagen der Verwendung von Docker Compose behandelt. Dieses Wissen ermöglicht es Ihnen, diese Technologie zu nutzen und bei Interesse tiefergehendes Wissen zu erlangen. Hier Repository mit dem Code des Projekts, das wir hier behandelt haben.

Sehr geehrte Leser! Setzen Sie Docker Compose in Ihren Projekten ein?

Docker Compose-Leitfaden für Anfänger

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster