Der Autor des heutigen Artikels sagt, dass er für Entwickler gedacht ist, die Docker Compose lernen wollen und darauf hinarbeiten, ihre erste Client-Server-Anwendung mit Docker zu erstellen. Es wird davon ausgegangen, dass der Leser mit den Grundlagen von Docker vertraut ist. Falls nicht, können Sie sich ansehen die Reihe von Materialien, die auf die Veröffentlichung, in der die Grundlagen von Docker zusammen mit den Grundlagen von Kubernetes behandelt werden, sowie einen Artikel für Anfänger.
Was ist Docker Compose?
Docker Compose ist ein Tool, das Teil von Docker ist. Es dient der Lösung von Aufgaben, die mit der Bereitstellung von Projekten verbunden sind.
Bei der Erlernung der Grundlagen von Docker könnten Sie auf die Erstellung einfachster Anwendungen stoßen, die autonom funktionieren, ohne beispielsweise von externen Datenquellen oder bestimmten Diensten abhängig zu sein. In der Praxis sind solche Anwendungen jedoch eine Seltenheit. Echte Projekte umfassen in der Regel eine Vielzahl miteinander arbeitender Anwendungen.
Wie erfahren Sie, ob Sie Docker Compose bei der Bereitstellung eines Projekts nutzen sollten? Tatsächlich ist es sehr einfach. Wenn mehrere Dienste für das Funktionieren des Projekts erforderlich sind, kann Docker Compose Ihnen nützlich sein. Zum Beispiel in einem Szenario, in dem eine Website erstellt wird, die für die Benutzerauthentifizierung auf eine Datenbank zugreifen muss. Ein solches Projekt kann aus zwei Diensten bestehen – dem, der die Website betreibt, und dem, der die Datenbank unterstützt.
Die Technologie Docker Compose, einfach ausgedrückt, ermöglicht es, 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, die Teil einer Anwendung sind, gleichzeitig zu verwalten. Dieses Werkzeug bietet die gleichen Funktionen wie Docker, ermöglicht jedoch die Arbeit mit komplexeren Anwendungen.

Docker (einzelner Container) und Docker Compose (mehrere Container)
Typisches Nutzungsszenario für Docker Compose
Docker Compose ist, in fähigen Händen, ein äußerst leistungsstarkes Werkzeug, das es ermöglicht, Anwendungen mit komplexer Architektur sehr schnell bereitzustellen. Jetzt werden wir ein praktisches Anwendungsbeispiel von Docker Compose betrachten, dessen Analyse Ihnen die Vorteile aufzeigen wird, die Ihnen die Verwendung von Docker Compose bietet.
Stellen Sie sich vor, Sie sind der Entwickler eines Webprojekts. Dieses Projekt umfasst zwei Websites. Die erste ermöglicht es Geschäftsleuten, mit nur wenigen Mausklicks Online-Shops zu erstellen. Die zweite ist auf den Kundensupport ausgerichtet. Diese beiden Seiten interagieren mit derselben Datenbank.
Ihr Projekt wird immer beliebter, und es stellt sich heraus, dass die Serverleistung, auf der es läuft, nicht ausreicht. Daher entscheiden Sie sich, das gesamte Projekt auf einen anderen Rechner zu migrieren.
Leider haben Sie nichts in der Art von Docker Compose verwendet. Daher müssen Sie die Dienste einzeln migrieren und neu konfigurieren, in der Hoffnung, während dieses Prozesses nichts zu vergessen.
Wenn Sie Docker Compose verwenden, ist die Migration Ihres Projekts auf einen neuen Server eine Angelegenheit, die sich mit ein paar Befehlen erledigen lässt. Um die Migration des Projekts abzuschließen, müssen Sie nur einige Einstellungen vornehmen und ein Backup der Datenbank auf den neuen Server hochladen.
Entwicklung einer Client-Server-Anwendung mit Docker Compose
Jetzt, da Sie wissen, wofür wir Docker Compose verwenden möchten, ist es an der Zeit, Ihre erste Client-Server-Anwendung mit diesem Werkzeug zu erstellen. Es geht darum, eine kleine Website (Server) in Python zu entwickeln, die eine Datei mit einem Textausschnitt bereitstellt. Diese Datei wird von einem Programm (Client), ebenfalls in Python geschrieben, vom Server angefordert. Nach Erhalt der Datei gibt das Programm den darin enthaltenen Text auf dem Bildschirm aus.
Bitte beachten Sie, dass wir davon ausgehen, dass Sie über grundlegende Kenntnisse in Docker verfügen und dass Sie die Docker-Plattform bereits installiert haben.
Lassen Sie uns mit der Arbeit an dem Projekt beginnen.
▍1. Erstellung des Projekts
Um Ihre erste Client-Server-Anwendung zu erstellen, schlage ich vor, mit der Erstellung eines Projektordners zu beginnen. Dieser sollte die folgenden Dateien und Ordner enthalten:
- Die Datei
docker-compose.ymlDies ist eine Docker Compose-Datei, die die erforderlichen Anweisungen zum Starten und Konfigurieren der Dienste enthält. - Ordner
serverDieser wird Dateien enthalten, die für den Betrieb des Servers erforderlich sind. - Ordner
clientHier werden sich die Dateien der Client-Anwendung befinden.
Das Ergebnis sollte wie folgt aussehen:
.
├── client/
├── docker-compose.yml
└── server/
2 Verzeichnisse, 1 Datei▍2. Server erstellen
Hier werden wir einige grundlegende Aspekte von Docker beim Erstellen des Servers behandeln.
2a. Dateien erstellen
Wechseln Sie in den Ordner server und erstellen Sie darin die folgenden Dateien:
- Die Datei
server.pyDarin wird sich der Server-Code befinden. - Die Datei
index.htmlIn dieser Datei wird sich ein Textfragment befinden, das von der Client-Anwendung ausgegeben werden soll. - Die Datei
DockerfileDies ist eine Docker-Datei, die die erforderlichen Anweisungen zum Erstellen der Serverumgebung enthält.
So sollte der Inhalt Ihres Ordners aussehen sprechen für sich, während:
.
├── Dockerfile
├── index.html
└── server.py
0 Verzeichnisse, 3 Dateien2b. Python-Datei bearbeiten.
Fügen wir in die Datei server.py den folgenden Code ein:
#!/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 die Datei index.html, deren Inhalt später auf der Webseite angezeigt wird, bereitstellen.
2c. HTML-Datei bearbeiten
In die Datei index.html fügen wir den folgenden Text ein:
Docker-Compose ist magisch!Dieser Text wird an den Client gesendet.
2d. Dockerfile bearbeiten
Jetzt erstellen wir eine einfache Datei Dockerfile, die für die Organisation der Laufzeitumgebung für den Python-Server verantwortlich ist. Als Basis für das zu erstellende Image verwenden wir , das zum Ausführen von Programmen, die in Python geschrieben sind, bestimmt ist. Hier ist der Inhalt des Dockerfiles:
# На всякий случай напоминаю, что 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. Client erstellen
Beim Erstellen des Client-Teils unseres Projekts erinnern wir uns nebenbei an einige Grundlagen von Docker.
3a. Dateien erstellen
Gehen Sie in den Ordner Ihres Projekts client und erstellen Sie darin die folgenden Dateien:
- Die Datei
client.py. Hier wird sich der Client-Code befinden. - Die Datei
Dockerfile. Diese Datei erfüllt dieselbe Rolle wie die entsprechende Datei im Server-Ordner. Sie enthält die Anweisung zur Erstellung der Umgebung für die Ausführung des Client-Codes.
Somit sollte Ihr Ordner server/ zu diesem Zeitpunkt so aussehen:
.
├── client.py
└── Dockerfile
0 Verzeichnisse, 2 Dateien3b. Python-Datei bearbeiten
Fügen wir in die Datei client.py den folgenden Code ein:
#!/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()Mit diesem Code kann die Client-Anwendung Daten vom Server abrufen und sie auf dem Bildschirm anzeigen.
3c. Dockerfile bearbeiten
Wie im Falle des Servers erstellen wir für den Client eine einfache Dockerfile, verantwortlich für die Bereitstellung der Umgebung, in der die Client-Python-Anwendung ausgeführt wird. Hier ist der Client-Code 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 Datei Dockerfile. Bis jetzt haben wir nur die Grundlagen der Arbeit mit Docker behandelt. Jetzt beginnen wir mit der Arbeit mit Docker Compose. Dazu schauen wir uns die Datei an docker-compose.yml, die sich im Stammverzeichnis des Projekts befindet.
Bitte beachten Sie, dass wir hier nicht alle Befehle behandeln, die in docker-compose.ymlverwendet werden können. Unser Hauptziel ist es, ein praktisches Beispiel zu durchlaufen, das Ihnen grundlegende Kenntnisse über Docker Compose vermittelt.
Hier ist der Code, den Sie in die Datei einfügen müssen 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. Projektbau
Nachdem alle notwendigen Anweisungen in docker-compose.yml eingefügt wurden, muss das Projekt gebaut werden. Dieser Schritt in unserer Arbeit ähnelt der Verwendung des Befehls docker build, aber der entsprechende Befehl bezieht sich auf mehrere Dienste:
$ docker-compose build▍6. Projekt starten
Jetzt, da das Projekt gebaut ist, ist es an der Zeit, es zu starten. Dieser Schritt entspricht dem Schritt, in 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 Text erscheinen, den der Client vom Server abgerufen hat: Docker-Compose ist magisch!.
Wie bereits erwähnt, verwendet der Server den Computerport 1234 um die Anfragen des Clients zu bedienen. Daher wird, wenn Sie im Browser die Adresse besuchen , eine Seite mit dem Text angezeigt Docker-Compose ist magisch!.
Nützliche Befehle
Lassen Sie uns einige Befehle betrachten, die Ihnen bei der Arbeit mit Docker Compose nützlich sein könnten.
Dieser Befehl ermöglicht es, Container und andere Ressourcen, die mit dem Befehl erstellt wurden, zu stoppen und zu entfernen docker-compose up:
$ docker-compose downDieser Befehl zeigt die Protokolle der Dienste an:
$ docker-compose logs -f [service name] Zum Beispiel kann er in unserem Projekt so verwendet werden: $ docker-compose logs -f [service name].
Mit diesem Befehl können Sie eine Liste der Container anzeigen:
$ docker-compose psDieser Befehl ermöglicht es, einen Befehl in einem laufenden Container auszuführen:
$ docker-compose exec [service name] [command] Er könnte beispielsweise so aussehen: docker-compose exec server ls.
Dieser Befehl ermöglicht es, eine Liste der Images anzuzeigen:
$ docker-compose imagesErgebnisse
Wir haben die Grundlagen der Arbeit mit Docker Compose behandelt, dessen Kenntnisse Ihnen erlauben, diese Technologie zu nutzen und bei Interesse mit einer tiefergehenden Erkundung zu beginnen. Repository mit dem Code des Projekts, den wir hier behandelt haben.
Liebe Leser! Verwenden Sie Docker Compose in Ihren Projekten?
Quelle: habr.com
