Docker-Container stoppen, ohne alles durcheinander zu bringen!

Schwierigkeiten mit dem Stoppen von Docker-Containern? Das Finden des richtigen Wegs, um einen Container zu stoppen, ist schwierig, wenn Sie viele verschiedene Container erstellen können. In diesem Artikel lernen Sie Docker-Befehle zum Stoppen eines Containers oder aller Container kennen.

Lesen Sie weiter, um mehr zu erfahren!

Voraussetzungen

Um diesem Tutorial zu folgen, stellen Sie sicher, dass Sie Folgendes haben:

  • Windows 10 – Das Tutorial verwendet Windows, um Docker auszuführen, aber Sie können dieselben allgemeinen Schritte auch auf Linux oder macOS anwenden.
  • Docker Desktop – Dieses Tutorial verwendet Version 3.5.2. Der Docker Engine ist verfügbar, wenn Sie Linux verwenden, da die GUI nicht verfügbar ist.
  • A running Docker container or containers.

Beenden von Containern mit dem Docker stop Containers-Befehl

Lassen Sie uns mit dem ersten Befehl beginnen: dem docker stop-Befehl für Container und wie er das Stoppen von Containern ermöglicht.

Zum Beispiel müssen Sie möglicherweise einen laufenden Container mit dem Namen mystifying_hofstadter und einer ID von fb66ed502096 stoppen. Wie im folgenden Beispiel gezeigt, stoppen Sie den Container mit dem docker stop-Befehl für Container.

# Stoppen Sie den Container über den Namen
docker stop mystifying_hofstadter
# Stoppen Sie den Container über die ID (gleicher Container)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

Was ist, wenn Sie mehrere laufende Container haben und diese stoppen möchten? Der Befehl docker stop unterstützt das Stoppen mehrerer Container-IDs, jeweils einzeln.

Zuerst listen Sie alle Container über den Befehl docker ps auf und übergeben Sie die Container-IDs an den Befehl docker stop, wie unten gezeigt.

# Alle laufenden Container auflisten
docker ps
# Stoppen Sie die folgenden Docker-Container über die Container-ID
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

Was ist, wenn Sie alle laufenden Container stoppen möchten, ohne die Container-IDs manuell abzurufen und an docker stop zu übergeben? Der Befehl docker ps -q wird das erreichen. Der Parameter -q des Befehls docker ps gibt nur die IDs der Container aus.

# Erstellen Sie drei Container. Ein Semikolon trennt jeden Befehl
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# Alle laufenden Container auflisten
docker ps -q
# Holen Sie alle laufenden Container-IDs ab und übergeben Sie diese an docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

Die $(docker ps -q)-Konstruktion oben ist ein Unter-Ausdruck sowohl in Bash auf Linux als auch in PowerShell auf Windows. Ein Unter-Ausdruck weist die Shell an, einen Satz von Befehlen, docker ps -q, zuerst zu verarbeiten und dann die Ergebnismenge an den ursprünglichen Befehl docker stop zurückzugeben.

Der Befehl docker stop containers verwendet das SIGTERM-Signal. Linux-Signale informieren einen Prozess über ein Ereignis, aber es liegt am Prozess zu entscheiden, wie auf ein gegebenes Signal reagiert wird.

Bei Verwendung des SIGTERM-Signals verwendet Docker das Signal, um einen Prozess gnädig zu stoppen, indem es standardmäßig 10 Sekunden wartet, bevor es das SIGKILL-Signal sendet, das den Prozess sofort beendet.

Stoppen eines Containers mit Prozesssignalen

Sie haben etwas über das Standardverhalten von Docker (Stoppsignal) gelernt, mit dem docker stop-Befehl, wenn Sie einen Container stoppen. Aber Sie möchten möglicherweise nicht das Standardverhalten. Stattdessen können Sie Docker anweisen, alternative Stopp-Signale zu verwenden.

Mit der --stop-signal-Option des docker run-Befehls können Sie das Stoppsignal beim Starten des Containers festlegen. Diese Option legt das Signal fest, das an den laufenden Container gesendet wird, wenn Sie ihn stoppen möchten.

Im folgenden Beispiel nimmt der --stop-signal-Schalter den Wert SIGQUIT an, der Docker mitteilt, das SIGQUIT-Signal zu senden, wenn es Zeit ist, den Container zu stoppen. Das Beispiel verwendet auch die folgenden Parameter:

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “Bildname” – Welches Docker-Image soll für den Container bereitgestellt werden, in diesem Fall das ubuntu-Image.
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

Sie können das Stoppsignal auch über eine Dockerfile angeben, die Docker mitteilt, wie ein Container erstellt werden soll. Sie können im Dockerfile einen Eintrag hinzufügen, der das Stoppsignal mit STOPSIGNAL SIGQUIT angibt, zum Beispiel. Sie können das SIGQUIT mit jedem gewünschten Stoppsignal austauschen.

Containers sofort beenden mit docker kill

Es wird Zeiten geben, in denen Sie Container sofort beenden möchten, ohne ihnen eine Gnadenfrist zu gewähren. Der docker kill-Befehl stoppt einen Container sofort.

Das folgende Beispiel übergibt den Container mit der ID 2aa318273db5 an docker kill. Der Container wird sofort über das SIGKILL-Signal beendet. Dem Container wird kein gnädiger Ausgang gewährt. Als Ergebnis des Befehls wird der Container beendet, und die ID des Containers wird angezeigt.

docker kill 2aa318273db5

Alle Container mit dem Befehl docker kill $(docker ps -q) beenden. Beachten Sie, dass (docker ps -q) hier ein Unterdrückungsausdruck ist.

Einen Container stoppen und entfernen mit docker rm

Standardmäßig wird beim Erstellen eines Containers dieser Container genauso wie zuvor erstellt: Er ist idempotent. Das Entfernen eines Containers hat minimale Auswirkungen, und mit diesem Gedanken im Hinterkopf kann docker rm einen Container erzwingend stoppen und entfernen. Docker sendet ein SIGKILL-Signal an den Hauptprozess und entfernt den Container aus der Liste der verfügbaren Container auf Ihrer Docker-Installation.

Wenn der Container die geänderten internen Dateien behalten muss oder sein Zustand beibehalten werden muss, werden durch das Entfernen eines Containers diese Änderungen zerstört. Achten Sie auf mögliche Probleme!

In folgendem Beispiel haben Sie möglicherweise einen Container gestartet, dem der Name kind_galileo zugewiesen wurde. Bevor ein Container entfernt werden kann, muss der Container gestoppt werden, wie unten gezeigt. Der Befehl docker ps -a zeigt den Status Exited für den Beispielcontainer an.

Listing all containers, including stopped containers.

Jetzt, da der Container gestoppt ist, wird das Ausführen des Befehls docker rm den Container vollständig entfernen.

docker rm kind_galileo

Anstatt den Container zu stoppen, um ihn dann zu entfernen, wird die Kombination aus --force und docker rm den Container in einer einzigen Operation stoppen und entfernen. Der Container laughing_elion steht nicht mehr zur Verfügung, um ausgeführt zu werden.

docker rm --force laughing_elion

Wenn Sie den Befehl --force nicht angeben, erhalten Sie die Fehlermeldung Error response from daemon: You cannot remove a running container...

Stopping and removing a container.

Stoppen von Docker-Containern mit Docker Compose

Docker-Befehle werden normalerweise auf einem einzelnen Container verwendet, aber Sie können einen Dienst mit mehreren Containern erstellen, die zusammenarbeiten. Das Docker Compose-Tool ermöglicht es Ihnen, einen Dienst zu konfigurieren, der aus mehreren Containern besteht, die zusammenarbeiten.

Da die Container innerhalb eines Dienstes darauf ausgelegt sind, zusammenzuarbeiten, ist es am besten, den gesamten Dienst selbst anzuhalten, anstatt einzelne Container.

Wenn Sie einen Dienst mit mehreren Containern ausführen, wird [docker-compose stop] den Dienst anhalten, ohne die Container oder den Dienst zu entfernen. Folgen Sie unten, um einen Docker Compose-Dienst zu erstellen, den Dienst zu starten und ihn letztendlich ordnungsgemäß zu beenden.

1. Erstellen Sie ein Verzeichnis, um Ihre Konfigurationsdatei zu speichern. In diesem Beispiel wird das Verzeichnis C:\Articles\Ubuntu die Datei speichern.

mkdir C:\Articles\Ubuntu

2. Erstellen Sie anschließend die Datei docker-compose.yml mit folgender Konfiguration. Die unten stehende Docker Compose-Datei erstellt einen Dienst mit zwei Ubuntu-Containern, und wenn sie gestartet werden, beenden sich die Container nicht sofort.

# Die Spezifikationsversion von docker-compose
version: "3.9"
# Die Sammlung von Anwendungen, die diesen Dienst zusammensetzen
services:
  # Erster Ubuntu-Container
  container1:
    image: ubuntu
    # Gleich wie die -t-Option und weist ein Pseudo-TTY zu, damit der Container nicht sofort beendet wird.
    tty: true
  # Zweiter Ubuntu-Container
  container2:
    image: ubuntu
    tty: true

3. In einer Terminalsession navigieren Sie zum Verzeichnis Ihrer benutzerdefinierten Docker-Konfigurationsdatei, das in diesem Beispiel C:\Artikel\Ubuntu ist. Führen Sie docker-compose up -d aus, um den Dienst zu generieren und im Hintergrund gemäß der -d-Option zu starten.

Starting a Docker Compose service.

4. In derselben Terminalsession und im selben Verzeichnis geben Sie den Befehl docker-compose stop ein, um den Dienst und die Container ordnungsgemäß zu beenden.

Stopping a Docker Compose service.

Der docker-compose-Befehl hat, ähnlich wie der docker-Befehl, auch die Parameter rm --force und kill. Die docker-compose-Parameter wirken auf den Dienst anstelle eines einzelnen Containers. Der Befehl docker-compose kill akzeptiert auch die Option -s, um das Stoppsignal anzugeben.

Zusammenfassung

Docker-Container sind ein leistungsstarkes Werkzeug zur Erstellung einzigartiger und segmentierter Umgebungen für Entwicklung und Produktion. In diesem Artikel haben Sie verschiedene Möglichkeiten gelernt, wie Docker einen oder mehrere Container, sogar alle, stoppt. Sie haben auch das Standard-Stoppsignal von Docker und dessen Änderung kennengelernt.

Mit diesem Wissen kennen Sie nun die Feinheiten des Stopps von Docker-Containern und wie Sie Fehler vermeiden können, wenn es Zeit ist, laufende Container zu stoppen. Wie planen Sie, Ihre Container ab sofort zu stoppen, nachdem Sie dieses neu gefundene Wissen haben?

Source:
https://adamtheautomator.com/docker-stop-containers/