So installieren und verwenden Sie Docker Compose unter Ubuntu 14.04

Einführung

Docker ist ein großartiges Tool, aber um sein 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 schließlich beschloss, eine eigene Version basierend auf der Feigenquelle zu erstellen. Sie nannten esDocker Compose. Kurz gesagt, die Orchestrierungsprozesse von Docker-Containern (z. B. Starten, Herunterfahren und Einrichten von Intra-Container-Verknüpfungen und -Volumes) sind damit sehr einfach.

Am Ende dieses Artikels sind Docker und Docker Compose installiert, und Sie verfügen über ein grundlegendes Verständnis der Funktionsweise von Docker Compose.

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 aufzunehmen, da das Docker-Team garantiert, dass die Best Practices von Docker eingehalten werden.

Kommunikation zwischen Docker-Images

Docker-Container sind standardmäßig vom Host-Computer isoliert. Dies 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. Das macht die Konfiguration und Arbeit mit dem Image, das standardmäßig in einem Docker-Container ausgeführt wird, unnötig schwierig.

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 hängen bleiben, 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 problemlos Dateien zwischen dem Docker-Container und dem Host-Computer freigeben, die wir inDocker data volume article untersuchen werden.

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 und über die Portweiterleitung WordPress für die Außenwelt freigeben können, sodass Benutzer eine Verbindung herstellen können.

Voraussetzungen

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

[[Schritt-1 - Installieren des Dockers]] == Schritt 1 - Installieren von Docker

Installieren Sie zunächst Docker, falls Sie dies noch nicht getan haben. Die schnellste Möglichkeit, Docker zu installieren, besteht darin, das Installationsskript herunterzuladen und zu installieren (Sie werden zur Eingabe eines Sudo-Kennworts aufgefordert).

wget -qO- https://get.docker.com/ | sh

Mit dem obigen Befehl wird ein kleines Installationsskript heruntergeladen und ausgeführt, das vom Docker-Team geschrieben wurde. Wenn Sie Skripten von Drittanbietern nicht vertrauen oder weitere Informationen zur Funktionsweise des Skripts wünschen, lesen Sie die Anweisungen inDigitalOcean Docker tutorialoder Dockers eigeneninstallation documentation.

Die Arbeit mit Docker ist schwierig, wenn Ihr Benutzer nicht richtig konfiguriert ist. Fügen Sie Ihren Benutzer daher mit dem folgenden Befehl zur Gruppedockerhinzu.

sudo usermod -aG docker $(whoami)

Melden Sie sich von Ihrem Server ab und wieder an, um Ihre neuen Gruppen zu aktivieren.

[.note] #Note: Um mehr über die Verwendung von Docker zu erfahren, lesen Sie den AbschnittHow to Use Docker vonHow To Install and Use Docker: Getting Started.
#

[[Schritt-2 -—- Installieren von Docker-Compose]] == Schritt 2 - Installieren von Docker Compose

Nachdem Sie Docker installiert haben, können Sie jetzt Docker Compose installieren. Installieren Sie zunächstpython-pip als Voraussetzung:

sudo apt-get -y install python-pip

Dann können Sie Docker Compose installieren:

sudo pip install docker-compose

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

Die öffentliche Docker-Registrierung Docker Hub enthält ein einfachesHello World-Bild. Nachdem wir Docker Compose installiert haben, testen wir es anhand dieses wirklich einfachen Beispiels.

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 (wir werden nano verwenden):

nano docker-compose.yml

Fügen Sie den folgenden Inhalt in die Datei ein, speichern Sie die Datei und beenden Sie den Texteditor:

docker-compose.yml

my-test:
  image: hello-world

Die erste Zeile wird als Teil des Containernamens verwendet. Die zweite Zeile gibt an, welches Bild zum Erstellen des Containers verwendet werden soll. Das Bild wird vom offiziellen Docker Hub-Repository heruntergeladen.

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

docker-compose up

Die Ausgabe sollte mit Folgendem beginnen:

Output of docker-compose upCreating 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 |

Die Ausgabe erklärt dann, was Docker tut:

  1. Der Docker-Client hat den Docker-Daemon kontaktiert.

  2. Der Docker-Daemon hat das "Hallo-Welt" -Image vom Docker Hub abgerufen.

  3. Der Docker-Dämon hat aus diesem Image einen neuen Container erstellt, in dem die ausführbare Datei ausgeführt wird, die die aktuell gelesene Ausgabe erzeugt.

  4. Der Docker-Daemon hat diese Ausgabe an den Docker-Client gestreamt, der sie an Ihr Terminal gesendet hat.

Wenn der Prozess nicht von alleine beendet wird, drücken SieCTRL-C.

Dieser einfache Test zeigt nicht einen der Hauptvorteile von Docker Compose: Eine Gruppe von Docker-Containern kann gleichzeitig auf und ab geschaltet werden. Die Artikel vonHow To Install Wordpress and PhpMyAdmin with Docker Compose on Ubuntu 14.04zeigen, wie Docker Compose verwendet wird, um drei Container als eine Anwendungsgruppe auszuführen.

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

Sehen wir uns die Befehle an, 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 jeden Container in seinem Verzeichnis.

Bisher haben wirdocker-compose up alleine ausgeführt undCTRL-C verwendet, um es herunterzufahren. Dadurch können Debug-Meldungen im Terminalfenster angezeigt werden. Dies ist jedoch nicht ideal, wenn Sie in der Produktion arbeiten möchten, dassdocker-composeeher wie ein Service wirken. Eine einfache Möglichkeit, dies zu tun, besteht darin, einfach 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

Das Folgende zeigt beispielsweise, dass der Containerhelloworld_my-test_1gestoppt ist:

Output of `docker-compose ps`        Name           Command   State    Ports
-----------------------------------------------
helloworld_my-test_1   /hello    Exit 0

Ein laufender Container zeigt den Status vonUpan:

Output of `docker-compose ps`     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.ymlein, mit der die Docker-Gruppe gestartet wird, 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 dies beanstandet und zeigt Ihnen Ihre Container nicht an:

Output from wrong directory        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, fig.yml, fig.yaml

[[Schritt-5- - Zugriff auf das Docker-Container-Dateisystem optional]] == Schritt 5 - Zugriff auf das Docker-Container-Dateisystem (optional)

Wenn Sie an der Eingabeaufforderung in einem Container arbeiten müssen, können Sie den Befehldocker exec verwenden.

Das Beispiel vonHello World!wird beendet, nachdem es ausgeführt wurde. Daher müssen wir einen Container starten, der weiterhin ausgeführt wird, damit wir mitdocker exec auf das Dateisystem für den Container zugreifen können. Werfen wir einen Blick auf dieNginx image von Docker Hub.

Erstellen Sie ein neues Verzeichnis und wechseln Sie in dieses:

mkdir ~/nginx && cd $_

Erstellen Sie einedocker-compose.yml-Datei in unserem neuen Verzeichnis:

nano docker-compose.yml

und füge folgendes ein:

~/nginx/docker-compose.yml

nginx:
  image: nginx

Speichern Sie die Datei und beenden Sie sie. Wir müssen nur den Nginx-Container als Hintergrundprozess mit dem folgenden Befehl starten:

docker-compose up -d

Das Nginx-Image wird heruntergeladen und der Container im Hintergrund gestartet.

Jetzt brauchen wir dieCONTAINER ID für den Container. Liste aller Container, die ausgeführt werden:

docker ps

Sie sehen etwas Ähnliches wie das Folgende:

Output of `docker ps`CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e90e12f70418        nginx               "nginx -g 'daemon off"   6 minutes ago       Up 5 minutes        80/tcp, 443/tcp     nginx_nginx_1

[.note] #Note: Mit dem Befehldocker ps werden nurrunning Container aufgelistet.
#

Wenn wir das Dateisystem in diesem Container ändern möchten, nehmen wir die ID (in diesem Beispiele90e12f70418) und verwendendocker exec, um eine Shell im Container zu starten:

docker exec -it e90e12f70418 /bin/bash

Die Option-t öffnet ein Terminal und die Option-imacht es interaktiv. Die Option/bin/bash öffnet eine Bash-Shell für den laufenden Container. Stellen Sie sicher, dass Sie die ID für Ihren Container verwenden.

Sie sehen eine Bash-Eingabeaufforderung für den Container ähnlich der folgenden:

root@e90e12f70418:/#

Von hier aus können Sie an der Eingabeaufforderung 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. Eine weitere Einschränkung besteht darin, dass die meisten Docker-Images mit nur minimaler Linux-Installation erstellt wurden, sodass einige der Befehlszeilendienstprogramme und -tools, die Sie bisher verwendet haben, möglicherweise nicht vorhanden sind.

Fazit

Hervorragend, um die grundlegenden Konzepte von Docker Compose und die Installation und Ausführung zu erläutern. Im Tutorial vonDeploying Wordpress and PHPMyAdmin with Docker Compose on Ubuntu 14.04finden Sie ein komplizierteres Beispiel für die Bereitstellung einer Anwendung mit Docker Compose.

Eine vollständige Liste der Konfigurationsoptionen für die Dateidocker-compose.ymlfinden Sie unterCompose file reference.