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:
-
CentOS 7-Server, eingerichtet mit einem Nicht-Root-Benutzer mit Sudo-Berechtigungen (Details sieheInitial Server Setup on CentOS 7)
-
Docker installiert mit den Anweisungen aus Schritt 1 und Schritt 2 vonHow To Install and Use Docker on CentOS 7
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-world
befinden, 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. Sobaldhello
ausgeführt wurde, wird der Container gestoppt. Wenn Sie sich aktive Prozesse ansehen, werden folglich die Spaltenüberschriften angezeigt, aber der Containerhello-world
wird 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-compose
unterstü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-compose
eher 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.yml
aus, 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.yml
enthä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-i
macht 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.