Wenn Sie Docker eine Weile verwenden, haben Sie wahrscheinlich bereits einen einfachen und effektiven Workflow, der auf Sie zugeschnitten ist und einige Ihrer bevorzugten Docker-Befehle enthält (Unterbefehle, um technisch korrekt zu sein).
Früher habe ich zum Beispiel Container, die nicht ausgeführt werden, mit einem langen Befehl entfernt, der so aussieht:docker container rm $(docker container ps -qf status=exited)
, es funktionierte und gab offensichtlich einen Fehler aus, wenn es keine baumelnden Container gab. Dies hörte eines Tages auf, als ich herausfand, dass wir auch eine prune
haben Unterbefehl für Container! Jetzt ist dieser lange Befehl also zu einem einfachen docker container prune
geworden .
Der Punkt ist, dass, obwohl viele von uns Docker schon seit einiger Zeit verwenden, die Möglichkeit besteht, dass einige Dinge im Laufe der Zeit übersehen oder vielleicht sogar vergessen wurden.
In diesem Artikel werde ich Ihnen drei Docker-Unterbefehle geben, die für Sie neu sein könnten oder die Sie nicht oft verwenden, aber ich denke, Sie sollten es tun.
Diese Unterbefehle können auch eigene Unterbefehle enthalten.
1. Der System-Unterbefehl
Docker hat ein system
Befehl, der Ihnen etwas gibt Informationen auf Systemebene in Bezug auf Docker. Sie verwenden tatsächlich schon seit einiger Zeit einen seiner Unterbefehle. Merken Sie sich docker info
? Dieser Befehl ist eigentlich docker system info
.
Um mehr über diesen Unterbefehl und seine Möglichkeiten zu erfahren, führen Sie --help
aus Option darauf.
➟ docker system --help
Usage: docker system COMMAND
Manage Docker
Commands:
df Show docker disk usage
events Get real time events from the server
info Display system-wide information
prune Remove unused data
Run 'docker system COMMAND --help' for more information on a command.
Lassen Sie uns jeden dieser Unterbefehle durchgehen, da ich denke, dass sie alle sehr kritisch sind.
Docker-System-df
Waren Sie jemals in einer Situation, in der der Speicherplatz Ihres Servers fast voll zu sein schien? Um zu überprüfen, ob es sich um die Container (laufende/volumes) handelt, haben Sie wahrscheinlich den du
verwendet Befehl direkt auf der Datenwurzel.
Mit du
auf dem Datenstamm erfordert sudo
Zugriff.
✗ du -h --max-depth=1 /var/lib/docker
du: cannot read directory '/var/lib/docker': Permission denied
4.0K /var/lib/docker
Nicht nur das, um explizit zu wissen, wie viel die Volumes oder die Images zuordnen, müssten Sie den Befehl mehrmals ausführen.
➟ sudo du -h --max-depth=0 /var/lib/docker/volumes && \
sudo du -h --max-depth=0 /var/lib/docker/image && \
sudo du -h --max-depth=0 /var/lib/docker/
Eine viel bessere Alternative ist der Aufruf des docker system df
Befehl. Dadurch wird der Datenstamm automatisch erkannt und alle Informationen zur Festplattennutzung durch Docker-Container, -Images und -Volumes entsprechend gedruckt.
Hier ist, was mein aktuelles System zeigt (es ist eine neue Installation)
➟ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 1 84.17MB 84.17MB (100%)
Containers 1 1 8.219MB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Docker-Systembereinigung
Wenn Sie jemals (1) alle ungenutzten Netzwerke, (2) baumelnde Images, (3) angehaltene Container, (4) alle ungenutzten Volumes entfernen wollten, besteht eine große Chance, dass Sie vier separate Befehle verwendet haben oder daran gewöhnt sind, dies zu erreichen Arbeit.
docker network prune && \
docker image prune && \
docker volume prune && \
docker container prune
Falls Sie zuvor nichts über container prune
wussten wie ich dann wird der Befehl noch größer. Zu unserem Glück kann all dies mit nur einem einfachen Befehl erledigt werden, nämlich docker system prune --volumes
.
Standardmäßig docker system prune
entfernt die Volumes nicht, dafür müssen Sie --volumes
verwenden Möglichkeit. Dieser Befehl löscht zusätzlich auch den Build-Cache für Sie.
Sie können das -f
verwenden Option, um die (manchmal) lästige Eingabeaufforderung zu vermeiden. Siehe das Beispiel unten:
➟ docker system prune --volumes -f
Deleted Containers:
672d39c1a78969887f411ce9139e74e5b21c31fccf2bcf8c1190a9e166089ede
Deleted Networks:
Example
SSHnet
Dummy
Deleted Volumes:
dummy
Total reclaimed space: 0B
Weitere Optionen sind -a
das alle unbenutzten Bilder entfernt, nicht nur die baumelnden.
Docker-Systemereignisse
Dieser Befehl ist vielleicht nicht immer nützlich, aber ich denke, jeder sollte sich dessen bewusst sein.
docker system events
oder docker events
kurz gibt Ihnen Echtzeit-Ereignisse direkt für den Docker-Daemon (dockerd
). Dies kann bei der Überwachung bestimmter Ereignisse helfen, beispielsweise wenn ein Bild entfernt wurde.
Sehen Sie sich den Screenshot unten an, um dies besser zu verstehen.
2. Der Kontext-Unterbefehl
Dies ist ein weiterer schöner Unterbefehl, den meines Wissens nicht viele kennen. Ein Kontext für die Ausführung eines beliebigen Docker-Befehls besteht aus einigen Schlüssel-Wert-Paaren, die den Endpunkt, den Host, möglicherweise eine Konfigurationsdatei usw. umfassen, aber nicht darauf beschränkt sind.
Sobald Sie einen Kontext erstellt haben, kann er später wiederverwendet werden.
Einer der größten praktischen Anwendungsfälle, insbesondere für mich, war das Erstellen separater Kontexte für die einzelnen Server, auf denen Docker ausgeführt wird. Da sich der Großteil meiner Arbeit darum dreht, verwende ich, anstatt mich jedes Mal beim Server anzumelden, meinen lokalen Client mit dem Remove-Docker-Server über SSH.
So richten Sie den Fernzugriff auf den Docker-Daemon ein [Ausführliche Anleitung]Sie möchten nicht per SSH auf den Remote-Server zugreifen und dann Docker-Befehle ausführen? Sie können einen Remote-Docker-Zugriff einrichten, der auch andere Vorteile bietet. Linux-Handbuch Debdut ChakrabortyLassen Sie mich Ihnen zeigen, wie ich dies mit Docker-Kontexten erreiche.
Zuerst habe ich einen Server auf Linode bereitgestellt, auf dem Docker läuft. Wenn ich ohne Kontexte auf den Remote-Docker-Daemon zugreifen würde, würde ich einen Befehl wie den folgenden verwenden
➟ docker --host ssh://[email protected]:7770 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
Um also auf den Remote-Daemon zuzugreifen, müsste ich entweder docker
aliasieren an docker --host ssh://[email protected]:7770
, oder verwenden Sie eine Umgebungsvariable DOCKER_HOST
. Diese erschweren aber den Wechsel zu anderen Hosts sehr. Eine einfachere Alternative besteht darin, einfach einen Kontext zu erstellen.
Der folgende Befehl erstellt einen Kontext namens remote
, für einen Docker-Endpunkt mit einem anderen Host als dem lokalen.
docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
Die Ausgabe sieht so aus:
➟ docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
remote
Successfully created context "remote"
Jetzt können Sie entweder das -c
verwenden Option mit docker
Wenn Sie etwas schnell überprüfen möchten oder für wiederholte Operationen, ändern Sie den Kontext in diesen neuen.
Mit dem -c
Möglichkeit:
➟ docker -c remote ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
Verwenden Sie im docker context use [CONTEXT_NAME]
:
➟ docker context use remote
remote
Current context is now "remote"
~
➟ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
Um aus dem Kontext herauszukommen, verwenden Sie use
Unterbefehl mit default
für den Kontextnamen:
➟ docker context use default
default
Current context is now "default"
~
➟ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3. Der Unterbefehl Pause &Fortsetzen
Große Bereitstellungen (Anwendungen) sind jetzt in mehrere Komponenten unterteilt, besser bekannt als Microservices. Wenn Sie sie mit etwas wie Docker-Compose bereitstellen, passiert es manchmal, dass eine Komponente vor der/denjenigen gestartet wird, von der sie abhängt. Dies ist ein Problem, da diese Komponente nicht gestartet werden kann, da ihre Abhängigkeit (oder Abhängigkeiten) noch nicht gestartet wurde.
Sie können dieses Problem entschärfen, indem Sie Neustartrichtlinien in Docker verwenden, aber sie verhindern nicht, dass das Protokoll mit fehlgeschlagenen Versuchen überschwemmt wird. Was ich am Anfang gemacht habe, war einfach den Container/Dienst zu stoppen, bis die Abhängigkeit vollständig hochgefahren ist.
Eine bessere Möglichkeit besteht darin, den Container einfach für eine Weile anzuhalten, und sobald die erforderlichen Dienste erfolgreich ausgeführt wurden, können Sie den Container wieder anhalten, und alles wird von dort aus weitergehen.
Obwohl Container schnell hochfahren, ist dies eine noch schnellere Möglichkeit, einem solchen Problem zu begegnen.
Die Syntax für pause
und unpause
ist ganz einfach.
docker pause [CONTAINER_NAME|ID]
docker unpause [CONTAINER_NAME|ID]
Damit ist dieser Artikel vorerst abgeschlossen. Wenn ich weitere solche Befehle nützlich oder interessant finde, werde ich diesen Artikel entsprechend aktualisieren.
Haben Sie einen Docker-Befehl, der Ihrer Meinung nach auf dieser Liste hätte stehen sollen? Lass es mich in den Kommentaren unten wissen.