Zum Inhalt springen
Astrid

Docker Compose unter Ubuntu 22.04 einrichten

Docker erleichtert die Konfiguration von Software mithilfe von Containern. Docker Compose vereinfacht die Arbeite mit mehreren Containern. Ich installiere Docker Compose unter Ubuntu 22.04.

Voraussetzungen

Nach der Installation des Desktop Images von Ubuntu 22.04 LTS (Jammy Jellyfish) verfüge ich über ein non-root-Superuser-Konto und kann direkt mit der Installation von Docker Compose beginnen.

Installieren von Docker Compose

Mit dem folgenden Befehl lädst du die Version v2.12.2 herunter und speicherst die ausführbare Datei unter /usr/local/bin/docker-compose. So ist diese global als docker compose erreichbar. Die neueste Docker Compose Version findest du auf der Seite:

mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

Die aktuellste docker-compose-Version findest du auf Github

Setze die notwendigen Berechtigungen:

chmod +x ~/.docker/cli-plugins/docker-compose

Überprüfe die Version und somit auch die Installation:

$ docker compose version
Docker Compose version v2.12.2

Docker Compose ist nun installiert. Als nächstes erstellen wir eine docker-compose.yml-Datei.

Die docker-compose.yml-Datei

Um mir als Einsteigerin einen Überblick zu verschaffen, beginne ich mit einem einfachen Beispiel. Ich erstelle mithilfe des Nginx-Images eine Webserverumgebung die eine statische HTML-Datei enthält. Dafür lege ich ein separates Verzeichnis an.

mkdir ~/compose-test
cd ~/compose-test

Ich lege ein weiteres Verzeichnis an, in dem ich die HTML-Datei ~/compose-test/app/index.html ablegen. Die Datei ~/compose-test/app/index.html beinhaltet den einfachen Text test:

mkdir app
nano app/index.html

Ich verwende den Editor Nano. Hier klicke ich zum Speichern STRG+X, dann Y und zur Bestätigung ENTER.

Ich erstelle als nächstes die Datei docker-compose.yml:

nano docker-compose.yml

Der Inhalt der Datei docker-compose.yml ist:

docker-compose.yml

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html

Die Datei docker-compose.yml beginnt mit der Versionsnummer[^docs.docker.com/compose/compose-file/compose-versioning/] version.

Dann folgt der services-Block, in dem wir die Dienste einrichten. Es gibt einen Dienst der das Image nginx:alpine verwendet und mit der Anweisung ports eine Portumleitung einrichtet. volumes erstellt ein gemeinsames Volume - der lokale Ordner app wird mit dem Container unter /usr/share/nginx/html geteilt.

Im nächsten Schritt stellen wir diese Umgebung mithilfe von Docker Compose bereit.

Ausführen von Docker Compose

Die Datei docker-compose.yml enthält alle Informationen. Der folgende Befehl

  • lädt alle notwendigen Images herunter,
  • erstellt einen Container für den web-Dienst und
  • führt die Umgebung im Hintergrundmodus aus.

Der Befehl muss im Verzeichnis composer-test aufgerufen werden.

docker compose up -d

Die Ausgabe sieht beispeilsweise so aus:

$ docker compose up -d
[+] Running 7/7
 ⠿ web Pulled                                                  11.7s
   ⠿ 213ec9aee27d Pull complete                                 6.4s
   ⠿ ae98275d0ecb Pull complete                                 7.7s
   ⠿ 121e2d9f6af2 Pull complete                                 7.9s
   ⠿ 6a07d505af0f Pull complete                                 8.0s
   ⠿ 3e8957b70867 Pull complete                                 8.1s
   ⠿ 2806408d582e Pull complete                                 8.2s
[+] Running 2/2
 ⠿ Network compose-test_default  Created                        0.3s
 ⠿ Container compose-test-web-1  Started                        2.1s

Ich überprüfen, ob der Container aktiv ist. Der Befehl zeigt Informationen über die ausgeführten Container an:

$ docker compose ps
NAME                 COMMAND                  SERVICE             STATUS              PORTS
compose-test-web-1   "/docker-entrypoint.…"   web                 running             0.0.0.0:8000->80/tcp, :::8000->80/tcp

Somit ist der Container aktiv.

docker ps listet alle laufenden Container in der Docker-Engine auf. docker compose ps listet Container auf, die sich auf Images beziehen, die in der docker-compose.yml-Datei deklariert sind. Das Ergebnis von docker compose ps ist eine Teilmenge des Ergebnisses von docker ps.

Im Internet-Browser wird dir unter der URL localhost:8000 nun der Inhalt von ~/compose-test/app/index.html angezeigt. In meinem Beispiel ist dies der Text test.

Wenn ich den Inhalt der Datei ~/compose-test/app/index.html ändere, wird dies automatisch vom Container übernommen und im Browser aktualisiert.

Docker Compose Befehle

Wir haben eine docker-compose.yml-Datei erstellt und mit docker compose aufgerufen. Docker Compose biete mehr.

Der Befehl docker compose logs zeigt die mitprotokollierten Meldungen:

docker compose logs

Die Ausgabe des Befehls ähnelt:

Attaching to compose-test_web_1
web_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1  | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1  | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1  | 172.19.0.1 - - [30/Aug/2020:20:58:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"

In den Pausemodus schalte ich mit:

docker compose pause

Die Pause beende ich mit:

docker compose unpause

Der Befehl stop beendet die Ausführung des Containers:

docker compose stop

Verknüpften Container, Netzwerke und Volums werden mit down entfernt:

docker compose down

Das Image entferne ich mit:

docker image rm nginx:alpine

Eine vollständige Referenz aller verfügbaren docker compose Befehle ist die offizielle Dokumentation.