Docker/Buch/03 Grundlagen/Administration

Aus Foxwiki
Wechseln zu:Navigation, Suche

Administration

Dieser Abschnitt gibt einen ersten Überblick über Kommandos, mit denen Sie Ihr Container-System administrieren können.

  • Zu solchen Verwaltungsaufgaben zählen beispielsweise das Auflisten und Löschen von Images, Containern und Volumes.
  • Eine detaillierte Beschreibung aller wichtigen docker-Kommandos folgt in Kapitel 7, »Kommandoreferenz«.
  • Selbstverständlich funktionieren alle im Folgenden beschriebenen Kommandos analog auch mit podman.

Platzbedarf von Images und Containern ermitteln Wie groß ist eigentlich der Platzbedarf für Images bzw. für den Container-Layer (also für die Daten eines Containers, die vom ursprünglichen Image abweichen)? Diese Frage beantworten die Kommandos docker images und docker ps -a -s. docker images liefert eine Liste aller heruntergeladenen bzw. selbst erzeugten Images samt Größenangabe:

docker images
REPOSITO R Y                          TAG        ...     CREATED           SIZE
wordpres s                            latest             17 hours ago      550 MB
mariadb                               latest             7 days ago        405 MB
phpmyadm i n / phpmyadmi n            latest             2 months ago      477 MB
...

docker ps listet standardmäßig nur die laufenden Container auf.

  • Die Option -a weitet die Ausgabe auf alle jemals eingerichteten Container aus. -s fügt die Spalte SIZE hinzu.
  • Sie gibt an, wie viel Platz die gegenüber dem Image geänderten Dateien beanspruchen.
  • Sofern die meisten veränderlichen Daten in einem Volume ausgelagert sind, ist der zusätzliche Platzbedarf oft winzig.
  • Wenn es aber Änderungen gibt, dann ist der tatsächliche Platzbedarf im lokalen Dateisystem oft spürbar größer, als docker ps vermuten lässt.
  • Das liegt am Overhead des Dateisystems bei der Speicherung vieler kleiner Dateien.

Die Informationen in Klammern (virtual) beziehen sich auf die Gesamtgröße des Containers inklusive der Read-only-Images.

  • Diese Daten sind insofern virtuell, als sich mehrere Container gemeinsame Images gleichsam teilen können.
docker ps -a -s
CONTAINE R ID            IMAGE                 ...     SIZE
2 bf9e954b 4 b 7         wordpress                     20.1 MB ( virtual 571 MB )
3 af937080 2 2 8         phpmyadmi n /...              70 B ( virtual 477 MB )
ac98aca3 7 f 7 a         mariadb                       2 B (virtual 405 MB )
...

Container und Images löschen

docker rm <id> bzw. docker rm <name> löscht den angegebenen Container.

  • Container- IDs und -Namen können Sie gegebenenfalls mit docker ps -a ermitteln.
docker rm ac98aca3 7f 7 a

Vorsicht

docker rm hat große Ähnlichkeiten mit dem klassischen rm-Kommando unter Linux: Es löscht ohne Rückfrage und ohne die Möglichkeit, die Operation rückgängig zu machen!

Das folgende Kommando erzeugt zuerst mit ps eine Liste aller IDs von Containern, die vom Image ubuntu abgeleitet sind.

  • Diese Liste wird an docker rm weitergegeben, um alle Container zu löschen.
  • Wenn Sie also eine Weile mit docker run ubuntu experimentiert haben, können Sie so alle bei dieser Gelegenheit erzeugten Container wieder löschen.
  • Die hier präsentierte Verkettung zweier Kommandos setzt voraus, dass eine Shell wie bash oder zsh verwendet wird, wie dies unter Linux oder macOS standardmäßig der Fall ist.
  • Unter Windows funktioniert das Kommando ebenfalls, sofern Sie die PowerShell verwenden.
docker rm $ ( docker ps -a -q -f ancestor = ubuntu )
Noch radikaler ist das nächste Kommando: Es löscht alle existierenden Container!
docker rm $ ( docker ps -aq )

docker rmi imagename löscht das angegebene Image.

  • Das ist nur möglich, wenn es keine von dem Image abgeleiteten Container gibt.
  • Die folgenden Kommandos löschen zuerst alle hello-world-Container und dann das hello-world-Image:
docker rm $ ( docker ps -a -q -f ancestor = hello - world )
docker rmi hello - world

Beachten Sie, dass docker rmi nur lokal ausgeführt wird.

  • Wenn Sie ein eigenes Image in den Docker Hub hochgeladen haben, bleibt das Image dort erhalten.
  • Sie können es bei Bedarf in der Weboberfläche von https://hub.docker.com löschen.

Volumes verwalten

Volumes werden getrennt von den Containern und Images in einem eigenen Verzeichnis gespeichert, unter Linux z. B. in /var/lib/docker/volumes.

  • Beim Löschen von Containern rührt Docker Volumes generell nicht an.
  • Sie können aber wie folgt eine

Liste mit den Namen oder IDs aller Volumes erstellen, zu denen der dazugehörende Container nicht mehr existiert:

docker volume ls -q -f dangling = true
4 df85efbf 1 2 40 b 7 4 29 f 7 b f 55 4 e 2 e ad 5 2 b 9 0a 1 9 3 4 87 5 d 5 7 77 3 c 1 c 80 c 4 0 5 d6 4 a
6 eec95274 4 a 21 b 5 5 c7 1 b 8 e 6d c 2 8 d a8 2 2 b f 3c 8 1 4 7 ed 5 4 3 5 1d c b 8 8 c3 0 0 9 4 eb 1 b
...

Die Größe der Volumes ermitteln Sie, indem Sie das obige Ergebnis an du weiterleiten. Das funktioniert in dieser Form allerdings nur auf einem Linux-Host.

  • Unter Windows und macOS werden die Docker-Dateien in einem eigenen Dateisystem innerhalb einer virtuellen Maschine gespeichert, auf die Sie von außen keinen direkten Zugriff haben.
sudo du -h --max 0 \
/ var / lib / docker / volumes / $ ( docker volume ls -q -f dangling = true )

Dabei müssen Sie den Ort angeben, wo die Volumes auf Ihrem System gespeichert werden.

  • Falls Sie Docker Desktop verwenden, befinden sich die Volumes in einer virtuellen Maschine.
/ var / lib / docker / volumes                                         (Docker Engine )
. 
  • local / share / docker / volumes (Rootless Docker )
. 
  • local / share / container s / storage / volumes (Podman )

Falls Sie mit Docker Desktop arbeiten, ist eine Bestimmung der Volume-Größe per Kommando nicht ohne Weiteres möglich.

  • Die Volumes befinden sich in WSL- Verzeichnissen (Windows) bzw. in einer virtuellen Maschine (macOS, Linux).
  • Aber dafür reicht nun ein Klick auf den Volumes-Tab in Docker Desktop aus, um diese Informationen zu ermitteln.

Alle verwaisten Volumes können Sie bei Bedarf mit dem folgenden Kommando löschen.

  • Die Rückfrage können Sie mit -f unterdrücken.
docker volume prune
WARNING ! This will remove all volumes not used by at least
one container . 
  • Are you sure you want to continue ? [ y /N ] y

Den Inhalt eines Volumes ansehen

Mitunter ist es riskant, ein Volume einfach zu löschen, wenn Sie sich nicht mehr genau erinnern können, wozu das Volume verwendet wurde.

  • Vielleicht befinden sich dort doch noch Daten, die Sie später brauchen.

Wenn Sie Docker Desktop bzw. Podman Desktop installiert haben, können Sie unkompliziert in Volumes »hineinsehen«, also wie in einem Dateimanager alle Verzeichnisse des Volumes öffnen und die dort gespeicherten Dateien auflisten (siehe Abbildung 3.4).

  • Den Inhalt der Dateien können Sie sich dabei leider nicht ansehen, aber Sie können einzelne Dateien in das Dateisystem Ihres Host-Computers übertragen und dann dort öffnen.

Abbildung 3.4 Blick in ein Volume in Docker Desktop

Wenn Sie ohne Docker Desktop arbeiten, gelingt der Blick in das Volume beinahe ebenso einfach: Dazu starten Sie einfach einen Container und binden das Volume dort ein.

  • In der Folge können Sie interaktiv alle Verzeichnisse erforschen.
  • Prinzipiell reicht für diesen Zweck ein Minimal-Image (z. B. Alpine Linux oder BusyBox).
  • Mehr Komfort, gerade bei der Vervollständigung von Dateiund Verzeichnisnamen, bietet aber ein Image, das die Shell bash enthält.
  • Wir haben deswegen im folgenden Beispiel mit Ubuntu gearbeitet.
docker run -it --rm -v 98 b95d8 ...:/ myvol ubuntu
 root # ls / myvol
 index . 
  • php wp - comments - post .
  • php wp - includes
 license . 
  • txt wp - config -docker .
  • php wp - links - opml .
  • php
 readme . 
  • html wp - config -sample .
  • php wp - load .
  • php
 wp - activate . 
  • php wp - config .php wp - login .
  • php
 ...
 root # cat / myvol /index .php
 ...
 root # exit

Anstatt das Volume interaktiv zu erforschen, können Sie auch find anwenden.

  • Dazu reicht das winzige busybox-Image aus:
docker run --rm -v 98 b95d8 ...:/ myvol busybox find / myvol

Zur Auswahl des Volumes müssen Sie seine vollständige ID (siehe docker volume ls) oder bei einem benannten Volume dessen Namen angeben.

  • Die ID haben wir in den obigen Beispielen nur aus Platzgründen verkürzt.

Gesamtüberblick Einen kompakten Überblick über den Speicherbedarf aller Images, Container, Volumes und des Build Caches gibt docker system df:

docker system df
TYPE                       TOTAL      ACTIVE   SIZE       RECLAIMAB L E
Images                     18         11       10.72 GB   1.854 GB (17%)
Containe r s               33         4        496 MB     495.9 MB (99%)
Local Volumes              2          1        169 MB     119.8 MB (70%)
Build Cache                0          0        0B         0B

Wenn Sie Docker schon lange in Betrieb haben und es entsprechend viele Images, Container und Volumes gibt, kann die Ausführung dieses Kommandos eine Weile dauern. Mit der zusätzlichen Option -v listet das Kommando sämtliche Images, Container, Volumes usw.

  • einzeln auf.

Ungenutzten Speicher freigeben Statt nach Images, Containern und Volumes zu suchen und sie einzeln zu löschen, können Sie für Ihre Aufräumarbeiten docker system prune zu Hilfe nehmen.

  • Dieses Kommando löscht alle gerade nicht laufenden Container sowie alle Images, die nicht von anderen Images benötigt werden (dangling images).

Noch intensiver wird der Großputz durch zusätzliche Optionen:

-a bzw. --all löscht auch Images, die nicht von Containern verwendet werden. --volumes löscht auch Volumes, die mit keinem Container verbunden sind. (Vorsicht!)

docker system prune -a --volumes

WARNING ! This will remove :

- all stopped container s
- all networks not used by at least one containe r
- all volumes not used by at least one containe r
- all images without at least one containe r associate d
to them
- all build cache
Are you sure you want to continue ? [ y / N ]

docker system prune ist bequem anzuwenden, schießt aber manchmal über das Ziel hinaus.

  • Sicherer ist es, in kleinen Schritten vorzugehen.
  • Die beiden folgenden Kommandos ermitteln zuerst alle Volumes, die nicht mehr in Verwendung sind.
  • Gegebenenfalls können Sie diese Volumes dann in einem zweiten Schritt löschen.
  • Beachten Sie die Option -q im zweiten Kommando, die die Ausgabe von docker volume ls auf die IDs verkürzt.
docker volume ls -f dangling = true
docker volume rm $ (docker volume ls -q -f dangling = true )
docker ps -a | grep Exit listet alle beendeten Container auf. 
  • Das zweite Kommando
extrahiert die erste Spalte mit den IDs aus der Liste und löscht diese Container:
docker ps -a | grep Exit
docker rm $ ( docker ps -a | grep Exit | cut -d ' ' -f 1)

Vielleicht gibt es einige Container, die Sie nicht löschen möchten.

  • Anstatt das obige Kommando auszuführen, eliminieren Sie dann mit grep -E -v zuerst alle Zeilen, die einen der durch | getrennten Suchbegriffe enthalten.
  • Wenn Sie mit der nun angezeigten Liste einverstanden sind, dann löschen Sie mit dem zweiten Kommando diese Container.
docker ps -a | grep Exit | grep -E -v 'mysql | mariadb '
docker rm $ ( docker ps -a | grep Exit | \
grep -E -v 'mysql | mariadb ' | cut -d ' ' -f 1)

Die folgenden beiden Kommandos listen zuerst alle Images auf, die von keinem Container verwendet werden, und löschen diese dann:

docker images -f dangling = true
docker rmi $ ( docker images -q -f dangling = true )