Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
documentation.suse.com / Verwalten von Multi-Container-Anwendungen mit docker-compose

Verwalten von Multi-Container-Anwendungen mit docker-compose

Veröffentlicht: 12.12.2024
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:

  1. Führen Sie folgenden Befehl aus:

    > sudo transactional-update pkg install podman*
  2. 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:

  1. Installieren Sie das Paket podman-docker mit dem Kommando:

    transactional-update pkg install podman-docker
  2. 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.

Wichtig
Wichtig: 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:

  1. Führen Sie folgendes Kommando aus:

    > sudo transactional-update pkg install docker-compose
  2. Nach 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:

  1. Erstellen Sie die Konfigurationsdatei compose.yml. Detaillierte Informationen finden Sie in Abschnitt 2.1, „Erstellen von compose.yml.

  2. Bereiten Sie die erforderliche Verzeichnisstruktur vor. Wir empfehlen, die Datei compose.yml ganz oben in Ihrem Arbeitsverzeichnis abzulegen.

  3. 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.

  4. 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 in configs 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:

  1. Vergewissern Sie sich, dass der Container, den Sie ausführen möchten, nicht bereits existiert:

    > podman ps --all

    Entfernen Sie bei Bedarf den jeweiligen Container:

    > podman rm -f CONTAINER_ID
  2. Starten Sie die Multi-Container-Anwendung, indem Sie das folgende Kommando in dem Verzeichnis ausführen, in dem sich compose.yml befindet:

    > docker compose up -d

    docker-compose erstellt ein separates Netzwerk für die Multi-Container-Anwendung.

  3. 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