Docker Compose-Leitfaden für Anfänger

Der Autor des Artikels, den wir heute veröffentlichen, sagt, dass er sich an Entwickler richtet, die Docker Compose erlernen möchten und auf dem Weg sind, ihre erste Client-Server-Anwendung mit Docker zu erstellen. Es wird davon ausgegangen, dass der Leser dieses Materials mit den Grundlagen von Docker vertraut ist. Sollte dies nicht der Fall sein, können Sie einen Blick darauf werfen diese Reihe von Materialien diese ein Beitrag, der die Grundlagen von Docker sowie die Grundlagen von Kubernetes behandelt, und diese Artikel für Anfänger.

Docker Compose-Leitfaden für Anfänger

Was ist Docker Compose?

Docker Compose ist ein in Docker enthaltenes Tool. Es soll Probleme im Zusammenhang mit der Umsetzung von Projekten lösen.

Beim Erlernen der Grundlagen von Docker sind Sie möglicherweise auf die Erstellung einfachster Anwendungen gestoßen, die autonom arbeiten und beispielsweise nicht von externen Datenquellen oder bestimmten Diensten abhängig sind. In der Praxis sind solche Anwendungen selten. Bei realen Projekten handelt es sich in der Regel um eine ganze Reihe kollaborativer Anwendungen.

Woher wissen Sie, ob Sie Docker Compose verwenden müssen, wenn Sie ein Projekt bereitstellen? Eigentlich ist es ganz einfach. Wenn Sie zum Ausführen dieses Projekts mehrere Dienste verwenden, kann Docker Compose hilfreich sein. Beispielsweise in einer Situation, in der Sie eine Website erstellen, die zur Durchführung der Benutzerauthentifizierung eine Verbindung zu einer Datenbank herstellen muss. Ein solches Projekt kann aus zwei Diensten bestehen – einem, der den Betrieb der Website sicherstellt, und einem, der für die Unterstützung der Datenbank verantwortlich ist.

Mit der Docker Compose-Technologie können Sie, wenn Sie sie vereinfacht beschreiben, viele Dienste mit einem einzigen Befehl starten.

Unterschied zwischen Docker und Docker Compose

Docker dient der Verwaltung der einzelnen Container (Dienste), aus denen eine Anwendung besteht.

Docker Compose dient der Verwaltung mehrerer Container, die gleichzeitig Teil einer Anwendung sind. Dieses Tool bietet die gleichen Funktionen wie Docker, ermöglicht Ihnen jedoch die Arbeit mit komplexeren Anwendungen.

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

Typischer Docker Compose-Anwendungsfall

Docker Compose ist in den richtigen Händen ein sehr leistungsstarkes Tool, mit dem Sie Anwendungen mit komplexen Architekturen schnell bereitstellen können. Nun schauen wir uns ein Beispiel für den praktischen Einsatz von Docker Compose an, dessen Analyse es Ihnen ermöglicht, die Vorteile zu bewerten, die Ihnen der Einsatz von Docker Compose bietet.

Stellen Sie sich vor, Sie sind Entwickler eines Webprojekts. Dieses Projekt umfasst zwei Websites. Ersteres ermöglicht es Geschäftsleuten, mit nur wenigen Klicks Online-Shops zu erstellen. Die zweite zielt auf die Kundenbetreuung ab. Diese beiden Sites interagieren mit derselben Datenbank.

Ihr Projekt erfreut sich immer größerer Beliebtheit und es stellt sich heraus, dass die Kapazität des Servers, auf dem es läuft, nicht mehr ausreicht. Daher entscheiden Sie sich, das gesamte Projekt auf eine andere Maschine zu übertragen.

Leider haben Sie so etwas wie Docker Compose nicht verwendet. Daher müssen Sie die Dienste einzeln migrieren und neu konfigurieren, in der Hoffnung, dass Sie bei dieser Arbeit nichts vergessen.

Wenn Sie Docker Compose verwenden, ist die Migration Ihres Projekts auf einen neuen Server ein Problem, das durch die Ausführung einiger Befehle gelöst werden kann. Um die Übertragung des Projekts an einen neuen Standort abzuschließen, müssen Sie lediglich einige Einstellungen vornehmen und eine Sicherungskopie der Datenbank auf den neuen Server hochladen.

Entwickeln einer Client-Server-Anwendung mit Docker Compose

Da Sie nun wissen, wofür wir Docker Compose verwenden werden, ist es an der Zeit, mit diesem Tool Ihre erste Client/Server-Anwendung zu erstellen. Es geht nämlich um die Entwicklung einer kleinen Website (Server) in Python, die eine Datei mit einem Textfragment erzeugen kann. Diese Datei wird von einem ebenfalls in Python geschriebenen Programm (Client) vom Server angefordert. Nach Erhalt der Datei vom Server zeigt das Programm den darin gespeicherten Text auf dem Bildschirm an.

Bitte beachten Sie, dass wir davon ausgehen, dass Sie über die Grundlagen von Docker verfügen und die Docker-Plattform bereits installiert haben.

Beginnen wir mit der Arbeit am Projekt.

▍1. Erstellen Sie ein Projekt

Um Ihre erste Client/Server-Anwendung zu erstellen, empfehle ich Ihnen, zunächst einen Projektordner zu erstellen. Es sollte die folgenden Dateien und Ordner enthalten:

  • Datei docker-compose.yml. Dabei handelt es sich um eine Docker Compose-Datei, die die zum Starten und Konfigurieren der Dienste erforderlichen Anweisungen enthält.
  • Mappe server. Es enthält die Dateien, die für den Betrieb des Servers erforderlich sind.
  • Mappe client. Hier werden die Client-Anwendungsdateien gespeichert.

Als Ergebnis sollte der Inhalt des Hauptordners Ihres Projekts so aussehen:

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

▍2. Servererstellung

Hier werden wir beim Erstellen eines Servers auf einige grundlegende Dinge in Bezug auf Docker eingehen.

2a. Dateien erstellen

Gehe in den Ordner server und erstelle darin folgende Dateien:

  • Datei server.py. Es enthält den Servercode.
  • Datei index.html. Diese Datei enthält einen Text, den die Clientanwendung anzeigen soll.
  • Datei Dockerfile. Dies ist die Docker-Datei, die die zum Erstellen der Serverumgebung erforderlichen Anweisungen enthält.

So sollte der Inhalt Ihres Ordners aussehen server/:

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

2b. Bearbeiten einer Python-Datei.

Zur Datei hinzufügen server.py der folgende 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()

Mit diesem Code können Sie einen einfachen Webserver erstellen. Er wird den Kunden eine Akte geben index.html, dessen Inhalt später auf der Webseite angezeigt wird.

2c. Bearbeiten einer HTML-Datei

Einordnen index.html füge den folgenden Text hinzu:

Docker-Compose is magic!

Dieser Text wird an den Kunden gesendet.

2d. Bearbeiten der Docker-Datei

Jetzt erstellen wir eine einfache Datei Dockerfile, der für die Organisation der Laufzeitumgebung für den Python-Server verantwortlich ist. Als Grundlage verwenden wir das erstellte Bild auf offizielle Weise, entwickelt, um in Python geschriebene Programme auszuführen. Hier ist der Inhalt der Docker-Datei:

# На всякий случай напоминаю, что 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/

Lassen Sie uns nun am Client arbeiten.

▍3. Erstellen Sie einen Kunden

Während wir die Client-Seite unseres Projekts erstellen, werden wir uns nebenbei an einige Docker-Grundlagen erinnern.

3a. Dateien erstellen

Gehen Sie zu Ihrem Projektordner client und erstelle darin folgende Dateien:

  • Datei client.py. Hier befindet sich der Client-Code.
  • Datei Dockerfile. Diese Datei spielt die gleiche Rolle wie eine ähnliche Datei im Serverordner. Es enthält nämlich eine Anweisung, die beschreibt, wie eine Umgebung zum Ausführen von Clientcode erstellt wird.

Als Ergebnis Ihr Ordner client/ Zu diesem Zeitpunkt sollte es so aussehen:

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

3b. Bearbeiten einer Python-Datei

Zur Datei hinzufügen client.py der folgende 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 dieses Codes kann die Client-Anwendung Daten vom Server herunterladen und auf dem Bildschirm anzeigen.

3c. Bearbeiten der Docker-Datei

Wie beim Server erstellen wir für den Client ein einfaches Dockerfile, verantwortlich für die Gestaltung der Umgebung, in der die Python-Clientanwendung 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 sehen, haben wir zwei verschiedene Projekte erstellt: Server und Client. Jeder von ihnen hat seine eigene Datei Dockerfile. Bisher geht alles, was passiert, nicht über die Grundlagen der Arbeit mit Docker hinaus. Jetzt machen wir uns an die Arbeit mit Docker Compose. Sehen Sie sich hierzu die Datei an docker-compose.ymlbefindet sich im Stammordner des Projekts.

Bitte beachten Sie, dass es hier nicht darum geht, absolut alle Befehle abzudecken, die in verwendet werden können docker-compose.yml. Unser Hauptziel ist es, ein praktisches Beispiel aufzuschlüsseln, das Ihnen Grundkenntnisse von Docker Compose vermittelt.

Hier ist der Code, der in die Datei eingefügt werden soll 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. Projektaufbau

Nach in docker-compose.yml Alle notwendigen Anweisungen wurden erstellt, das Projekt muss zusammengebaut werden. Dieser Schritt unserer Arbeit ähnelt der Verwendung des Befehls docker build, aber der entsprechende Befehl bezieht sich auf mehrere Dienste:

$ docker-compose build

▍6. Start des Projekts

Nachdem das Projekt nun erstellt ist, ist es an der Zeit, es auszuführen. Dieser Schritt unserer Arbeit entspricht dem Schritt, bei dem bei der Arbeit mit einzelnen Containern der Befehl ausgeführt wird docker run:

$ docker-compose up

Nach der Ausführung dieses Befehls sollte der vom Client vom Server geladene Text im Terminal erscheinen: Docker-Compose is magic!.

Wie bereits erwähnt, nutzt der Server den Computer-Port 1234 um Kundenwünsche zu bedienen. Gehen Sie daher im Browser auf die Adresse http://localhost:1234/, es wird eine Seite mit Text angezeigt Docker-Compose is magic!.

Nützliche Befehle

Werfen wir einen Blick auf einige der Befehle, die Sie bei der Arbeit mit Docker Compose nützlich finden könnten.

Mit diesem Befehl können Sie Container und andere mit dem Befehl erstellte Ressourcen stoppen und löschen docker-compose up:

$ docker-compose down

Dieser Befehl druckt die Dienstprotokolle:

$ docker-compose logs -f [service name]

In unserem Projekt kann es beispielsweise in dieser Form verwendet werden: $ docker-compose logs -f [service name].

Mit diesem Befehl können Sie eine Liste von Containern anzeigen:

$ docker-compose ps

Mit diesem Befehl können Sie einen Befehl in einem laufenden Container ausführen:

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

Es könnte zum Beispiel so aussehen: docker-compose exec server ls.

Mit diesem Befehl können Sie eine Liste von Bildern anzeigen:

$ docker-compose images

Ergebnisse

Wir haben die Grundlagen der Arbeit mit der Docker Compose-Technologie behandelt, deren Kenntnisse es Ihnen ermöglichen, diese Technologie zu nutzen und bei Bedarf tiefer in sie einzusteigen. Hier Repository mit dem Projektcode, den wir hier betrachtet haben.

Liebe Leser! Nutzen Sie Docker Compose in Ihren Projekten?

Docker Compose-Leitfaden für Anfänger

Source: habr.com

Kommentar hinzufügen