Docker-compose
Ziel
In diesem Projekt geht es um docker-compose.
Sie werden lernen wie man ein docker-compose Deployment schreibt und sich mit den grundlegenden Befehlen der Compose CLI docker-compose vertraut machen.
Hilfsmittel
- Versuchen Sie zuerst, die unten stehenden Aufgaben mit Hilfe der Folien und des Cheatsheets 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 Ordner
deployment. - Erstellen Sie im Ordner
deploymenteine neue Dateidocker-compose.yml. - Öffnen Sie die Datei
docker-compose.yml. -
Kopieren Sie folgenden Inhalt in die Datei:
--- version: '3.8' services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000versionsteht hier für die Version des Compose Dateiformats.- 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.docker.labs.corewire.de:8080erreichbar ist.
- ) dass das Image
-
Wechseln Sie im Terminal in den Ordner
deploymentmit:cd deployment -
Starten Sie Ihren Service:
docker-compose up -d-dsteht hier für detached, das heißt alle Services werden im Hintergrund gestartet.- 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>
-
Lassen Sie sich die Logs des Services
webappmit folgendem Befehl anzeigen:docker-compose logs -f webapp - Öffnen Sie im Browser in einem privaten Tab die URL
http://code-X.docker.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 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
docker-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)
--- version: '3.8' services: webapp: image: corewire/docker-demoapp:1.0.0 ports: - 8080:5000 volumes: - ./volumes/webapp-data:/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 in einem privaten Tab die URL
http://code-X.docker.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-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:
docker-compose down -
Starten Sie den Webapp Service.
- Öffnen Sie nun wieder das Webinterface der Demo App (
http://code-X.docker.labs.corewire.de:8080). - Sie sollten nun Ihre gerade angelegte Notiz wieder sehen können.
Aufgabe 3 - Datenbank Service
In diesem Abschnitt werden Sie einen neuen Service definieren, der einen MariaDB Datenbank Server startet.
-
Fügen Sie Ihrer
docker-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)
--- version: '3.8' 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.docker.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
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)
--- version: '3.8' 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.docker.labs.corewire.de:8080, die Fehlermeldung sollte nun verschwunden sein.