Wie man den docker compose up Befehl zur Container-Verwaltung nutzt

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie Container effektiv mit dem Befehl docker compose up verwalten. Wir behandeln die grundlegende Verwendung von docker compose up, um Dienste zu starten, die in einer docker-compose.yml-Datei definiert sind, einschließlich des Betriebs von Diensten im Vordergrund und im Detached-Modus.

Darüber hinaus werden Sie erweiterte Optionen von docker compose up erkunden, wie das Erzwingen der Neuerstellung von Containern mit force-recreate, das Verhindern unnötiger Neuerstellungen mit no-recreate und das automatische Erstellen von Images vor dem Starten von Containern. Am Ende dieses Labs werden Sie in der Lage sein, docker compose up für verschiedene Container-Management-Szenarien sicher anzuwenden.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555096{{"Wie man den docker compose up Befehl zur Container-Verwaltung nutzt"}} docker/ps -.-> lab-555096{{"Wie man den docker compose up Befehl zur Container-Verwaltung nutzt"}} docker/stop -.-> lab-555096{{"Wie man den docker compose up Befehl zur Container-Verwaltung nutzt"}} docker/rm -.-> lab-555096{{"Wie man den docker compose up Befehl zur Container-Verwaltung nutzt"}} docker/build -.-> lab-555096{{"Wie man den docker compose up Befehl zur Container-Verwaltung nutzt"}} end

Dienste mit docker compose up starten

In diesem Schritt lernen Sie, wie Sie Dienste, die in einer docker-compose.yml-Datei definiert sind, mit dem Befehl docker compose up starten. Bevor wir beginnen, müssen wir Docker Compose installieren, da es in dieser Umgebung nicht vorinstalliert ist.

Zuerst installieren wir Docker Compose. Wir laden die neueste stabile Version herunter und machen sie ausführbar.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Nachdem Docker Compose installiert ist, erstellen wir eine einfache docker-compose.yml-Datei, um einen Dienst zu definieren. Wir erstellen eine Datei namens docker-compose.yml in Ihrem ~/project-Verzeichnis.

nano ~/project/docker-compose.yml

Fügen Sie folgenden Inhalt zur Datei hinzu:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Diese docker-compose.yml-Datei definiert einen einzelnen Dienst namens web. Sie verwendet das Image nginx:latest und mappt Port 80 auf dem Host zu Port 80 im Container.

Nun verwenden wir docker compose up, um den Dienst zu starten. Navigieren Sie zum Verzeichnis ~/project und führen Sie den Befehl aus.

cd ~/project
docker compose up

Sie sehen eine Ausgabe, die anzeigt, dass Docker Compose den web-Container erstellt und startet. Standardmäßig läuft docker compose up im Vordergrund und zeigt die Logs der laufenden Dienste an.

Um zu überprüfen, ob der Nginx-Container läuft, können Sie ein neues Terminal öffnen oder curl verwenden, um auf den Webserver zuzugreifen.

curl http://localhost

Sie sollten die HTML-Ausgabe der standardmäßigen Nginx-Begrüßungsseite sehen. Dies bestätigt, dass der web-Dienst läuft und erreichbar ist.

Um die Dienste zu stoppen, drücken Sie Strg+C im Terminal, in dem docker compose up ausgeführt wird. Dadurch werden die Container gestoppt und entfernt.

Dienste im Detached-Modus ausführen

Im vorherigen Schritt haben Sie die Dienste mit docker compose up im Vordergrund gestartet. Dies ist nützlich für Debugging-Zwecke, aber für den Produktiveinsatz oder Hintergrundbetrieb sollten Sie den Detached-Modus verwenden.

Der Detached-Modus bedeutet, dass Docker Compose die Container startet und sich dann beendet, während die Container im Hintergrund weiterlaufen. Dadurch können Sie Ihr Terminal weiterhin für andere Aufgaben nutzen.

Um die Dienste im Detached-Modus zu starten, fügen Sie einfach das -d-Flag zum docker compose up-Befehl hinzu. Stellen Sie sicher, dass Sie sich im ~/project-Verzeichnis befinden, wo Ihre docker-compose.yml-Datei liegt.

cd ~/project
docker compose up -d

Sie sehen eine Ausgabe, die anzeigt, dass die Container erstellt und gestartet werden, aber der Befehl bringt Sie zurück zur Terminal-Eingabeaufforderung, sobald die Dienste laufen.

Um zu überprüfen, ob der Container im Hintergrund läuft, können Sie den Befehl docker ps verwenden, um die laufenden Container aufzulisten.

docker ps

Sie sollten einen Eintrag für den project-web-1-Container sehen (der Name folgt typischerweise dem Schema [Verzeichnisname]-[Dienstname]-[Instanznummer]).

Sie können weiterhin mit curl auf den Nginx-Webserver zugreifen, um die Funktionsfähigkeit zu bestätigen.

curl http://localhost

Sie sollten erneut die HTML-Ausgabe der standardmäßigen Nginx-Begrüßungsseite sehen.

Um die im Detached-Modus gestarteten Dienste zu stoppen, können Sie den Befehl docker compose down im selben Verzeichnis wie Ihre docker-compose.yml-Datei verwenden.

docker compose down

Dieser Befehl stoppt und entfernt die Container, Netzwerke und Volumes, die durch docker compose up erstellt wurden.

Container mit force-recreate neu erstellen

Im vorherigen Schritt haben Sie gelernt, wie man Dienste im Detached-Modus ausführt. Standardmäßig erstellt Docker Compose die Container nicht neu, wenn Sie docker compose up erneut mit der gleichen docker-compose.yml-Datei ausführen und die Container bereits laufen - es sei denn, es gab Änderungen an der Dienstdefinition (wie z.B. am Image oder den Ports).

Manchmal möchten Sie Docker Compose zwingen, die Container zu stoppen und neu zu erstellen, selbst wenn keine Änderungen an der Dienstdefinition vorliegen. Dies kann nützlich sein, um Updates anzuwenden, die keine Änderung der docker-compose.yml-Datei erfordern, oder einfach um einen frischen Start für den Container zu gewährleisten.

Um die Neuerstellung der Container zu erzwingen, können Sie das --force-recreate-Flag mit dem docker compose up-Befehl verwenden.

Stellen Sie zunächst sicher, dass Ihr web-Dienst wie im vorherigen Schritt im Detached-Modus läuft. Falls nicht, führen Sie aus:

cd ~/project
docker compose up -d

Nun führen wir docker compose up erneut mit dem --force-recreate-Flag aus:

cd ~/project
docker compose up -d --force-recreate

Sie sehen eine Ausgabe, die anzeigt, dass Docker Compose den web-Container stoppt und neu erstellt. Obwohl sich die docker-compose.yml-Datei nicht geändert hat, weist das --force-recreate-Flag Docker Compose an, den bestehenden Container abzubauen und einen neuen basierend auf der aktuellen Konfiguration zu erstellen.

Sie können überprüfen, ob der Container neu erstellt wurde, indem Sie die Container-ID mit docker ps vergleichen. Die Container-ID sollte sich von der vor der Ausführung des Befehls mit --force-recreate unterscheiden.

docker ps

Notieren Sie sich die Container-ID in der Ausgabe.

Um aufzuräumen, stoppen Sie die laufenden Dienste:

cd ~/project
docker compose down

Neuerstellung mit no-recreate verhindern

Im vorherigen Schritt haben Sie gelernt, wie Sie die Neuerstellung von Containern mit dem --force-recreate-Flag erzwingen können. Nun betrachten wir das gegenteilige Szenario: das Verhindern der Neuerstellung.

Wie bereits erwähnt, erstellt docker compose up standardmäßig keine Container neu, wenn sie bereits laufen und ihre Konfiguration in der docker-compose.yml-Datei unverändert ist. Es gibt jedoch Situationen, in denen Sie explizit sicherstellen möchten, dass bestehende Container nicht neu erstellt werden, selbst wenn kleinere Änderungen vorgenommen wurden, die normalerweise eine Neuerstellung auslösen würden.

Um die Neuerstellung von Containern zu verhindern, können Sie das --no-recreate-Flag mit dem docker compose up-Befehl verwenden.

Stellen Sie zunächst sicher, dass Ihr web-Dienst gestoppt ist. Falls er läuft, stoppen Sie ihn mit:

cd ~/project
docker compose down

Nun starten wir den Dienst mit docker compose up -d:

cd ~/project
docker compose up -d

Überprüfen Sie, ob der Container läuft:

docker ps

Notieren Sie sich die Container-ID.

Führen Sie nun docker compose up erneut mit dem --no-recreate-Flag aus:

cd ~/project
docker compose up -d --no-recreate

Sie sehen eine Ausgabe, die anzeigt, dass der Dienst aktuell ist und der Container nicht neu erstellt wird. Wenn Sie erneut docker ps ausführen, werden Sie feststellen, dass die Container-ID dieselbe wie zuvor ist.

docker ps

Dies zeigt, dass das --no-recreate-Flag erfolgreich verhindert hat, dass Docker Compose den bestehenden Container neu erstellt.

Zum Aufräumen stoppen Sie die laufenden Dienste:

cd ~/project
docker compose down

Images vor dem Start von Containern erstellen

In den vorherigen Schritten haben wir vorgefertigte Docker-Images von Docker Hub (wie nginx:latest) verwendet. Häufig müssen Sie jedoch eigene benutzerdefinierte Docker-Images für Ihre Anwendungen erstellen.

Docker Compose kann automatisch Images erstellen, die in Ihrer docker-compose.yml-Datei definiert sind, bevor die Dienste gestartet werden. Dies erfolgt typischerweise durch Angabe eines build-Kontexts anstelle eines image-Namens für einen Dienst.

Passen wir unsere docker-compose.yml-Datei an, um ein einfaches benutzerdefiniertes Nginx-Image zu erstellen.

Erstellen Sie zunächst ein neues Verzeichnis namens nginx_custom in ~/project:

cd ~/project
mkdir nginx_custom

Erstellen Sie nun eine Dockerfile im nginx_custom-Verzeichnis:

nano ~/project/nginx_custom/Dockerfile

Fügen Sie folgenden Inhalt zur Dockerfile hinzu:

FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' >/usr/share/nginx/html/index.html

Diese Dockerfile basiert auf dem offiziellen nginx:latest-Image und ersetzt die standardmäßige index.html-Datei durch eine benutzerdefinierte Version.

Ändern Sie nun Ihre ~/project/docker-compose.yml-Datei, um diese Dockerfile für den Build des web-Service-Images zu verwenden. Öffnen Sie die Datei zur Bearbeitung:

nano ~/project/docker-compose.yml

Passen Sie die web-Service-Definition an, um build statt image zu verwenden:

version: "3.8"
services:
  web:
    build: ./nginx_custom
    ports:
      - "80:80"

Wenn Sie nun docker compose up ausführen, wird Docker Compose zunächst das Image erstellen, das durch die Dockerfile im ./nginx_custom-Verzeichnis definiert ist, und dann einen Container mit diesem neu erstellten Image starten.

Stellen Sie sicher, dass Sie sich im ~/project-Verzeichnis befinden, und führen Sie aus:

cd ~/project
docker compose up -d

Sie sehen eine Ausgabe, die anzeigt, dass Docker Compose das Image erstellt und anschließend den Container erzeugt und startet.

Um zu überprüfen, ob die benutzerdefinierte Nginx-Seite ausgeliefert wird, verwenden Sie curl:

curl http://localhost

Sie sollten die Ausgabe <h1>Hello from Custom Nginx!</h1> sehen, was bestätigt, dass das Image erstellt wurde und der Container mit dem benutzerdefinierten Inhalt läuft.

Zum Aufräumen stoppen Sie die laufenden Dienste:

cd ~/project
docker compose down

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Befehl docker compose up zur Verwaltung von Containern verwenden. Sie begannen mit der Installation von Docker Compose und der Erstellung einer einfachen docker-compose.yml-Datei, um einen Webdienst mit dem Nginx-Image zu definieren. Anschließend nutzten Sie docker compose up, um den Dienst zu starten, wobei Sie beobachteten, dass er standardmäßig im Vordergrund läuft und Container-Logs anzeigt. Sie überprüften den laufenden Dienst durch den Zugriff auf die Nginx-Willkommensseite.

Das Lab führte auch das Ausführen von Diensten im Detached-Modus mit dem -d-Flag ein, wodurch der Befehl beendet werden kann, während die Container im Hintergrund weiterlaufen. Sie lernten, wie Sie die Neuerstellung von Containern auch bei unveränderter Konfiguration mit dem --force-recreate-Flag erzwingen und wie Sie die Neuerstellung bestehender Container mit dem --no-recreate-Flag verhindern können. Abschließend erkundeten Sie das --build-Flag, um Images vor dem Start der Container zu erstellen oder neu zu erstellen, wodurch sichergestellt wird, dass das neueste Image verwendet wird.