Docker Compose
Ich bin ein großer Fan von Docker Compose, da im Vergleich zu „docker run“ alles einfach reproduzierbar ist. In einigen vorherigen Beispielen habe ich bereits docker-compose.yml verwendet. Hier nun ein bisschen ein tieferer Einblick in die Funktionalität von Docker Compose sowie den Aufbau von docker-compose.yml.
In einem docker-compose.yml können mehrere Services definiert werden, die ausgeführt werden sollen. Nachfolgend ein umfassenderes Beispiel, anhand dessen die einzelnen Themen erklärt werden sollen.
services:
wordpress:
image: wordpress
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_PASSWORD: root
depends_on:
- mysql
volumes:
- "./:/var/data"
networks:
testnetwork:
aliases:
- cms
mysql:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
- testnetwork
networks:
testnetwork:
Die zu starten Anwendungen werden im Bereich „services“ definiert. Eingerückt dazu kommen dann die einzelnen Services, die erstellt werden sollen. Die Namen können an dieser Stelle frei vergeben werden.
Ein Service benötigt immer ein Image, welcher gestartet werden soll. Dies kann entweder mit dem Parameter „image“ definiert werden oder aber, wenn ein Dockerfile erstellt wurde, direkt durch „build“ erzeugt werden:
services:
web:
build: .
Ein weiterer wichtiger Parameter im produktiven Umfeld ist „restart“. Dieser definiert, wann der Container neu gestartet werden soll. Mögliche Werte sind „no“ (= Standard), „always“, „on-failure“ und „unless-stopped“.
Bei vielen Services ist es notwendig, ein Portmapping zw. dem Host und dem Container zu definieren. Dies wird mit dem Parameter „ports“ gemacht. Vor dem Doppelpunkt steht der Host-Port und dahinter der Container-Port. Wenn beide ident sind, reicht es den Port einfach anzugeben.
Zur Übergabe von Umgebungsvariablen wird „environment“ verwendet. Dies kann mit zwei Schreibweisen erfolgen (beide sind oben abgebildet).
Beim Start von MySql und WordPress ist es notwendig, dass die Datenbank zuerst vorhanden ist. Dies kann mit dem Parameter „depends_on“ geregelt werden.
Verzeichnisse werden mit dem Parameter „volumes“ angegeben. Ähnlich wie beim Port steht vor dem Doppelpunkt der Pfad vom Host und dahinter der Pfad im Container.
Auf der Hauptebene können mit dem Schlüsselwort „networks“ Netzwerke definiert werden. Im Beispiel oben werden diese nur benannt, könnten aber auch mit speziellen Treibern, … definiert werden. Pro Service können die Netzwerke, die zur Verfügung stehen sollen, zugeordnet werden. Weiters ist es möglich Alias zu vergeben. Beispielweise ist der WordPress Service lt. Definition jetzt unter den Namen „wordpress“ und „cms“ erreichbar.
Weitere und wesentlich detailliertere Informationen sind unter https://docs.docker.com/compose/compose-file/ abrufbar.
docker compose build
Dieser Befehl liest die docker-compose.yml Datei, sucht nach zu erstellenden Images und erstellt diese. Es ist allerdings nicht notwendig, dies zu machen, da im Zuge von „docker compose up“ die Images erzeugt werden, falls noch nicht vorhanden.
docker compose config
Validierung die docker-compose.yml Datei und gibt sie aus.
docker compose down
Beendet die Container und löscht die Networks, Volumes sowie die Images, die im Zuge von „docker compose up“ erstellt wurden.
docke compose exec $SERVICENAME $CMD
Das ist das Pedant zu „docker exec“ und führt einen Befehl innerhalb eines Container aus.
docker compose logs $SERVICENAME
Hiermit können die Logs aus einem Service gelesen werden. Um den interaktiven Modus zu starten, kann der Parameter „-f“ angegeben werden:
docker compose logs -f -n 100 $SERVICENAME
Der Parameter -n 100 gibt an, dass nur die letzten 100 Einträge angezeigt werden.
docker compose ps
Listet die laufenden Container auf.
docker compose restart
Beendet und startet die Services neu. Alternativ kann am Ende noch der Service-Name angegeben werden, um nur diese neu zu starten.
Es gilt zu beachten, dass Änderungen, die in der docker-compose.yml Datei gemacht wurden, hierbei NICHT berücksichtigt werden!
docker compose start
Hiermit werden die Container, die zuvor mit „docker compose stop“ beendet wurden, wieder gestartet. Es kann zusätzlich der Service-Name angegeben werden, um nur einen Service zu starten.
dockercompose stop
Hiermit die Container gestoppt werden. Networks, Volumes, … bleiben dabei erhalten. Auch hier kann zusätzlich noch eine Service-Name angegeben werden, wenn nur dieser gestoppt werden soll.
Gleich wie bei „docker compose restart“ werden Änderungen in der docker-compose.yml Datei NICHT berücksichtigt!
docker compose top
Dieser Befehl listet die laufenden Prozesse innerhalb der Container auf. Zusätzlich kann der Service-Name übergeben werden, wenn nur die Informationen zu einem bestimmten Service angezeigt werden sollen.
docker compose up
Der wohl wichtigste Befehl überhaupt :-).
Hiermit werden die Container, die in der docker-compose.yml definiert wurden, gestartet (falls sie noch nicht gestartet wurden).
Up hat einige interessante Parameter:
- -d – steht für detached. Wird dieser angegeben, dann laufen die Container im Hintergrund und wir haben die Konsole für weitere Befehle.
- –force-recreate – erzeugt die Container von neuem, auch wenn sich die Konfiguration und Images nicht verändert haben.
- –build – gibt an, dass die Images zuerst erstellt werden sollen, bevor die Container gestartet werden.
- –remove-orphans – werden Services aus docker-compose.yml entfernt, während die Container im Status „laufend“ oder „gestoppt“ sind, dann kann mit diesem Parameter definiert werden, dass diese entfernt werden sollen.
Wichtig: WordPress entfernt leider die doppelten Dashes bei force-recreate, build und remove-orphans und macht einen daraus – müssen aber zwei sein!
Nach einer Änderung der docker-compose.yml Datei kann ebenfalls „docker compose up -d“ aufgerufen werden (auch wenn die Container am laufen sind). Es wird geprüft, welche Container aufgrund der Änderung neu startet werden müssen und dies gemacht.