Docker/Compose: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
| (14 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 19: | Zeile 19: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
├── getting-started-app/ | ├── getting-started-app/ | ||
│ ├── Dockerdatei | │ ├── Dockerdatei | ||
│ ├── compose.yaml | │ ├── compose.yaml | ||
│ ├── node_modules/ | │ ├── node_modules/ | ||
│ ├── package.json | │ ├── package.json | ||
│ ├── spec/ | │ ├── spec/ | ||
│ ├── src/ | │ ├── src/ | ||
│ └── yarn.lock | │ └── yarn.lock | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Zeile 50: | Zeile 43: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
In YAML sieht diese Konfiguration wie folgt aus: | |||
<syntaxhighlight lang="yaml" line> | <syntaxhighlight lang="yaml" line> | ||
services: | services: | ||
| Zeile 122: | Zeile 70: | ||
-e MYSQL_DATABASE=todos \ | -e MYSQL_DATABASE=todos \ | ||
mysql:8.0 | mysql:8.0 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Zeile 193: | Zeile 101: | ||
todo-mysql-data: | todo-mysql-data: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Vollständige Übersicht über die Parameter ==== | |||
Die folgende Tabelle zeigt die Entsprechung zwischen den Parametern des Befehls ''docker run'' und den jeweiligen YAML-Direktiven in einer ''compose.yaml''-Datei. Dadurch lässt sich nachvollziehen, wie Docker Compose dieselben Einstellungen automatisch umsetzt. | |||
{| class="wikitable options gnu big" | |||
|- | |||
! YAML !! docker run-Parameter !! Beschreibung | |||
|- | |||
! colspan="3" | Dienst: app | |||
|- | |||
| image: node:lts-alpine || <code>node:lts-alpine</code> || Basis-Image. | |||
|- | |||
| command: sh -c "yarn install && yarn run dev" || <code>sh -c "yarn install && yarn run dev"</code> || Startkommando (überschreibt CMD). | |||
|- | |||
| ports:<br> 127.0.0.1:3000:3000 || <code>-p 127.0.0.1:3000:3000</code> || Port-Mapping Host->Container. | |||
|- | |||
| working_dir: /app || <code>-w /app</code> || Arbeitsverzeichnis im Container. | |||
|- | |||
| volumes:<br> ./:/app || <code>-v "$(pwd):/app"</code> || Bind-Mount des Projektverzeichnisses. | |||
|- | |||
| environment: MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB || <code>-e MYSQL_HOST=mysql</code><br><code>-e MYSQL_USER=root</code><br><code>-e MYSQL_PASSWORD=secret</code><br><code>-e MYSQL_DB=todos</code> || Umgebungsvariablen für die App. | |||
|- | |||
! colspan="3" | Dienst: mysql | |||
|- | |||
| image: mysql:8.0 || <code>mysql:8.0</code> || MySQL-Server-Image. | |||
|- | |||
| volumes:<br> todo-mysql-data:/var/lib/mysql || <code>-v todo-mysql-data:/var/lib/mysql</code> || Benanntes Volume für persistente Daten. | |||
|- | |||
| environment: MYSQL_ROOT_PASSWORD, MYSQL_DATABASE || <code>-e MYSQL_ROOT_PASSWORD=secret</code><br><code>-e MYSQL_DATABASE=todos</code> || Initiale Datenbankparameter. | |||
|- | |||
| Servicename: mysql || <code>--network-alias mysql</code> || DNS-Name im Container-Netzwerk (automatisch durch Servicenamen). | |||
|- | |||
! colspan="3" | Top-Level | |||
|- | |||
| volumes:<br> todo-mysql-data: || — || Definition des benannten Volumes. | |||
|} | |||
=== Starten Sie den Anwendungsstack === | === Starten Sie den Anwendungsstack === | ||
Nun, da Sie Ihre compose.yaml-Datei haben, können Sie Ihre Anwendung starten. | Nun, da Sie Ihre compose.yaml-Datei haben, können Sie Ihre Anwendung starten. | ||
* Vergewissern Sie sich zunächst, dass keine anderen Kopien der Container ausgeführt werden. Verwenden Sie docker ps, um die Container aufzulisten und docker rm -f <ids>, um sie zu entfernen | * Vergewissern Sie sich zunächst, dass keine anderen Kopien der Container ausgeführt werden. Verwenden Sie ''docker ps'', um die Container aufzulisten und ''docker rm -f <ids>'', um sie zu entfernen | ||
* Starten Sie den Anwendungsstapel mit dem Befehl docker compose up. Fügen Sie das Flag -d hinzu, um alles im Hintergrund laufen zu lassen | * Starten Sie den Anwendungsstapel mit dem Befehl ''docker compose up''. Fügen Sie das Flag ''-d'' hinzu, um alles im Hintergrund laufen zu lassen | ||
<syntaxhighlight lang="bash" highlight="1" copy line> | <syntaxhighlight lang="bash" highlight="1" copy line> | ||
| Zeile 205: | Zeile 150: | ||
* Wenn Sie den vorherigen Befehl ausführen, sollten Sie eine Ausgabe wie die folgende sehen | * Wenn Sie den vorherigen Befehl ausführen, sollten Sie eine Ausgabe wie die folgende sehen | ||
<syntaxhighlight lang="console"> | |||
✔ Network getting-started-app_default Created 0.1s | |||
✔ Volume getting-started-app_todo-mysql-data Created 0.0s | |||
✔ Container getting-started-app-mysql-1 Started 0.3s | |||
✔ Container getting-started-app-app-1 Started | |||
</syntaxhighlight> | |||
Sie werden feststellen, dass Docker Compose sowohl das Volume als auch ein Netzwerk erstellt hat. Standardmäßig erstellt Docker Compose automatisch ein Netzwerk speziell für den Anwendungsstapel (deshalb haben Sie kein Netzwerk in der Compose-Datei definiert). | Sie werden feststellen, dass Docker Compose sowohl das Volume als auch ein Netzwerk erstellt hat. Standardmäßig erstellt Docker Compose automatisch ein Netzwerk speziell für den Anwendungsstapel (deshalb haben Sie kein Netzwerk in der Compose-Datei definiert). | ||
* Sehen Sie sich die Protokolle mit dem Befehl docker compose logs -f an. Sie werden sehen, dass die Protokolle der einzelnen Dienste in einen einzigen Stream verschachtelt sind. Dies ist sehr nützlich, wenn Sie auf zeitliche Probleme achten wollen. Die Markierung -f folgt dem Protokoll, so dass Sie eine Live-Ausgabe erhalten, während es erzeugt wird | * Sehen Sie sich die Protokolle mit dem Befehl ''docker compose logs -f'' an. Sie werden sehen, dass die Protokolle der einzelnen Dienste in einen einzigen Stream verschachtelt sind. Dies ist sehr nützlich, wenn Sie auf zeitliche Probleme achten wollen. Die Markierung ''-f'' folgt dem Protokoll, so dass Sie eine Live-Ausgabe erhalten, während es erzeugt wird | ||
Wenn Sie den Befehl bereits ausgeführt haben, werden Sie eine Ausgabe sehen, die wie folgt aussieht: | Wenn Sie den Befehl bereits ausgeführt haben, werden Sie eine Ausgabe sehen, die wie folgt aussieht: | ||
| Zeile 226: | Zeile 173: | ||
* Der Name des Dienstes wird am Anfang der Zeile angezeigt (oft farbig), um die Unterscheidung der Meldungen zu erleichtern. | * Der Name des Dienstes wird am Anfang der Zeile angezeigt (oft farbig), um die Unterscheidung der Meldungen zu erleichtern. | ||
* Wenn Sie die Protokolle für einen bestimmten Dienst anzeigen möchten, können Sie den Namen des Dienstes an das Ende des Befehls logs anhängen (z. B. docker compose logs -f app). | * Wenn Sie die Protokolle für einen bestimmten Dienst anzeigen möchten, können Sie den Namen des Dienstes an das Ende des Befehls logs anhängen (z. B. ''docker compose logs -f app''). | ||
* Zu diesem Zeitpunkt sollten Sie in der Lage sein, Ihre App in Ihrem Browser auf [http://localhost:3000/ http://localhost:3000] zu öffnen und zu sehen, dass sie läuft | * Zu diesem Zeitpunkt sollten Sie in der Lage sein, Ihre App in Ihrem Browser auf [http://localhost:3000/ http://localhost:3000] zu öffnen und zu sehen, dass sie läuft | ||
| Zeile 248: | Zeile 195: | ||
=== Nächste Schritte === | === Nächste Schritte === | ||
[[Docker/Workshop/Image/Erstellung|Image Erstellung]] | |||
== Anhang == | == Anhang == | ||
| Zeile 272: | Zeile 219: | ||
# [https://docs.docker.com/reference/compose-file/ Compose-Dateireferenz] | # [https://docs.docker.com/reference/compose-file/ Compose-Dateireferenz] | ||
# [https://docs.docker.com/reference/cli/docker/compose/ Compose CLI-Referenz] | # [https://docs.docker.com/reference/cli/docker/compose/ Compose CLI-Referenz] | ||
[[Kategorie:Docker | [[Kategorie:Docker]] | ||
Aktuelle Version vom 2. November 2025, 12:58 Uhr
Docker/Compose
Compose
- Docker Compose verwenden
Docker Compose — Werkzeug zur Definition und Verwaltung mehrerer Container, die gemeinsam eine Anwendung bilden. Die gesamte Umgebung wird in einer compose.yaml-Datei beschrieben und kann mit einem einzigen Befehl gestartet oder gestoppt werden.
Der große Vorteil von Compose besteht darin, dass Sie Ihren Anwendungsstack in einer Datei definieren können, diese im Stammverzeichnis Ihres Projekt-Repositorys aufbewahren können (es ist jetzt versionskontrolliert) und es anderen Personen leicht ermöglichen, zu Ihrem Projekt beizutragen. Jemand müsste nur Ihr Repository klonen und die Anwendung mit Compose starten. Tatsächlich gibt es auf GitHub/GitLab eine ganze Reihe von Projekten, die genau das tun
- Vorteile
- Deklarative, versionskontrollierbare Konfiguration in compose.yaml.
- Start, Stopp und Bereinigung des gesamten Stacks mit einem Befehl.
- Isolierung und Service-Discovery über benannte Netzwerke und Volumes.
- Skalierung und gemeinsame Log-Sicht pro Dienst.
Erstellen Sie die Compose-Datei
Erstellen Sie im Verzeichnis getting-started-app eine Datei namens compose.yaml
├── getting-started-app/
│ ├── Dockerdatei
│ ├── compose.yaml
│ ├── node_modules/
│ ├── package.json
│ ├── spec/
│ ├── src/
│ └── yarn.lock
Definieren Sie den Anwendungsdienst
In Teil 6 haben Sie den folgenden Befehl verwendet, um den Anwendungsdienst zu starten
docker run -dp 127.0.0.1:3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:lts-alpine \
sh -c "yarn install && yarn run dev"
In YAML sieht diese Konfiguration wie folgt aus:
services:
app:
image: node:lts-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
Definieren Sie den MySQL-Dienst
Nun ist es an der Zeit, den MySQL-Dienst zu definieren. Der Befehl, den Sie für diesen Container verwendet haben, war der folgende:
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:8.0
Zu diesem Zeitpunkt sollte Ihre komplette compose.yaml wie folgt aussehen:
services:
app:
image: node:lts-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
Vollständige Übersicht über die Parameter
Die folgende Tabelle zeigt die Entsprechung zwischen den Parametern des Befehls docker run und den jeweiligen YAML-Direktiven in einer compose.yaml-Datei. Dadurch lässt sich nachvollziehen, wie Docker Compose dieselben Einstellungen automatisch umsetzt.
| YAML | docker run-Parameter | Beschreibung |
|---|---|---|
| Dienst: app | ||
| image: node:lts-alpine | node:lts-alpine |
Basis-Image. |
| command: sh -c "yarn install && yarn run dev" | sh -c "yarn install && yarn run dev" |
Startkommando (überschreibt CMD). |
| ports: 127.0.0.1:3000:3000 |
-p 127.0.0.1:3000:3000 |
Port-Mapping Host->Container. |
| working_dir: /app | -w /app |
Arbeitsverzeichnis im Container. |
| volumes: ./:/app |
-v "$(pwd):/app" |
Bind-Mount des Projektverzeichnisses. |
| environment: MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB | -e MYSQL_HOST=mysql-e MYSQL_USER=root-e MYSQL_PASSWORD=secret-e MYSQL_DB=todos |
Umgebungsvariablen für die App. |
| Dienst: mysql | ||
| image: mysql:8.0 | mysql:8.0 |
MySQL-Server-Image. |
| volumes: todo-mysql-data:/var/lib/mysql |
-v todo-mysql-data:/var/lib/mysql |
Benanntes Volume für persistente Daten. |
| environment: MYSQL_ROOT_PASSWORD, MYSQL_DATABASE | -e MYSQL_ROOT_PASSWORD=secret-e MYSQL_DATABASE=todos |
Initiale Datenbankparameter. |
| Servicename: mysql | --network-alias mysql |
DNS-Name im Container-Netzwerk (automatisch durch Servicenamen). |
| Top-Level | ||
| volumes: todo-mysql-data: |
— | Definition des benannten Volumes. |
Starten Sie den Anwendungsstack
Nun, da Sie Ihre compose.yaml-Datei haben, können Sie Ihre Anwendung starten.
- Vergewissern Sie sich zunächst, dass keine anderen Kopien der Container ausgeführt werden. Verwenden Sie docker ps, um die Container aufzulisten und docker rm -f <ids>, um sie zu entfernen
- Starten Sie den Anwendungsstapel mit dem Befehl docker compose up. Fügen Sie das Flag -d hinzu, um alles im Hintergrund laufen zu lassen
docker compose up -d
- Wenn Sie den vorherigen Befehl ausführen, sollten Sie eine Ausgabe wie die folgende sehen
✔ Network getting-started-app_default Created 0.1s
✔ Volume getting-started-app_todo-mysql-data Created 0.0s
✔ Container getting-started-app-mysql-1 Started 0.3s
✔ Container getting-started-app-app-1 Started
Sie werden feststellen, dass Docker Compose sowohl das Volume als auch ein Netzwerk erstellt hat. Standardmäßig erstellt Docker Compose automatisch ein Netzwerk speziell für den Anwendungsstapel (deshalb haben Sie kein Netzwerk in der Compose-Datei definiert).
- Sehen Sie sich die Protokolle mit dem Befehl docker compose logs -f an. Sie werden sehen, dass die Protokolle der einzelnen Dienste in einen einzigen Stream verschachtelt sind. Dies ist sehr nützlich, wenn Sie auf zeitliche Probleme achten wollen. Die Markierung -f folgt dem Protokoll, so dass Sie eine Live-Ausgabe erhalten, während es erzeugt wird
Wenn Sie den Befehl bereits ausgeführt haben, werden Sie eine Ausgabe sehen, die wie folgt aussieht:
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Hinweis] mysqld: bereit für Verbindungen
mysql_1 | Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Gemeinschaftsserver (GPL)
app_1 | Verbunden mit mysql db auf dem Host mysql
app_1 | Lauschen auf Port 3000
- Der Name des Dienstes wird am Anfang der Zeile angezeigt (oft farbig), um die Unterscheidung der Meldungen zu erleichtern.
- Wenn Sie die Protokolle für einen bestimmten Dienst anzeigen möchten, können Sie den Namen des Dienstes an das Ende des Befehls logs anhängen (z. B. docker compose logs -f app).
- Zu diesem Zeitpunkt sollten Sie in der Lage sein, Ihre App in Ihrem Browser auf http://localhost:3000 zu öffnen und zu sehen, dass sie läuft
Sehen Sie den App-Stack im Docker Desktop Dashboard
Im Docker Desktop Dashboard sehen Sie, dass es eine Gruppe namens getting-started-app gibt. Dies ist der Projektname von Docker Compose und wird verwendet, um die Container zusammenzufassen. Standardmäßig ist der Projektname einfach der Name des Verzeichnisses, in dem sich die compose.yaml befand
Wenn Sie den Stack erweitern, sehen Sie die beiden Container, die Sie in der Compose-Datei definiert haben. Die Namen sind auch etwas aussagekräftiger, da sie dem Muster <Service-Name>-<Replikat-Nummer> folgen. So ist es sehr einfach, schnell zu erkennen, welcher Container Ihre Anwendung und welcher Container die mysql-Datenbank ist
Alles abreißen
Wenn Sie bereit sind, alles abzubauen, führen Sie einfach docker compose down aus oder drücken Sie den Mülleimer im Docker Desktop Dashboard für die gesamte Anwendung. Die Container werden gestoppt und das Netzwerk wird entfernt
Warnung
Standardmäßig werden benannte Volumes in Ihrer Compose-Datei nicht entfernt, wenn Sie docker compose down ausführen. Wenn Sie die Volumes entfernen möchten, müssen Sie das Flag --volumes hinzufügen
Das Docker Desktop Dashboard entfernt die Volumes nicht, wenn Sie den Anwendungsstapel löschen
Zusammenfassung
In diesem Abschnitt haben Sie Docker Compose kennengelernt und erfahren, wie Sie damit die Definition und Freigabe von Multi-Service-Anwendungen vereinfachen können
Nächste Schritte
Anhang
Siehe auch