Installieren und Verwenden von Docker Compose unter CentOS 7

Einführung

Docker ist ein großartiges Tool zur Automatisierung der Bereitstellung von Linux-Anwendungen in Software-Containern. Um jedoch das Potenzial voll auszuschöpfen, ist es am besten, wenn jede Komponente Ihrer Anwendung in einem eigenen Container ausgeführt wird. Bei komplexen Anwendungen mit vielen Komponenten kann es schnell unhandlich werden, alle Container so aufeinander abzustimmen, dass sie zusammen gestartet und heruntergefahren werden (ganz zu schweigen von den Gesprächen untereinander).

Die Docker-Community hat eine beliebte Lösung namensFig entwickelt, mit der Sie eine einzige YAML-Datei verwenden können, um alle Ihre Docker-Container und -Konfigurationen zu orchestrieren. Dies wurde so populär, dass das Docker-Team beschloss,Docker Compose basierend auf der Fig-Quelle zu erstellen, die jetzt veraltet ist. Mit Docker Compose können Benutzer die Prozesse von Docker-Containern einfacher orchestrieren, einschließlich des Startens, Herunterfahrens und Einrichtens von Verknüpfungen und Volumes innerhalb von Containern.

In diesem Lernprogramm installieren Sie die neueste Version von Docker Compose, um Anwendungen mit mehreren Containern zu verwalten, und lernen die grundlegenden Befehle der Software kennen.

Docker und Docker Compose-Konzepte

Für die Verwendung von Docker Compose ist eine Kombination verschiedener Docker-Konzepte in einem erforderlich. Bevor wir beginnen, nehmen wir uns eine Minute Zeit, um die verschiedenen Konzepte zu überprüfen. Wenn Sie bereits mit Docker-Konzepten wie Volumes, Links und Portweiterleitung vertraut sind, können Sie mit dem nächsten Abschnitt fortfahren.

Docker-Bilder

Jeder Docker-Container ist eine lokale Instanz eines Docker-Images. Sie können sich ein Docker-Image als eine vollständige Linux-Installation vorstellen. In der Regel enthält eine Minimalinstallation nur das Minimum an Paketen, die zum Ausführen des Images erforderlich sind. Diese Images verwenden den Kernel des Host-Systems. Da sie jedoch in einem Docker-Container ausgeführt werden und nur ihr eigenes Dateisystem sehen, ist es problemlos möglich, eine Distribution wie CentOS auf einem Ubuntu-Host auszuführen (oder umgekehrt).

Die meisten Docker-Images werden überDocker Hub verteilt, die vom Docker-Team verwaltet werden. Bei den meisten gängigen Open Source-Projekten wird ein entsprechendes Image in die Docker-Registrierung hochgeladen, mit dem Sie die Software bereitstellen können. Wenn möglich, ist es am besten, „offizielle“ Bilder zu erstellen, da das Docker-Team garantiert, dass die Best Practices von Docker eingehalten werden.

Kommunikation zwischen Docker-Images

Docker-Container sind vom Host-Computer isoliert, was bedeutet, dass der Host-Computer standardmäßig keinen Zugriff auf das Dateisystem im Docker-Container und keine Möglichkeit zur Kommunikation über das Netzwerk hat. Dies kann die Konfiguration und das Arbeiten mit dem Image, das in einem Docker-Container ausgeführt wird, erschweren.

Docker bietet drei Möglichkeiten, um dies zu umgehen. Die erste und häufigste ist, dass Docker Umgebungsvariablen angibt, die im Docker-Container festgelegt werden. Der Code, der im Docker-Container ausgeführt wird, überprüft dann beim Start die Werte dieser Umgebungsvariablen und verwendet sie, um sich selbst richtig zu konfigurieren.

Eine andere häufig verwendete Methode istDocker data volume. Docker-Volumes gibt es in zwei Varianten - intern und gemeinsam.

Das Angeben eines internen Volumes bedeutet lediglich, dass für einen Ordner, den Sie für einen bestimmten Docker-Container angeben, die Daten beibehalten werden, wenn der Container entfernt wird. Wenn Sie beispielsweise sicherstellen möchten, dass Ihre Protokolldateien weiterhin vorhanden sind, können Sie ein internes/var/log-Volume angeben.

Ein freigegebenes Volume ordnet einen Ordner in einem Docker-Container einem Ordner auf dem Hostcomputer zu. Auf diese Weise können Sie problemlosshare files zwischen dem Docker-Container und dem Host-Computer einstellen.

Die dritte Möglichkeit, mit einem Docker-Container zu kommunizieren, ist über das Netzwerk. Docker ermöglicht die Kommunikation zwischen verschiedenen Docker-Containern überlinks sowie die Portweiterleitung, sodass Sie Ports aus dem Docker-Container an Ports auf dem Hostserver weiterleiten können. Sie können beispielsweise einen Link erstellen, über den Ihre WordPress- und MariaDB Docker-Container miteinander kommunizieren können, und mithilfe der Portweiterleitung WordPress für die Außenwelt freigeben, sodass Benutzer eine Verbindung herstellen können.

Voraussetzungen

Um diesem Artikel zu folgen, benötigen Sie Folgendes:

Sobald diese vorhanden sind, können Sie mitmachen.

[[Schritt-1 - Installieren von Docker-Compose]] == Schritt 1 - Installieren von Docker Compose

Um die neueste Version zu erhalten, übernehmen Sie die Führung vonDocker docs und installieren Sie Docker Compose aus der Binärdatei im GitHub-Repository von Docker.

Überprüfen Sie diecurrent release und aktualisieren Sie sie gegebenenfalls im folgenden Befehl:

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Legen Sie als Nächstes die Berechtigungen fest, um die Binärdatei ausführbar zu machen:

sudo chmod +x /usr/local/bin/docker-compose

Überprüfen Sie anschließend, ob die Installation erfolgreich war, indem Sie die Version überprüfen:

docker-compose --version

Dadurch wird die von Ihnen installierte Version ausgedruckt:

Outputdocker-compose version 1.23.2, build 1110ad01

Nachdem Sie Docker Compose installiert haben, können Sie ein "Hello World" -Beispiel ausführen.

[[Schritt-2 - Ausführen eines Containers mit Docker-Compose]] == Schritt 2 - Ausführen eines Containers mit Docker Compose

Die öffentliche Docker-Registrierung, Docker Hub, enthält ein einfaches "Hello World" -Image zur Demonstration und zum Testen. Es zeigt die minimale Konfiguration, die erforderlich ist, um einen Container mit Docker Compose auszuführen: eine YAML-Datei, die ein einzelnes Image aufruft.

Erstellen Sie zunächst ein Verzeichnis für unsere YAML-Datei:

mkdir hello-world

Dann wechseln Sie in das Verzeichnis:

cd hello-world

Erstellen Sie nun die YAML-Datei mit Ihrem bevorzugten Texteditor. In diesem Tutorial wird Vi verwendet:

vi docker-compose.yml

Rufen Sie den Einfügemodus auf, indem Siei drücken und dann den folgenden Inhalt in die Datei einfügen:

docker-compose.yml

my-test:
  image: hello-world

Die erste Zeile ist Teil des Containernamens. Die zweite Zeile gibt an, welches Bild zum Erstellen des Containers verwendet werden soll. Wenn Sie den Befehldocker-compose up ausführen, wird nach einem lokalen Image mit dem angegebenen Namenhello-world gesucht.

Wenn dies aktiviert ist, drücken SieESC, um den Einfügemodus zu verlassen. Geben Sie:x und dannENTER ein, um die Datei zu speichern und zu beenden.

Verwenden Sie den Befehldocker images, um Bilder auf Ihrem System manuell anzuzeigen:

docker images

Wenn überhaupt keine lokalen Bilder vorhanden sind, werden nur die Spaltenüberschriften angezeigt:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Führen Sie jetzt, während Sie sich noch im Verzeichnis~/hello-worldbefinden, den folgenden Befehl aus, um den Container zu erstellen:

docker-compose up

Wenn der Befehl zum ersten Mal ausgeführt wird und kein lokales Image mit dem Namenhello-world vorhanden ist, ruft Docker Compose es aus dem öffentlichen Docker Hub-Repository ab:

OutputPulling my-test (hello-world:)...
latest: Pulling from library/hello-world
1b930d010525: Pull complete
. . .

Nach dem Abrufen des Images erstelltdocker-compose einen Container, hängt das Programmhelloan und führt es aus. Dies bestätigt wiederum, dass die Installation anscheinend funktioniert:

Output. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .

Es wird dann eine Erklärung darüber ausgegeben, was es getan hat:

Output. . .
my-test_1  | To generate this message, Docker took the following steps:
my-test_1  |  1. The Docker client contacted the Docker daemon.
my-test_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
my-test_1  |     (amd64)
my-test_1  |  3. The Docker daemon created a new container from that image which runs the
my-test_1  |     executable that produces the output you are currently reading.
my-test_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
my-test_1  |     to your terminal.
. . .

Docker-Container werden nur ausgeführt, solange der Befehl aktiv ist. Sobaldhelloausgeführt wurde, wird der Container gestoppt. Wenn Sie sich aktive Prozesse ansehen, werden folglich die Spaltenüberschriften angezeigt, aber der Containerhello-worldwird nicht aufgelistet, da er nicht ausgeführt wird:

docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

Verwenden Sie das Flag-a, um alle Container anzuzeigen, nicht nur die aktiven:

docker ps -a
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
50a99a0beebd        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                       hello-world_my-test_1

Nachdem Sie getestet haben, wie ein Container ausgeführt wird, können Sie einige grundlegende Docker Compose-Befehle untersuchen.

[[Schritt-3- - Learning-Docker-Compose-Befehle]] == Schritt 3 - Learning Docker Compose-Befehle

Um Ihnen den Einstieg in Docker Compose zu erleichtern, werden in diesem Abschnitt die allgemeinen Befehle beschrieben, die das Tooldocker-composeunterstützt.

Der Befehldocker-compose arbeitet auf Verzeichnisbasis. Auf einem Computer können mehrere Gruppen von Docker-Containern ausgeführt werden. Erstellen Sie einfach ein Verzeichnis für jeden Container und einedocker-compose.yml-Datei für jedes Verzeichnis.

Bisher haben Siedocker-compose up selbst ausgeführt, von wo aus SieCTRL-C verwenden können, um den Container herunterzufahren. Dadurch können Debug-Meldungen im Terminalfenster angezeigt werden. Dies ist jedoch nicht ideal. In der Produktion ist es robuster, wenndocker-composeeher wie ein Service wirken. Eine einfache Möglichkeit, dies zu tun, besteht darin, die Option-d hinzuzufügen, wenn Sieup in Ihrer Sitzung ausführen:

docker-compose up -d

docker-compose tritt nun in den Hintergrund.

Verwenden Sie den folgenden Befehl, um Ihre Gruppe von Docker-Containern anzuzeigen (sowohl gestoppt als auch aktuell ausgeführt):

docker-compose ps -a

Wenn ein Container gestoppt wird, werden dieState alsExited aufgelistet, wie im folgenden Beispiel gezeigt:

Output        Name            Command   State    Ports
------------------------------------------------
hello-world_my-test_1   /hello    Exit 0

Ein laufender Container zeigtUp:

Output     Name              Command          State        Ports
---------------------------------------------------------------
nginx_nginx_1   nginx -g daemon off;   Up      443/tcp, 80/tcp

Geben Sie den folgenden Befehl im selben Verzeichnis wie die Dateidocker-compose.ymlaus, mit der Sie die Docker-Gruppe gestartet haben, um alle ausgeführten Docker-Container für eine Anwendungsgruppe zu stoppen:

docker-compose stop

[.note] #Note:docker-compose kill ist auch verfügbar, wenn Sie die Dinge stärker herunterfahren müssen.
#

In einigen Fällen speichern Docker-Container ihre alten Informationen auf einem internen Datenträger. Wenn Sie von vorne beginnen möchten, können Sie mit dem Befehlrm alle Container löschen, aus denen Ihre Containergruppe besteht:

docker-compose rm

Wenn Sie einen dieser Befehle aus einem anderen Verzeichnis als dem Verzeichnis ausführen, das einen Docker-Container und die Datei.ymlenthält, wird ein Fehler zurückgegeben:

OutputERROR:
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml

In diesem Abschnitt wurden die Grundlagen zum Bearbeiten von Containern mit Docker Compose behandelt. Wenn Sie mehr Kontrolle über Ihre Container benötigen, können Sie auf das Dateisystem des Docker-Containers zugreifen und von einer Eingabeaufforderung in Ihrem Container aus arbeiten. Dieser Vorgang wird im nächsten Abschnitt beschrieben.

[[Schritt 4 - Zugriff auf das Docker-Container-Dateisystem]] == Schritt 4 - Zugriff auf das Docker Container-Dateisystem

Um an der Eingabeaufforderung in einem Container zu arbeiten und auf dessen Dateisystem zuzugreifen, können Sie den Befehldocker exec verwenden.

Das Beispiel „Hello World“ wird nach der Ausführung beendet. Umdocker exec zu testen, starten Sie einen Container, der weiterhin ausgeführt wird. Verwenden Sie für die Zwecke dieses LernprogrammsNginx image von Docker Hub.

Erstellen Sie ein neues Verzeichnis mit dem Namennginx und verschieben Sie es:

mkdir ~/nginx
cd ~/nginx

Erstellen Sie als Nächstes einedocker-compose.yml-Datei in Ihrem neuen Verzeichnis und öffnen Sie sie in einem Texteditor:

vi docker-compose.yml

Fügen Sie als Nächstes der Datei die folgenden Zeilen hinzu:

~/nginx/docker-compose.yml

nginx:
  image: nginx

Speichern Sie die Datei und beenden Sie sie. Starten Sie den Nginx-Container als Hintergrundprozess mit dem folgenden Befehl:

docker-compose up -d

Docker Compose lädt das Nginx-Image herunter und der Container wird im Hintergrund gestartet.

Jetzt benötigen Sie dieCONTAINER ID für den Container. Listen Sie alle Container auf, die mit dem folgenden Befehl ausgeführt werden:

docker ps

Sie sehen etwas Ähnliches wie das Folgende:

Output of `docker ps`CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b86b6699714c        nginx               "nginx -g 'daemon of…"   20 seconds ago      Up 19 seconds       80/tcp              nginx_nginx_1

Wenn Sie das Dateisystem in diesem Container ändern möchten, nehmen Sie die ID (in diesem Beispielb86b6699714c) und starten Sie mitdocker exec eine Shell im Container:

docker exec -it b86b6699714c /bin/bash

Die Option-t öffnet ein Terminal und die Option-imacht es interaktiv. /bin/bash öffnet eine Bash-Shell für den laufenden Container.

Sie werden dann eine Bash-Eingabeaufforderung für den Container sehen, ähnlich wie:

root@b86b6699714c:/#

Von hier aus können Sie an der Eingabeaufforderung in Ihrem Container arbeiten. Beachten Sie jedoch, dass Ihre Änderungen, sofern Sie sich nicht in einem Verzeichnis befinden, das als Teil eines Datenvolumens gespeichert ist, verschwinden, sobald der Container neu gestartet wird. Denken Sie auch daran, dass die meisten Docker-Images mit einer minimalen Linux-Installation erstellt wurden, sodass einige der Befehlszeilendienstprogramme und -tools, die Sie bisher verwendet haben, möglicherweise nicht vorhanden sind.

Fazit

Sie haben Docker Compose jetzt installiert, Ihre Installation anhand eines „Hello World“ -Beispiels getestet und einige grundlegende Befehle untersucht.

Während das Beispiel „Hello World“ Ihre Installation bestätigte, zeigt die einfache Konfiguration keinen der Hauptvorteile von Docker Compose: Sie können eine Gruppe von Docker-Containern gleichzeitig auf und ab bewegen. Überprüfen SieHow To Secure a Containerized Node.js Application with Nginx, Let’s Encrypt, and Docker Compose undHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04, um die Leistung von Docker Compose in Aktion zu sehen. Obwohl diese Tutorials auf Ubuntu 16.04 und 18.04 ausgerichtet sind, können die Schritte für CentOS 7 angepasst werden.