Verwalten von Multi-Container-Anwendungen mit docker-compose
- WAS?
Mit docker-compose können Sie eine Multicontainer-Anwendung definieren und verwalten. Das Tool vereinfacht die Bereitstellung eines solchen Anwendungsstapels durch die Verwendung einer benutzerfreundlichen Definitionsdatei.
- WARUM?
In diesem Artikel wird beschrieben, wie Sie eine Multicontainer-Anwendung mit docker-compose erstellen.
- AUFWAND
Es dauert etwa 20 Minuten, den Artikel zu lesen.
- ZIEL
Sie können einen eigenen Container-basierten Anwendungsstack erstellen.
- ANFORDERUNGEN
Anwendungscontainer-Images oder die zugehörigen Quelldateien, die zur Erstellung der Anwendung verwendet werden.
1 Tools für die Verwaltung von Anwendungen mit mehreren Containern #
docker-compose ist das Tool zur Erstellung der Multicontainer-Anwendung. Standardmäßig verwendet es Docker, das auf SLE Micro nicht vorhanden ist. Zur Umgehung von Docker und zur Verwendung von Podman wird das podman-docker
-Skript verwendet. Daher müssen Sie Ihre bestehenden Skripte nicht von Docker auf Podman umstellen. In den folgenden Abschnitten finden Sie detaillierte Beschreibungen der Tools.
1.1 Informationen zu Podman #
Podman ist der Kurzname für das Pod Manager Tool. Es handelt sich um eine daemonlose Container-Engine, mit der Sie Anwendungen mithilfe von Containern und Container-Images ausführen und bereitstellen können. Podman umfasst eine Kommandozeilenschnittstelle für die Verwaltung der Container.
Da Podman nicht über einen Daemon verfügt, ist eine Integration in systemd möglich. Dies ermöglicht die Steuerung von Containern über systemd-Units. Sie können diese Units für vorhandene Container erstellen und auch Units generieren, mit denen Container gestartet werden, wenn sie noch nicht im System vorhanden sind. Podman kann systemd in Containern ausführen.
Mit Podman können Sie Ihre Container in Pods organisieren. Pods verwenden dieselbe Netzwerkschnittstelle und dieselben Ressourcen. Ein typischer Anwendungsfall für die Organisation einer Gruppe von Containern in einem Pod ist ein Container, auf dem eine Datenbank ausgeführt wird, und ein Container mit einem Client, der auf die Datenbank zugreift.
1.1.1 Installation von Podman #
Podman ist standardmäßig in SLE Micro enthalten. Wenn Podman jedoch fehlt, können Sie ihn wie unten beschrieben installieren:
Führen Sie folgenden Befehl aus:
>
sudo
transactional-update pkg install podman*Starten Sie Ihr System neu, um in den neuen Snapshot zu booten.
1.2 Informationen zu podman-docker
#
podman-docker
ist ein Bash-Skript, das jedes docker
-Kommando, das Sie ausführen, in ein entsprechendes podman
-Kommando mit denselben übergebenen Argumenten ändert. Daher können Sie alle Docker-Skripte ohne jegliche Änderungen verwenden.
1.2.1 Installation von podman-docker
#
podman-docker
ist nicht standardmäßig unter SLE Micro installiert. Gehen Sie zum Installieren wie folgt vor:
Installieren Sie das Paket
podman-docker
mit dem Kommando:transactional-update pkg install podman-docker
Booten Sie das System neu, um zum neuesten Snapshot zu wechseln.
1.3 Informationen zu docker-compose #
docker-compose ist ein Tool zum Verwalten von Multi-Container-Anwendungen. Mit docker-compose können Sie mehrere isolierte Umgebungen auf einem einzigen Host einrichten. Gleichzeitig unterstützt es die Verwendung von Variablen zwischen den Umgebungen. Mit docker-compose können Sie nur die Container neu erstellen, die sich geändert haben, ohne die gesamte Multi-Container-Anwendung zu zerstören.
docker
ersetzt mit dem podman
-Kommando
Unter SLE Micro wird mit dem podman-docker
-Skript Podman aufgerufen, wenn Sie docker-compose ausführen, da Docker unter SLE Micro nicht vorhanden ist.
1.3.1 Installieren von docker-compose #
Wenn docker-compose nicht auf Ihrem System vorhanden ist, können Sie es mit den folgenden Schritten installieren:
Führen Sie folgendes Kommando aus:
>
sudo
transactional-update pkg install docker-composeNach der Installation starten Sie Ihr System neu, um den neuen Snapshot zu starten.
2 Erstellen einer Multi-Container-Anwendung #
Gehen Sie wie folgt vor, um ein Multi-Container-Image zu erstellen:
Erstellen Sie die Konfigurationsdatei
compose.yml
. Detaillierte Informationen finden Sie in Abschnitt 2.1, „Erstellen voncompose.yml
“.Bereiten Sie die erforderliche Verzeichnisstruktur vor. Wir empfehlen, die Datei
compose.yml
ganz oben in Ihrem Arbeitsverzeichnis abzulegen.Schreiben Sie bei Bedarf eigene Containerdateien für die Dienste, die von der containerisierten Anwendung verwendet werden. Wenn Sie beispielsweise eine Go-Anwendung bereitstellen möchten, erstellen Sie eine Containerdatei für die Go-Anwendung mit der erforderlichen Konfiguration und den Abhängigkeiten.
Wir empfehlen, für jeden Dienst ein Unterverzeichnis im Arbeitsverzeichnis anzulegen und die dienstspezifischen Dateien dort abzulegen.
Stellen Sie die Multi-Container-Anwendung bereit. Detaillierte Informationen finden Sie in Abschnitt 2.2, „Bereitstellung von Anwendungen mit mehreren Containern“.
2.1 Erstellen von compose.yml
#
Sie müssen zum Erstellen der Multi-Container-Anwendung eine Datei compose.yml
erstellen, die Sie vorzugsweise in Ihrem Arbeitsverzeichnis ablegen. Es kann sich dabei um eine einzelne Datei handeln, oder Sie können einen detaillierteren Ansatz mit Hilfe von Fragmenten und Erweiterungen verwenden. Es können auch mehrere docker-compose-Dateien zusammengeführt werden, um das gesamte Anwendungsmodell zu definieren.
Die Datei compose.yml
definiert Ihre Anwendung. Sie können die folgenden Teile einfügen.
- service
Ein Dienst ist eine Computerkomponente der Anwendung. Einzelheiten zur Definition finden Sie unter Abschnitt 2.1.1, „Definition der Dienste“.
- networks
Sie können mit der
network
-Anweisung benutzerdefinierte Netzwerke definieren und den benutzerdefinierten Netzwerken bestimmte Dienste zuweisen. Detaillierte Informationen finden Sie in Abschnitt 2.1.2, „Definition von Netzwerken“.- Volumes
Ein von der Container-Engine verwaltetes Verzeichnis, in dem Dienste Daten speichern und gemeinsam nutzen.
- Umgebungsvariablen
Möglicherweise müssen Sie auch eine Liste von Umgebungsvariablen verwenden, die an Ihre Dienste übergeben werden. Detaillierte Informationen finden Sie in environment variables reference.
- configs
Alle Konfigurationsdateien, die von den Diensten benötigt werden, müssen im Abschnitt
configs
angegeben werden. Detaillierte Informationen finden Sie inconfigs
definition.
2.1.1 Definition der Dienste #
Bei der Definition von Diensten müssen Sie entweder ein Container-Image angeben, das verwendet werden soll, oder Quelldateien bereitstellen, um den Dienst daraus zu erstellen.
Wenn Sie den Dienst-Container aus einem Image erstellen möchten, verwenden Sie die image
-Anweisung:
services: db: image: database
Podman prüft, ob der in der Datei compose.yml
angegebene Bildname im lokalen Container-Speicher verfügbar ist. Wenn dies nicht der Fall ist, zieht Podman das Image aus einer der konfigurierten Registrierungen.
Wenn Sie einen Dienst aus Quelldateien erstellen möchten, stellen Sie die Quelldateien zur Verfügung und erstellen Sie eine Containerdatei, beides im selben Verzeichnis. Verwenden Sie dann in der Datei compose.yml
die build
-Anweisung.
services: db: build: PATH_TO_SOURCE_FILES
Wenn ein bestimmter Dienst nach einem anderen gestartet werden muss, können Sie die depends_on
-Anweisung verwenden:
services: db: image: database depends_on: system: condition: SERVICE_CONDITION
Die SERVICE_CONDITION kann eine der folgenden sein: service_started
, service_healthy
oder service_completed_successfully
.
Weitere Informationen zur services
-Definition finden Sie in der services
specification.
2.1.2 Definition von Netzwerken #
Standardmäßig erstellt docker-compose ein Standardnetzwerk, und jeder Container im Anwendungsstapel ist in das Netzwerk eingebunden. Das Standardnetzwerk muss nicht in der Datei compose.yml
deklariert werden, da docker-compose es automatisch erstellt.
Sie können auch eigene Netzwerke definieren und ihnen bestimmte Dienste zuweisen. Wenn Sie beispielsweise zwei Netzwerke erstellen möchten, network1
und network2
, fügen Sie das folgende Snippet ein:
networks: network1: # Use a custom driver driver: custom-driver-1 network2: # Use a custom driver and name the network driver: custom-driver-2 name: custom_network
Sie können auch ein bestehendes Netzwerk verwenden. In diesem Fall markieren Sie das Netzwerk als extern:
networks: network1: name: network1 external: true
Eine vollständige networks
-Spezifikation finden Sie in der networks
specification.
2.1.3 Beispiel einer compose.yml
#
Das folgende Beispiel einer compose.yml
definiert einen Anwendungsstapel, der das Prometheus-Überwachungssystem und das Grafana-Analysesystem verwendet.
services: prometheus: image: prom/prometheus container_name: prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' ports: - 9090:9090 restart: unless-stopped volumes: - ./prometheus:/etc/prometheus - prom_data:/prometheus grafana: image: grafana/grafana container_name: grafana ports: - 3000:3000 restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=grafana volumes: - ./grafana:/etc/grafana/provisioning/datasources volumes: prom_data:
Die Projektstruktur muss in diesem Beispiel wie folgt aussehen:
. ├── compose.yaml ├── grafana │ └── datasource.yml ├── prometheus │ └── prometheus.yml └── README.md
2.2 Bereitstellung von Anwendungen mit mehreren Containern #
Nach dem Erstellen der richtigen Verzeichnisstruktur und der Datei compose.yml
können Sie die Multi-Container-Anwendung bereitstellen:
Vergewissern Sie sich, dass der Container, den Sie ausführen möchten, nicht bereits existiert:
>
podman ps --allEntfernen Sie bei Bedarf den jeweiligen Container:
>
podman rm -f CONTAINER_IDStarten Sie die Multi-Container-Anwendung, indem Sie das folgende Kommando in dem Verzeichnis ausführen, in dem sich
compose.yml
befindet:>
docker compose up -ddocker-compose erstellt ein separates Netzwerk für die Multi-Container-Anwendung.
Sie können überprüfen, ob die Container ausgeführt werden und die Ports zugeordnet sind, indem Sie die laufenden Container auflisten:
>
podman ps
3 Verwaltung einer Multi-Container-Anwendung #
Nachdem Sie Ihre Multi-Container-Anwendung erstellt haben, können Sie mit dem Kommando docker-compose
Verwaltungsvorgänge durchführen. Die Kommandosyntax lautet wie folgt:
>
docker compose [OPTIONS]COMMAND
Führen Sie das Kommando von demselben Verzeichnis aus, in dem sich die Datei compose.yml
der Multi-Container-Anwendung befindet, die Sie verwalten möchten. Alternativ können Sie auch einen Pfad zu der Datei compose.yml
mit der Option -f, --file
angeben. Beispielsweise zum Beenden und Entfernen der Multi-Container-Anwendung:
>
docker compose -f ./test/compose.yml down
Weitere nützliche Kommandos:
- images
zum Auflisten aller Images, die von den Containern in der Multi-Container-Anwendung verwendet werden.
>
docker compose images- pause
zum Anhalten aller Container.
>
docker compose pause [SERVICE]- ps
zum Auflisten von Containern in der Multi-Container-Anwendung.
>
docker compose ps- rm
zum Entfernen gestoppter Container.
>
docker compose rm- start/stop
zum Starten oder Stoppen von Containern.
>
docker compose stop [SERVICE]
Führen Sie für eine vollständige Liste der Optionen und Kommandos das folgende Kommando aus:
>
docker-compose --help
4 Rechtliche Hinweise #
Copyright © 2006–2024 SUSE LLC und Mitwirkende. Alle Rechte vorbehalten.
Es wird die Genehmigung erteilt, dieses Dokument unter den Bedingungen der GNU Free Documentation License, Version 1.2 oder (optional) Version 1.3 zu vervielfältigen, zu verbreiten und/oder zu verändern; die unveränderlichen Abschnitte hierbei sind der Urheberrechtshinweis und die Lizenzbedingungen. Eine Kopie dieser Lizenz (Version 1.2) finden Sie in Abschnitt „GNU Free Documentation License“.
Die SUSE Marken finden Sie im https://www.suse.com/company/legal/. Alle anderen Marken von Drittanbietern sind Besitz ihrer jeweiligen Eigentümer. Markensymbole (®, ™ usw.) kennzeichnen Marken von SUSE und ihren Tochtergesellschaften. Sternchen (*) kennzeichnen Marken von Drittanbietern.
Alle Informationen in diesem Buch wurden mit größter Sorgfalt zusammengestellt. Auch hierdurch kann jedoch keine hundertprozentige Richtigkeit gewährleistet werden. Weder SUSE LLC noch ihre Tochtergesellschaften noch die Autoren noch die Übersetzer können für mögliche Fehler und deren Folgen haftbar gemacht werden.