Ich habe bei Docker festgestellt, dass ich verstehen muss, was in einem Container passiert oder welche Dateien dort vorhanden sind. Ein Beispiel ist das Herunterladen von Bildern aus dem Docker-Index. Sie haben keine Ahnung, was das Bild enthält, sodass die Anwendung nicht gestartet werden kann.
Was ideal wäre, wäre in der Lage zu sein, in sie oder gleichwertig zu ssh. Gibt es ein Werkzeug, um dies zu tun, oder ist meine Konzeptualisierung von Docker falsch, wenn ich denke, dass ich dazu in der Lage sein sollte?
linux
docker
filesystems
user2668128
quelle
quelle
docker exec <container> bash
. Sie öffnen also einfach eine Hülle im Behälter.docker exec <container> ls <dir path>
unddocker exec <container> cat <file path>
. Für Bash fügen Sie jedoch die-it
Optionen hinzu.docker image save image_name > image.tar
, der in der Antwort von @ Gaurav24 angegebene ist.Antworten:
UPDATE
Einfachste Methode: Verwenden von Docker Exec
Docker Version 1.3 oder neuer unterstützt den Befehl
exec
, der sich ähnlich verhältnsenter
. Dieser Befehl kann einen neuen Prozess in einem bereits ausgeführten Container ausführen (in einem Container muss der PID 1-Prozess bereits ausgeführt werden). Sie können ausführen/bin/bash
, um den Containerstatus zu untersuchen:Siehe Dokumentation zur Docker-Befehlszeile
Alternative Methode 1
Schnappschuss
Sie können das Container-Dateisystem folgendermaßen auswerten:
Auf diese Weise können Sie das Dateisystem des laufenden Containers genau zum richtigen Zeitpunkt auswerten. Der Container läuft noch, zukünftige Änderungen sind nicht enthalten.
Sie können den Snapshot später löschen mit (Dateisystem des laufenden Containers ist nicht betroffen!):
Alternative Methode 2
ssh
Wenn Sie einen kontinuierlichen Zugriff benötigen, können Sie sshd in Ihrem Container installieren und den sshd-Daemon ausführen:
Auf diese Weise können Sie Ihre App mit ssh ausführen (verbinden und ausführen, was Sie möchten).
UPDATE: Alternative Methode 3
nsenter
Verwendung
nsenter
finden Sie unter https://web.archive.org/web/20160305150559/http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/quelle
Option 1
.RUN apk update && apk add bash
(Größe: ~ 4 MB)docker exec -t -i mycontainer /bin/sh
UPDATE: ENTDECKEN!
Mit diesem Befehl sollten Sie einen laufenden Docker-Container untersuchen können :
Das Äquivalent dazu in Docker-Compose wäre:
(Web ist in diesem Fall der Name des Dienstes und hat standardmäßig tty.)
Sobald Sie drinnen sind, tun Sie:
oder ein anderer Bash-Befehl wie:
Mit diesem Befehl sollten Sie ein Docker-Image untersuchen :
Einmal drinnen:
oder ein anderer Bash-Befehl wie:
Das
-it
steht für interaktiv ... und tty.Mit diesem Befehl können Sie einen laufenden Docker-Container oder ein laufendes Image überprüfen :
docker inspect name-of-container-or-image
Vielleicht möchten Sie dies tun und herausfinden, ob es welche gibt
bash
odersh
darin. Suchen Sie in der json-Rückgabe nach Entrypoint oder cmd.Siehe Docker Exec-Dokumentation
Siehe Docker-Compose Exec-Dokumentation
Siehe Docker-Inspektionsdokumentation
quelle
docker exec -ti <name> powershell
docker exec -ti <name> cmd
funktioniert. Und für andere Neulinge wie mich stellen Sie sicher, dass Sie den Namen der Containerinstanz vondocker ps
(so etwas wie 070494393ca5) anstelle des lesbaren Namens verwenden, den Sie ihm zugewiesen haben.Falls Ihr Container gestoppt ist oder keine Shell hat (z. B.
hello-world
im Installationshandbuch erwähnt oder nichtalpine
traefik
), ist dies wahrscheinlich die einzig mögliche Methode, um das Dateisystem zu erkunden.Sie können das Dateisystem Ihres Containers in einer TAR-Datei archivieren:
Oder listen Sie die Dateien auf:
Beachten Sie, dass es je nach Image einige Zeit und Speicherplatz dauern kann.
quelle
export
obigen Beispiels traf den Punkt:docker export adoring_kowalevski | tar tf -
f -
am Ende Ihres Befehls benötigen , tar liest standardmäßig von der Standardeingabe. Funktioniert einfachdocker export adoring_kowalevski | tar t
.tar f
hängt von der Konfiguration ab. Ein Teil ist dieTAPE
Umgebungsvariable. Andere werden als Teil des Builds gesteuert. Der Nettoeffekt ist, dass man niemals annehmen sollte, dass es stdin liest oder stdout schreibt, sondern es immer explizit angibt.Das Dateisystem des Containers befindet sich im Datenordner von Docker, normalerweise in / var / lib / docker. Gehen Sie wie folgt vor, um ein laufendes Container-Dateisystem zu starten und zu überprüfen:
Und jetzt ist das aktuelle Arbeitsverzeichnis das Stammverzeichnis des Containers.
quelle
Vor der Containererstellung:
Wenn Sie die Struktur des Bilds untersuchen möchten, das im Container montiert ist, können Sie dies tun
Dies gibt Ihnen die Sichtbarkeit aller Ebenen eines Bildes und seiner Konfiguration, die in JSON-Dateien vorhanden sind.
Nach der Containererstellung:
Dafür gibt es oben schon viele Antworten. Mein bevorzugter Weg, dies zu tun, wäre -
quelle
Die am besten bewertete Antwort funktioniert für mich, wenn der Container tatsächlich gestartet wird, aber wenn er nicht ausgeführt werden kann und Sie beispielsweise Dateien aus dem Container kopieren möchten, hat mich dies zuvor gespeichert:
Dank Docker CP ( Link ) können Sie direkt aus dem Container kopieren, wie es jeder andere Teil Ihres Dateisystems war. Beispiel: Wiederherstellen aller Dateien in einem Container:
Beachten Sie, dass Sie nicht angeben müssen, dass Sie rekursiv kopieren möchten.
quelle
Unter Ubuntu 14.04 unter Docker 1.3.1 fand ich das Container-Root-Dateisystem auf dem Host-Computer im folgenden Verzeichnis:
Vollständige Informationen zur Docker-Version:
quelle
devicemapper
Verzeichnis). Die Datei existiert unter/var/lib/docker/overlay/<a sha256 apparently/<upper or merged>/...
. Ich bin nicht sicher, wie portabel / sicher es ist, dort auf Dateien zuzugreifendirect-lvm
zum Beispiel funktioniert .Versuchen Sie es mit
Möglicherweise wird Bash nicht implementiert. dafür kannst du verwenden
quelle
Ich benutze einen anderen schmutzigen Trick, der aufs / devicemapper agnostisch ist.
Ich schaue auf den Befehl, dass der Container läuft, zB
docker ps
und wenn es ein Apache ist oderjava
ich mache einfach folgendes:und voilá du bist im Container.
Grundsätzlich können Sie als Root-CD in einen
/proc/<PID>/root/
Ordner, solange dieser Prozess vom Container ausgeführt wird. Beachten Sie, dass Symlinks in diesem Modus keinen Sinn ergeben.quelle
Die am häufigsten gewählte Antwort ist gut, es sei denn, Ihr Container ist kein tatsächliches Linux-System.
Viele Container (insbesondere die Go-basierten) haben keine Standard-Binärdatei (no
/bin/bash
or/bin/sh
). In diesem Fall müssen Sie direkt auf die eigentliche Containerdatei zugreifen:Klappt wunderbar:
Hinweis: Sie müssen es als root ausführen.
quelle
In meinem Fall wurde außer im Shell keine Shell unterstützt
sh
. Das hat also wie ein Zauber gewirktquelle
Sie können tauchen, um den Bildinhalt interaktiv mit TUI anzuzeigen
https://github.com/wagoodman/dive
quelle
Dadurch wird eine Bash-Sitzung für das Bild gestartet:
Docker run --rm -it --entrypoint = / bin / bash
quelle
Für mich funktioniert dieses gut (dank der letzten Kommentare für den Hinweis auf das Verzeichnis / var / lib / docker / ):
Hier ist 2465790aa2c4 die kurze ID des laufenden Containers (wie von Docker ps angezeigt ), gefolgt von einem Stern.
quelle
In neueren Versionen von Docker können Sie ausführen,
docker exec [container_name]
wobei eine Shell in Ihrem Container ausgeführt wirdUm eine Liste aller Dateien in einem Container zu erhalten, führen Sie sie einfach aus
docker exec [container_name] ls
quelle
Für Docker aufs Treiber:
Das Skript findet das Container-Stammverzeichnis (Test auf Docker 1.7.1 und 1.10.3).
quelle
Keine der vorhandenen Antworten bezieht sich auf den Fall eines Containers, der beendet wurde (und nicht neu gestartet werden kann) und / oder auf dem keine Shell installiert ist (z. B. notleidende). Dieser funktioniert, solange Sie Root-Zugriff auf den Docker-Host haben.
Ermitteln Sie für eine echte manuelle Überprüfung zuerst die Layer-IDs:
In der Ausgabe sollten Sie so etwas sehen
Navigieren Sie in diesen Ordner (als Root), um den aktuell sichtbaren Status des Container-Dateisystems zu ermitteln.
quelle
Diese Antwort hilft denjenigen (wie mir), die das Docker-Volume-Dateisystem erkunden möchten, auch wenn der Container nicht ausgeführt wird.
Liste laufender Docker-Container:
docker ps
=> CONTAINER ID "4c721f1985bd"
Sehen Sie sich die Docker-Volume-Mount-Punkte auf Ihrem lokalen physischen Computer an ( https://docs.docker.com/engine/tutorials/dockervolumes/ ):
docker inspect -f {{.Mounts}} 4c721f1985bd
=> [{/ tmp / container-garren / tmp true rprivate}]
Dies sagt mir, dass das lokale physische Maschinenverzeichnis / tmp / container-garren dem Docker-Volume-Ziel / tmp zugeordnet ist.
Wenn ich das lokale Verzeichnis der physischen Maschine (/ tmp / container-garren) kenne, kann ich das Dateisystem untersuchen, ob der Docker-Container ausgeführt wird oder nicht. Dies war entscheidend, um herauszufinden, dass es einige Restdaten gab, die auch nach dem Ausführen des Containers nicht hätten bestehen dürfen.
quelle
Ein weiterer Trick besteht darin, das Atom- Tool zu verwenden, um Folgendes zu tun:
Das Docker-Image wird an / path / to / mnt gemountet, damit Sie es überprüfen können.
quelle
Nur für LINUX
Der einfachste Weg, den ich benutze, war die Verwendung von proc dir, dh dem Container, der ausgeführt werden muss, um die Docker-Container-Dateien zu überprüfen.
Ermitteln Sie die Prozess-ID (PID) des Containers und speichern Sie sie in einer Variablen
Stellen Sie sicher, dass der Containerprozess ausgeführt wird, und verwenden Sie den Variablennamen, um in den Containerordner zu gelangen
Wenn Sie mit diesem langen Befehl durch das Verzeichnis gelangen möchten, ohne die PID-Nummer herauszufinden
Tipps:
Nachdem Sie den Container betreten haben, wirkt sich alles, was Sie tun, auf den tatsächlichen Prozess des Containers aus, z. B. das Beenden des Dienstes oder das Ändern der Portnummer.
Ich hoffe es hilft
Hinweis:
Diese Methode funktioniert nur, wenn der Container noch ausgeführt wird. Andernfalls würde das Verzeichnis nicht mehr existieren, wenn der Container gestoppt oder entfernt wurde
quelle
Mein bevorzugter Weg, um zu verstehen, was im Container vor sich geht, ist:
-p 8000 aussetzen
Starten Sie den Server darin
quelle
Für einen bereits laufenden Container können Sie Folgendes tun:
Sie müssen root sein, um in dieses Verzeichnis zu cd. Wenn Sie nicht root sind, versuchen Sie 'sudo su', bevor Sie den Befehl ausführen.
Bearbeiten: Nach v1.3 sehen Sie Jiris Antwort - es ist besser.
quelle
Wenn Sie Docker v19.03 verwenden, führen Sie die folgenden Schritte aus.
quelle
Wenn Sie den AUFS-Speichertreiber verwenden, können Sie mein Docker-Layer- Skript verwenden, um den Dateisystemstamm (mnt) und die Readwrite -Ebene eines Containers zu finden:
Edit 2018-03-28:
Docker-Layer wurde durch Docker-Backup ersetzt
quelle
Der
docker exec
Befehl zum Ausführen eines Befehls in einem laufenden Container kann in mehreren Fällen hilfreich sein.Beispielsweise :
1) Zugriff in Bash auf das laufende Container-Dateisystem:
2) Zugriff in Bash auf das laufende Container-Dateisystem als Root, um die erforderlichen Rechte haben zu können:
Dies ist besonders nützlich, um eine Verarbeitung als Root in einem Container durchführen zu können.
3) Zugriff in Bash auf das laufende Container-Dateisystem mit einem bestimmten Arbeitsverzeichnis:
quelle
Sie können eine Bash im Container ausführen, indem Sie Folgendes ausführen:
$ docker run -it ubuntu /bin/bash
quelle