Dies ist Teil zwei einer zweiteiligen Serie über die Arbeit mit Docker-Containern. Im ersten Teil haben wir uns auf die vielen Möglichkeiten und Optionen für die Ausführung eines Images konzentriert und wie der Host mit einem Docker-Container interagieren kann.
In diesem Teil behandeln wir das Auflisten, Starten, Stoppen und Neustarten von Containern sowie das Ausführen von Befehlen zum Ausführen von Containern. Insbesondere lernen Sie den Unterschied zwischen laufenden und gestoppten (exitierten) Containern kennen und erfahren, wie Sie die Informationen und die Anzeige beim Filtern und Formatieren Ihrer Container genau steuern können.
Dann erhalten Sie praktische Erfahrungen beim Stoppen, Starten, Neustarten und Anhängen an Ihre Container. Schließlich führen Sie einmalige Befehle aus und erhalten interaktiven Shell-Zugriff auf einen laufenden Container.
Stellen Sie vor dem Start sicher, dass Docker in Ihrer Umgebung ordnungsgemäß installiert ist. Abhängig von der Installation und Ihrem Benutzer müssen Sie es möglicherweise als sudo ausführen. Ich werde das Sudo überspringen.
Wenn Sie mit Containern arbeiten, möchten Sie Ihre Container häufig auflisten, anzeigen und filtern. Das Docker ps
Befehl ist der Schlüssel, und es gibt mehrere interessante Optionen.
Der grundlegendste Befehl ist einfach Docker ps
ohne Argumente, die alle aktuell ausgeführten Container anzeigt.
$ docker ps CONTAINER ID BILDBEFEHL ERSTELLT STATUS PORTS NAMES 2f542e1cb88b nginx "nginx -g 'daemon…" 12 Stunden vor 12 Stunden 443 / tcp, 0.0.0.0:9000->80/tcp nginx
Sie erhalten zu jedem Container viele Informationen, einschließlich der Container-ID, des Images, des Befehls, des Erstellungszeitpunkts, des aktuellen Status, der Ports und der Namen. Aufgrund der Verpackung ist es etwas schwierig zu analysieren. Wir werden später sehen, wie die Ausgabe gefiltert und formatiert wird. Beachten Sie, dass der Befehl (sowie die Container-ID) abgeschnitten wird. Um den vollständigen Befehl anzuzeigen, fügen Sie hinzu --no-trunc
:
$ docker ps --no-trunc IMAGE COMMAND nginx "nginx -g 'Daemon off;'"
Nun ist der vollständige Befehl sichtbar: nginx -g 'Daemon off;'
Wie Sie sich erinnern, hält Docker die Container in der Nähe (es sei denn, Sie haben sie mit ausgeführt --rm
). Hinzufügen -ein
zeigt alle Container:
$ dockerps -a CONTAINER ID BILDSTATUSNAMEN cc797c61dc21 busybox Exited busybox 67f3cb5a9647 busybox Exited
Die Ausgabe von Docker ps
kann zu ausführlich sein und zeigt oft viele Felder, die nicht interessant sind. Sie können die Formatierung von Go-Vorlagen verwenden, um nur die Felder anzuzeigen, an denen Sie interessiert sind. Hier werden nur der Name und der Befehl angezeigt:
$ docker ps --no-trunc --format '.Names \ t . Command' nginx "nginx -g 'Daemon aus;'"
Das funktioniert, aber um es mit den Feldnamen zu präsentieren, fügen Sie am Anfang der Formatzeichenfolge "Tabelle" hinzu:
$ docker ps -a --no-trunc --format 'Tabelle .Names \ t . Befehl' NAMES COMMAND busybox "cat /data/1.txt" ecstatic_jones "cat / data / 1. txt "hopeful_spence" / hallo "infallible_curie" ls -la "nginx" nginx -g 'daemon off;' "
Der Formatname für die Container-ID (hier nicht ausgewählt) lautet .ICH WÜRDE
(alle Kappen).
Das Docker ps
Befehl unterstützt viele Filter. Sie sind ziemlich einfach zu bedienen. Die Syntax lautet -f "
. Unterstützte Filter sind ID, Label, Name, Exit, Status, Vorfahr, vor, seit, Isolation, Netzwerk und Integrität.
Hier wird nach Containernamen gefiltert und nur der busybox-Container angezeigt:
$ docker ps -a -f "name = busybox" \ --format 'Tabelle .ID \ t . Status \ t . Names' CONTAINER-ID-STATUS-NAMEN cc797c61dc21 Beendet (0) Vor 11 Minuten busybox
Wenn Sie nur die Container-ID wünschen, verwenden Sie die -q Flagge
(leise Flagge). Es ist einfacher als --Format 'Tabelle .ID'
. Dies ist häufig erforderlich, wenn Sie Vorgänge für mehrere Container ausführen möchten (ein Beispiel finden Sie später)..
$ docker ps -aq cc797c61dc21 67f3cb5a9647 898fb562e535 6dd210fda2d8 2f542e1cb88b
Sie können das Ausführen von Containern beenden und einen gestoppten Container starten. Es gibt verschiedene Unterschiede zwischen dem Starten eines angehaltenen Containers und dem Ausführen einer neuen Instanz desselben Images:
Lass uns aufhören nginx Container und starten Sie es. Wenn Sie auf einen Container verweisen, können Sie dessen Namen oder ein eindeutiges Präfix seiner ID verwenden. Ich benenne normalerweise meine langlebigen Container, damit ich ein aussagekräftiges Handle habe und mich nicht mit den automatisch generierten Namen von Docker oder den ID-Präfixen von Containern beschäftigen muss.
$ docker stop nginx nginx $ docker ps -a -f "name = nginx" --format 'Tabelle .Names \ t . Status' NAMES STATUS nginx Exited (0) vor 2 Minuten
OK. Nginx ist gestoppt (Status ist "Exited"). Beginnen wir damit:
$ docker start nginx nginx $ docker ps -a -f "name = nginx" --format 'Tabelle .Names \ t . Status' NAMENSTATUS nginx Bis zu 33 Sekunden
Ein Neustart eines laufenden Containers ist eine weitere Option, die der entspricht Andockhaltestelle
gefolgt von Docker-Start
.
$ docker startet nginx neu
nginx $ docker ps -a -f "name = nginx" --format 'Tabelle .Names \ t . Status' NAMES STATUS nginx Bis zu 2 Sekunden
Wenn Sie einen gestoppten Container starten oder wenn Sie den Container im getrennten Modus ausgeführt haben (-d
Befehlszeilenargument), Sie können die Ausgabe nicht sehen. Aber man kann sich daran anschließen.
$ docker attach nginx 172.17.0.1 - - [19 / Mar / 2017: 08: 40: 03 +0000] "HEAD / HTTP / 1.1" 200 0 "-" "HTTPie / 0.8.0" "-"
Sie können angehaltene Container mit dem Befehl entfernen: docker rm
$ docker rm ecstatic_jones ecstatic_jones
Wenn Sie einen laufenden Container entfernen möchten, können Sie ihn entweder anhalten oder den -f
(Force) Befehlszeilenargument:
$ docker rm -nginx Fehlerantwort vom Daemon: Sie können einen laufenden Container 3dbffa955f906e427298fbeb3eadfd229d64365dd880c9771a31b0aedb879d6d nicht entfernen. Stoppen Sie den Container vor dem Entfernen oder verwenden Sie -f $ docker rm -f -nginx nginx
Wenn Sie alle Container entfernen möchten, finden Sie hier einen schönen Ausschnitt:
Docker RM -f $ (Docker ps -aq)
Wenn Sie nur den angehaltenen Container entfernen möchten, entfernen Sie das -f
(Kraft-) Flagge.
Docker führt einen einzelnen Prozess in einem Container aus. Sie können jedoch zusätzliche Befehle für einen laufenden Container ausführen. Es ist sehr ähnlich, einen benutzerdefinierten Befehl an die Dockerlauf
Befehl, außer dass in diesem Fall der Befehl run nebeneinander ausgeführt wird.
Das Ausführen eines einfachen Befehls erfolgt über docker exec
. Sie geben eine laufende Container-ID oder einen laufenden Namen und den Befehl an, den Sie ausführen möchten. Schauen wir uns das an nginx.conf Datei in der nginx Container und sehen Sie, wie viele Arbeitsprozesse konfiguriert sind.
$ docker exec nginx cat /etc/nginx/nginx.conf | grep worker_processes worker_processes 1;
Eine der besten Problembehandlungstechniken bei Docker-Containern besteht darin, eine Verbindung zu einer interaktiven Shell herzustellen und einfach das interne Dateisystem zu erkunden. Um anzubringen stdin und habe eine tty, Sie müssen das zur Verfügung stellen -i -t
Befehlszeilenargumente (können als gruppiert werden -es
) und dann den Namen einer ausführbaren Shell-Datei (normalerweise bash).
Am Ende erhalten Sie Shell-Zugriff auf Ihren Container. Hier ist ein Beispiel für die interaktive Überprüfung der Worker-Prozesse innerhalb des Containers.
$ docker exec -it nginx bash root @ b010e854bb98: / # cat /etc/nginx/nginx.conf | grep worker_processes worker_processes 1; root @ b010e854bb98: / #
Docker ist eine leistungsstarke Plattform, und da der Container seine Arbeitseinheit ist, bietet er viele Tools zum Verwalten und Arbeiten mit Containern. Ich habe die wichtigsten Aspekte der Arbeit mit Containern beschrieben, aber es gibt viele weitere erweiterte Funktionen, Optionen und Nuancen zu den Befehlen, die ich behandelt habe, sowie einige zusätzliche Befehle.
Wenn Sie eng mit Docker-Containern arbeiten, nehmen Sie sich die Zeit, um einzutauchen und alles über sie zu erfahren. Es wird sich gut auszahlen.