Starten und orchestrieren Sie Docker-Container mit Docker Compose.

Einführung

Erfahren Sie, wie Sie Docker Compose installieren und verwenden. Docker Compose ermöglicht es Ihnen, mit ein paar einfachen Befehlen mehrere Container mit einzelnen Anwendungen oder Komponenten zu starten. Docker Compose kann auch verwendet werden, um Container automatisch zu verknüpfen und Container-Volumes einzurichten.

Wenn Sie eine lange Reihe von Docker-Run-befehlen ausführen, um mehrere Container aufzurufen, erspart Ihnen Docker Compose eine Menge Arbeit.

Docker Compose Versus Fig

Docker Compose begann als ein Open-Source-Projekt eines Drittanbieters namens Fig. Fig war so populär, dass das Docker-Team beschloss, ein offizielles Tool auf Basis der Fig-Codebase zu entwickeln.

Docker Compose ersetzt Fig, und Fig wurde offiziell für veraltet erklärt.

Anforderungen

  • Ein Server mit CentOS 7 oder Ubuntu 14.04.
  • Docker ist auf Ihrem Server installiert und läuft dort.
  • Grundkenntnisse in der Verwendung von Docker und Docker-Befehlen.
  • Grundlegende Kenntnisse in der Verwendung einer Dockerdatei.
  • Docker Engine installiert und läuft.

Installation von Docker Compose

Um Docker Compose zu installieren, folgen Sie den Anweisungen Ihres Betriebssystems.

Auf Ubuntu 14.04.

Installieren Sie Pip mit dem Befehl:

sudo apt-get install python-pip

Installieren Sie dann Docker Compose mit dem Befehl:

sudo pip install docker-compose

Auf CentOS 7

Überprüfen Sie zunächst die Docker-Compose-Github-Installationsseite um die aktuellste URL für den Download zu erhalten. Der Befehl wird in etwa so aussehen:

sudo curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Nachdem der Download abgeschlossen ist, machen Sie die Binärdatei mit folgendem Befehl ausführbar:

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

Auf Mac OS X

Unter Mac OS X wird Docker Compose als Teil der Docker Toolbox installiert. Wenn Sie Docker Toolbox installiert haben, müssen Sie Docker Compose nicht separat installieren.

Sie können jedoch die Docker Compose Binärdatei auf die neueste Version aktualisieren, bevor Sie beginnen. Um dies zu tun, besuchen Sie die Docker-Compose-Github-Installationsseite um die aktuellste URL für den Download zu erhalten. Der Befehl wird in etwa so aussehen:

sudo curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Nachdem der Download abgeschlossen ist, machen Sie die Binärdatei mit dem Befehl ausführbar:

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

Verwendung von Docker Compose

Die Verwendung von Docker Compose ist ein vierstufiger Prozess:

  • Erstellen Sie ein Verzeichnis für die Installationsdateien.

  • Erstellen Sie in diesem Verzeichnis eine YAML-Datei namens docker-compose.yml.

  • Fügen Sie die Start-Befehle der Anwendungsgruppe in docker-compose.yml ein.

  • Verwenden Sie in diesem Verzeichnis den Befehl docker-compose up, um den/die Container zu starten.

Sie können beispielsweise damit beginnen, ein Verzeichnis für ein einfaches Projekt namens hello-world zu erstellen:

sudo mkdir hello-world

Wechseln Sie in dieses Verzeichnis:

cd hello-world

Erstellen Sie nun eine YAML-Datei namens docker-compose.yml mit dem Befehl:

sudo nano docker-compose.yml

Diese Datei enthält alle Startanweisungen für Ihre Anwendungsgruppe.

Die erste Zeile der Datei lautet:

version: '2'

Dies legt fest, dass die Datei Docker Compose Version 2, die aktuellere Version, verwendet. Version 2 erlaubt Volumes, Netzwerke und Build-Argumente. Es ist die offiziell empfohlene Version.

Zu Testzwecken beginnen wir mit einem Dienst (Container) namens Compose-Test, der aus dem offiziellen CentOS 7-Image gestartet wurde. Geben Sie folgendes in die Datei docker-compose.yml ein:

version: '2'

services:

  compose-test:
    image: centos

Speichern und beenden Sie die Datei.

Hinweis: Docker Compose ist whitespace-sensitiv. Achten Sie darauf, dass Sie die richtige Menge an Leerzeichen verwenden. Die erste Zeile in jedem Block sollte am Anfang kein Leerzeichen haben. Die anderen Zeilen sollten eingerückt sein, typischerweise mit zwei Leerzeichen pro Einrückungsebene.

Verwenden Sie Docker Compose, um diesen Testcontainer mit folgendem Befehl zu starten:

sudo docker-compose up -d

Dieser Befehl führt Docker-Compose im Hintergrund aus. Wenn Sie die gesamte Ausgabe von docker-compose sehen möchten, führen Sie diesen Befehl ohne das Flag -d aus.

Denken Sie daran, dass Sie diesen Befehl aus dem Verzeichnis hello-world heraus ausführen müssen.

Vergewissern Sie sich mit folgendem Befehl, dass der Container erstellt wurde:

sudo docker-compose ps

Stopping and Deleting Containers

Um alle Container einer Anwendungsgruppe zu stoppen, verwenden Sie den Befehl:

sudo docker-compose stop

Nachdem die Container gestoppt wurden, können Sie alle Container, die mit Docker Compose gestartet wurden, mit folgendem Befehl entfernen:

sudo docker-compose rm

Um sowohl alle Container in einer Anwendungsgruppe zu stoppen als auch alle mit einem einzigen Befehl zu entfernen, verwenden Sie:

sudo docker-compose down

Um auch alle Data-Volumes zu entfernen, fügen Sie das Kennzeichen -v hinzu:

sudo docker-compose down -v

Befehle für Docker Compose

Es gibt viele Befehle, die Sie in der Datei docker-compose.yml angeben können. Auf der offiziellen Docker-Website finden Sie eine vollständige Liste der Befehle. Einige der beliebtesten Befehle sind die folgenden.

Ausführen eines Befehls

Wenn Sie einen Befehl verwenden möchten, der beim Start eines Containers ausgeführt wird, fügen Sie Folgendes zu Ihrer docker-compose.yml-Datei hinzu:

command: [command and arguments]

Beispiel: Start und Ping

Um unseren Testcontainer beim Start 5 mal ping localhost ausführen zu lassen, erstellen Sie eine YAML-Datei namens docker-compose.yml mit foldendem Befehl:

sudo nano docker-compose.yml

Fügen Sie Folgendes zur Datei hinzu:

version: '2'

services:

  compose-test:
    image: centos
    command: ping -c 5 localhost

Speichern und beenden Sie die Datei.

Um die Ergebnisse des Ping-Befehls zu sehen, starten Sie die Anwendungsgruppe mit dem Befehl:

docker-compose up

Dadurch wird Docker-Compose im Vordergrund ausgeführt, so dass die Ausgabe von ping angezeigt wird. Verwenden Sie STRG-c, um die Ausgabe bei Bedarf zu beenden.

Link-Container

Um eine Verknüpfung zu einem anderen Dienst herzustellen, fügen Sie Folgendes zu Ihrer Datei docker-compose.yml hinzu:

links:
  - [service name]

Beispiel: Link und Ping

Um einen Dienst namens compose-db zu unserer Anwendungsgruppe hinzuzufügen und unseren Testcontainer mit ihm zu verknüpfen, erstellen Sie eine YAML-Datei namens docker-compose.yml mit dem Befehl:

sudo nano docker-compose.yml

Fügen Sie Folgendes zur Datei hinzu:

version: '2'

services:

  compose-test:
    image: centos
    links:
      - compose-db
    command: ping -c 5 compose-db

  compose-db:
    image: redis

Fügen Sie Folgendes zur Datei hinzu: Sie testen den Link, indem beim Start des Containers compose-test pings auf compose-db erfolgen. 

Speichern und beenden Sie die Datei.

Um die Ergebnisse des Ping-Befehls zu sehen, starten Sie die Anwendungsgruppe mit dem Befehl:

docker-compose up

Dadurch wird Docker-Compose im Vordergrund ausgeführt, so dass die Ausgabe von ping angezeigt wird. Sie sollten eine Reihe von Meldungen über die zu startenden Container sehen, die mit einer Ping-Ausgabe endet, die ungefähr so aussieht:

compose-test_1  | PING compose-db (172.19.0.2) 56(84) bytes of data.
compose-test_1  | 64 bytes from helloworld_compose-db_1.helloworld_default (172.19.0.2): icmp_seq=1 ttl=64 time=0.078 ms
compose-test_1  | 64 bytes from helloworld_compose-db_1.helloworld_default (172.19.0.2): icmp_seq=2 ttl=64 time=0.049 ms
compose-test_1  | 64 bytes from helloworld_compose-db_1.helloworld_default (172.19.0.2): icmp_seq=3 ttl=64 time=0.052 ms
compose-test_1  | 64 bytes from helloworld_compose-db_1.helloworld_default (172.19.0.2): icmp_seq=4 ttl=64 time=0.062 ms
compose-test_1  | 64 bytes from helloworld_compose-db_1.helloworld_default (172.19.0.2): icmp_seq=5 ttl=64 time=0.047 ms
compose-test_1  |
compose-test_1  | --- compose-db ping statistics ---
compose-test_1  | 5 packets transmitted, 5 received, 0% packet loss, time 3998ms
compose-test_1  | rtt min/avg/max/mdev = 0.047/0.057/0.078/0.014 ms

Verwenden Sie STRG-c, um die Ausgabe bei Bedarf zu beenden.

Ports für Links freigeben (Expose)

Wenn ein Port mit "expose" freigegeben wird, können nur verlinkte Dienste, nicht aber der Host-Computer darauf zugreifen. Um einen Port per expose freizugeben, fügen Sie der Datei docker-compose.yml folgendes hinzu:

expose: 
  - "[port number]"

Beispiel: Einen Port freigeben

Damit unsere Testdatenbank den Port 6379 (den standardmäßigen Redis-Port) freigibt und diese Verbindung mit einem einfachen Curl-Befehl aus dem verknüpften Container Compose-Test testet, erstellen Sie eine YAML-Datei namens docker-compose.yml mit dem Befehl:

sudo nano docker-compose.yml

Fügen Sie Folgendes zur Datei hinzu:

version: '2'

services:

  compose-test:
    image: centos
    links:
      - compose-db
    command: /usr/bin/curl compose-db:6379

  compose-db:
    image: redis
    expose:
      - "6379"

Speichern und beenden Sie die Datei.

Um die Ergebnisse des Curl-Befehls zu sehen, starten Sie die Anwendungsgruppe mit dem Befehl:

docker-compose up

Dadurch wird Docker-Compose im Vordergrund ausgeführt, so dass die Curl-Ausgabe angezeigt wird. Sie sollten eine Reihe von Meldungen über die zu startenden Container sehen, die mit der Curl-Ausgabe enden, die in etwa so aussieht:

compose-db_1    | 1:M 04 May 20:39:12.009 * The server is now ready to accept connections on port 6379
compose-test_1  |   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
compose-test_1  |                                  Dload  Upload   Total   Spent    Left  Speed

Dies zeigt an, dass die Curl-Verbindung zum Server erfolgreich war. (Es wird kein Inhalt zurückgegeben, da wir den compose-db-Container nicht so eingerichtet haben, dass er auch tatsächlich ausgeliefert wird.)

Verwenden Sie STRG-c, um die Meldung zu verlassen und zur Eingabeaufforderung zurückzukehren.

Erstellen aus einer Docker-Datei

Wenn Sie eine Dockerdatei verwenden möchten, um einen Container zu erstellen, legen Sie die Dockerdatei in das gleiche Verzeichnis wie die Datei docker-compose.yml der Anwendungsgruppe. Verwenden Sie dann eine Build-Anweisung anstelle eines Images.

  build: .

Beispiel: Erstellen eines Webservers

Um einen Testcontainer mit dem Apache-Server aus einer Dockerdatei zu starten und ihn mit Curl aus einem verlinkten Container zu testen, erstellen Sie zunächst ein Verzeichnis, aus dem die HTML-Dateien für die Website geladen werden:

sudo mkdir public-html

Denken Sie daran, diesen Befehl aus unserem hello-world-Verzeichnis heraus auszuführen, da alle Pfade relativ zu Ihrem Standort sind.

Als nächstes erstellen Sie eine einfache "Hello world"-Datei mit dem Befehl:

sudo nano public-html/index.html

Fügen Sie das Folgende in diese Datei ein:

Hello world!

Speichern und beenden Sie die Datei.

Erstellen Sie nun die Dockerdatei:

sudo nano Dockerfile

Fügen Sie das Folgende in diese Datei ein:

FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

Dies weist Docker an, den Inhalt des hello-world/public-html-Verzeichnisses auf dem Host in /usr/local/apache2/htdocs auf dem Container zu laden.

Speichern und beenden Sie die Datei.

Geben Sie folgendes in die Datei docker-compose.yml ein:

version: '2'

services:
  compose-test:
    image: centos
    links:
      - web-test
    command: /usr/bin/curl web-test:80

  web-test:
    build: .
    expose:
      - "80"

Speichern und beenden Sie die Datei.

Um die Ergebnisse des Curl-Befehls zu sehen, starten Sie die Anwendungsgruppe mit dem Befehl:

sudo docker-compose up

Dadurch wird Docker-Compose im Vordergrund ausgeführt, so dass die Curl-Ausgabe angezeigt wird. Sie sollten eine Reihe von Meldungen über die zu startenden Container sehen, die mit der Curl-Ausgabe enden, die in etwa so aussieht:

web-test_1      | 172.19.0.3 - - [04/May/2016:21:12:43 +0000] "GET / HTTP/1.1" 200 20
compose-test_1  |   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
compose-test_1  |                                  Dload  Upload   Total   Spent    Left  Speed
100    20  100    20    0     0   3157      0 --:--:-- --:--:-- --:--:--  3333
compose-test_1  | Hello world!

Dies zeigt an, dass die Curl-Verbindung zum Server erfolgreich war.

Verwenden Sie STRG-c, um die Meldung zu verlassen und zur Eingabeaufforderung zurückzukehren.

Zuordnung von Host-Ports zu Container-Ports

Um einen Port auf dem Container einem Port auf dem Host zuzuordnen, fügen Sie Folgendes zu Ihrer docker-compose.yml-Datei hinzu:

ports:
  - "[host port]:[container port]"

Beispiel: Erstellen eines Webservers und Zuordnung von Ports zum Host

In diesem Beispiel starten wir einen Testcontainer, der den Apache-Server aus einer Dockerdatei ausführt, ordnen Port 8080 auf dem Container dem Port 80 auf dem Host zu und testen ihn unter  http://example.com:8080 in einem Browser.

Erstellen Sie zunächst ein Verzeichnis, aus dem die HTML-Dateien für die Website geladen werden:

sudo mkdir public-html

Denken Sie daran, diesen Befehl aus unserem hello-world-Verzeichnis heraus auszuführen, da alle Pfade relativ zu Ihrem Standort sind.

Als nächstes erstellen Sie eine einfache "Hello world"-Datei mit dem Befehl:

sudo nano public-html/index.html

Fügen Sie das Folgende in diese Datei ein:

Hello world!

Speichern und beenden Sie die Datei.

Erstellen Sie nun die Dockerdatei:

sudo nano Dockerfile

Fügen Sie das Folgende in diese Datei ein:

FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

Dies weist Docker an, den Inhalt des hello-world/public-html-Verzeichnisses auf dem Host in /usr/local/apache2/htdocs auf dem Container zu laden.

Speichern und beenden Sie die Datei.

Geben Sie folgendes in die Datei docker-compose.yml ein:

version: '2'

services:
  web-test:
    build: .
    ports:
      - "8080:80"

Speichern und beenden Sie die Datei.

Starten Sie die Anwendungsgruppe mit dem Befehl:

sudo docker-compose up -d

Sobald der Container gestartet ist, wechseln Sie zu einem Browser und gehen Sie zur URL  http://example.com:8080 oder http://192.168.0.1:8080, und ersetzen Sie den Domainnamen oder die IP-Adresse durch Ihre eigene.

Hinweis: Wenn Sie eine Firewall betreiben, müssen Sie möglicherweise externen Zugriff auf Port 8080 zulassen. Wenn Sie einen anderen Dienst auf Port 8080 ausführen, können Sie für diesen Test eine andere Portnummer verwenden.

Sie können auch das Port Mapping mit dem Befehl sudo docker-compose ps überprüfen. Die Ausgabe für dieses Beispiel wird in etwa so aussehen:

Name                                   Befehl                          Status                   Ports
-------------------------------------------------------------------------------------------------------------------------------
helloworld_web-test_1      httpd-foreground      Up                         0.0.0.0.0:8080->80/tcpp

Wie Sie sehen können, enthält der Befehl die Port Mapping Informationen in der Spalte Ports.

sudo docker-compose up -f production.yml

Eine andere YAML-Datei verwenden

In diesem Artikel haben wir docker-compose.yml für die YAML-Datei verwendet. Dies ist der Dateiname, den Docker Compose standardmäßig verwendet.

Sie können jedoch das Flag -f verwenden, um einen anderen Dateinamen anzugeben:

sudo docker-compose up -f production.yml

oder:

sudo docker-compose up -f staging.yml