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 composevertraut 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 
deploymentdes Workspace-Ordners/home/coder/workspace. - Erstellen Sie im Ordner 
deploymenteine 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 
servicesdefiniert man alle Container eines Compose Deployments. webappdefiniert einen Service. In diesem Service definieren Sie,- ) dass das Image 
corewire/docker-demoapp:1.0.0genutzt wird und - ) ein Portmapping des Container-Ports 
5000auf den Host-Port8080, sodass die Anwendung unterhttp://code-X.learn.corewire.de:8080erreichbar 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 
Workspacesind können Sie mitcddirekt in den neuen Ordner wechseln:cd deployment - Wenn Sie noch in einem Unterordner des 
Workspacebefinden, 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 
-dwird der Container im Hintergrund gestartet.docker compose up -d 
- Sie können sich alle laufenden Container eines Compose Deployments mit dem Befehl 
docker compose psanzeigen lassen. 
docker compose up -d
- Falls Sie mehr als einen Service definiert haben, startet 
docker compose up -dalle Services. - Falls Sie nur einzelne Services starten wollen, nutzen Sie 
docker compose up -d <service_name> 
 - Mit 
 - 
Lassen Sie sich die Logs des Services
webappanzeigen.Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Sie können sich die Logs mit oder ohne die Option 
-fanzeigen lassen. Mit-fwerden 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.learn.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 webappdocker compose downWarnung zu docker compose down
docker compose downist ein sehr destruktiver Befehl.- Falls Sie mehr als einen Service definiert haben, wird 
docker compose downalle Services stoppen, alle Container entfernen und alle lokalen Netzwerke entfernen. - Falls Sie also nur einzelne Services stoppen wollen, nutzen Sie 
docker compose stopunddocker 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/notesab. - 
Fügen Sie zu Ihrer
compose.ymlDatei dem Servicewebappeinen Abschnittvolumeshinzu.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-databereits 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
volumesauftaucht, in dem ein Ordnerwebapp-dataliegt. Dieser Ordner sollte leer sein. - Öffnen Sie nun im Browser die URL 
http://code-X.learn.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-datasehen, 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 webappdocker 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.learn.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.ymlDatei einen Servicedatabasehinzu: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
databaseausgeben.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.learn.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
webappan, 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
webappneu.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.learn.corewire.de:8080, die Fehlermeldung sollte nun verschwunden sein.