Docker Compose
Ziel
In diesem Projekt geht es um Docker Compose. Sie werden:
- ein Docker Compose Deployment schreiben
- sich mit den grundlegenden Befehlen der Compose CLI
docker compose
vertraut machen
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets eigenständig zu lösen.
- Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
Aufgabe 1 - Erstellen und Verwenden einer docker-compose.yml
In diesem Abschnitt machen Sie sich mit dem Compose Dateiformat vertraut und starten die Docker Demo App mithilfe des Compose CLI docker compose
.
- Erstellen Sie einen neuen Unterordner
deployment
des Workspace-Ordners/home/coder/workspace
. - Erstellen Sie im Ordner
deployment
eine neue Dateicompose.yml
. - Öffnen Sie die Datei
compose.yml
. -
Kopieren Sie folgenden Inhalt in die Datei:
--- services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000
- Im Block
services
definiert man alle Container eines Compose Deployments. webapp
definiert einen Service. In diesem Service definieren Sie,- ) dass das Image
corewire/docker-demoapp:1.0.0
genutzt wird und - ) ein Portmapping des Container-Ports
5000
auf den Host-Port8080
, sodass die Anwendung unterhttp://code-X.labs.corewire.de:8080
erreichbar ist.
- ) dass das Image
- Im Block
-
Wechseln Sie im Terminal in den Ordner
deployment
.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Wenn Sie bereits im Ordner
Workspace
sind können Sie mitcd
direkt in den neuen Ordner wechseln:cd deployment
- Wenn Sie noch in einem Unterordner des
Workspace
befinden, navigieren Sie zunächst in den Workspace-Ordner:Anschließend wechseln Sie in den richtigen Unterordner:cd ..
cd deployment
- Wenn Sie bereits im Ordner
-
Starten Sie Ihren Service im Hintergrund.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Mit
-d
wird der Container im Hintergrund gestartet.docker compose up -d
- Sie können sich alle laufenden Container eines Compose Deployments mit dem Befehl
docker compose ps
anzeigen lassen.
docker compose up -d
- Falls Sie mehr als einen Service definiert haben, startet
docker compose up -d
alle Services. - Falls Sie nur einzelne Services starten wollen, nutzen Sie
docker compose up -d <service_name>
- Mit
-
Lassen Sie sich die Logs des Services
webapp
anzeigen.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Sie können sich die Logs mit oder ohne die Option
-f
anzeigen lassen. Mit-f
werden neu erscheinende Logs angezeigt.docker compose logs -f webapp
- Sie können sich die Logs mit oder ohne die Option
-
Öffnen Sie im Browser die URL
http://code-X.labs.corewire.de:8080
, wobei X Ihre Nummer ist. Sie sollten nun die Demo App sehen. -
Stoppen und entfernen sie den Service wieder:
oderdocker compose stop webapp docker compose rm webapp
docker compose down
Warnung zu docker compose down
docker compose down
ist ein sehr destruktiver Befehl.- Falls Sie mehr als einen Service definiert haben, wird
docker compose down
alle Services stoppen, alle Container entfernen und alle lokalen Netzwerke entfernen. - Falls Sie also nur einzelne Services stoppen wollen, nutzen Sie
docker compose stop
unddocker compose rm
.
Aufgabe 2 - Volumes in Docker Compose
Sie haben in vorherigen Kapiteln der Schulung gelernt, dass Container stateless
sind.
Stateless bedeutet, dass Daten, die während der Laufzeit eines Containers geschrieben werden, verschwinden, sobald der Container gelöscht wird.
In diesem Abschnitt werden Sie lernen, wie man im Compose Dateiformat Volumes definiert.
- Die Docker Demo App legt Notizen, die im Webinterface erstellt werden, standardmäßig unter dem Pfad
/app/data/notes
ab. -
Fügen Sie zu Ihrer
compose.yml
Datei dem Servicewebapp
einen Abschnittvolumes
hinzu.Volume für Service 'webapp'
- Typ: bind-mount
- Lokaler Pfad: ./volumes/webapp-data
- Mount Pfad im Container: /app/data/notes
- Wenn Sie die genaue Syntax vergessen haben, nutzen Sie die Schulungsunterlagen oder die Dokumentation des Compose Dateiformats zu Volumes.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Die Syntax ist volumes: und darunter mit Einrückung und
-
<Hostpfad>:<Containerpfad>
:Alternativ gibt es auch eine lange Form, die allerdings voraussetzt, dass der Ordner--- services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000 volumes: - ./volumes/webapp-data:/app/data/notes
/volumes/webapp-data
bereits vorhanden ist:--- services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000 volumes: - type: bind source: ./volumes/webapp-data target: /app/data/notes
-
Starten Sie den Webapp Service.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
docker compose up -d webapp
-
Sie sollten nun sehen, dass in Ihrem Verzeichnis ein neuer Ordner
volumes
auftaucht, in dem ein Ordnerwebapp-data
liegt. Dieser Ordner sollte leer sein. - Öffnen Sie nun im Browser die URL
http://code-X.labs.corewire.de:8080
, wobei X Ihre Nummer ist. Sie sollten nun die Demo App sehen. - Erstellen eine Notiz im Webinterface der Demo App.
- Sie sollten nun im Ordner
volumes/webapp-data
sehen, dass eine neue Datei angelegt wurde, ähnlich zunote_2022-06-16T13:43:23.690467.txt
. -
Stoppen und entfernen Sie den Service
webapp
.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Zum Stoppen und Entfernen benutzen Sie folgenden Befehl:
oderdocker compose stop webapp docker compose rm webapp
docker compose down
-
Starten Sie den Webapp Service.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
docker compose up -d webapp
- Öffnen Sie nun wieder das Webinterface der Demo App (
http://code-X.labs.corewire.de:8080
). - Sie sollten nun Ihre gerade angelegte Notiz wieder sehen können.
- Öffnen Sie nun wieder das Webinterface der Demo App (
Aufgabe 3 - Datenbank Service
In diesem Abschnitt werden Sie einen neuen Service definieren, der einen MariaDB Datenbank Server startet.
-
Fügen Sie Ihrer
compose.yml
Datei einen Servicedatabase
hinzu:Datenbank Service 'database'
- Name: database
- Image Name: mariadb
- Image Tag: latest
- Referenz: https://hub.docker.com/_/mariadb
- "MYSQL_USER=example-user"
- "MYSQL_PASSWORD=password"
- "MYSQL_ROOT_PASSWORD=root_password"
- Typ: named volume
- Name: database-volume
- Mount Pfad im Container: /var/lib/mysql
- Name: database-network
- Nutzen Sie dabei die Schulungsunterlagen und die Dokumentation von Compose:
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
--- services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000 volumes: - ./volumes/webapp-data:/app/data/notes database: image: mariadb:latest environment: - "MYSQL_USER=example-user" - "MYSQL_PASSWORD=password" - "MYSQL_ROOT_PASSWORD=root_password" volumes: - database-volume:/var/lib/mysql networks: - database-network volumes: database-volume: networks: database-network:
-
Starten Sie den Service
database
.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Zum Starten des Services benutzen Sie folgende Eingabe:
docker compose up -d database
-
Lassen Sie sich die Logs des Service
database
ausgeben.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Zum Ausgeben der Logs benutzen Sie folgende Eingabe:
docker compose logs -f database
-
Wenn der Datenbank Container erfolgreich gestartet hat, sehen Sie folgende Ausgabe am Ende des Logstreams:
database_1 | 2022-06-16 14:42:06 0 [Note] Server socket created on IP: '0.0.0.0'. database_1 | 2022-06-16 14:42:06 0 [Note] Server socket created on IP: '::'. database_1 | 2022-06-16 14:42:06 0 [Note] mariadbd: ready for connections. database_1 | Version: '10.8.3-MariaDB-1:10.8.3+maria~jammy' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
Aufgabe 4 - Verbinden der Webapp mit der Datenbank
In diesem Abschnitt verbinden wir die Docker Demo App mit einer Datenbank, das bedeutet den Service webapp
mit dem Service database
.
-
Auf dem Webinterface der Docker Demo App (http://code-X.labs.corewire.de:8080) sehen Sie folgende Fehlermeldung:
Das liegt daran, dass die Docker Demo App mit keiner Datenbank verbunden ist und die Applikation standardmäßig erwartet, dass ein Datenbank Server unter dem DNS Namen "database" erreichbar ist.Connection to MariaDB Server could not be established: Unknown MySQL server host 'database' (-5)
-
Passen Sie den Service
webapp
an, indem Sie Environment Variablen und ein Netzwerk hinzufügen:Service 'webapp'
- "DATABASE_HOST=database"
- "DATABASE_PORT=3306"
- "DATABASE_USER=example-user"
- "DATABASE_USER_PASSWORD=password"
- Name: database-network
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
--- services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000 volumes: - ./volumes/webapp-data:/app/data/notes networks: - database-network environment: - "DATABASE_HOST=database" - "DATABASE_PORT=3306" - "DATABASE_USER=example-user" - "DATABASE_USER_PASSWORD=password" database: image: mariadb:latest environment: - "MYSQL_USER=example-user" - "MYSQL_PASSWORD=password" - "MYSQL_ROOT_PASSWORD=root_password" volumes: - database-volume:/var/lib/mysql networks: - database-network volumes: database-volume: networks: database-network:
-
Starten Sie den Service
webapp
neu.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
Zum Starten des Services benutzen Sie folgende Eingabe:
docker compose up -d webapp
-
Öffnen Sie
http://code-X.labs.corewire.de:8080
, die Fehlermeldung sollte nun verschwunden sein.