1073 Stimmen

Erforschung des Dateisystems des Docker-Containers

Ich habe mit Docker festgestellt, dass ich verstehen muss, was drinnen in einem Container passiert oder welche Dateien darin existieren. Ein Beispiel ist das Herunterladen von Images aus dem Docker-Index - man hat keine Ahnung, was das Image enthält, daher ist es unmöglich, die Anwendung zu starten.

Was ideal wäre, ist die Möglichkeit, sich per SSH einzuloggen oder Ähnliches. Gibt es ein Tool dafür, oder ist meine Vorstellung von Docker falsch, wenn ich denke, dass ich das tun können sollte.

1101voto

Jiri Punkte 15939

Hier sind ein paar verschiedene Methoden...

A) Verwenden Sie docker exec (am einfachsten)

Docker Version 1.3 oder neuer unterstützt den Befehl exec, der ähnlich wie nsenter funktioniert. Dieser Befehl kann einen neuen Prozess in einem bereits laufenden Container ausführen (der Container muss bereits einen PID 1 Prozess ausführen). Sie können /bin/bash ausführen, um den Zustand des Containers zu erkunden:

docker exec -t -i mycontainer /bin/bash

siehe Docker Befehlszeilendokumentation

B) Verwenden Sie Snapshots

Sie können das Dateisystem des Containers auf diese Weise auswerten:

# ID Ihres laufenden Containers finden:
docker ps

# Erstellen Sie ein Image (Snapshot) des Dateisystems des Containers
docker commit 12345678904b5 mysnapshot

# Durchsuchen Sie dieses Dateisystem mit bash (zum Beispiel)
docker run -t -i mysnapshot /bin/bash

Auf diese Weise können Sie das Dateisystem des laufenden Containers zu einem bestimmten Zeitpunkt auswerten. Der Container läuft immer noch, zukünftige Änderungen sind nicht enthalten.

Sie können den Snapshot später löschen (das Dateisystem des laufenden Containers wird nicht beeinträchtigt!):

docker rmi mysnapshot

C) Verwenden Sie ssh

Wenn Sie kontinuierlichen Zugriff benötigen, können Sie sshd in Ihren Container installieren und den sshd-Daemon ausführen:

docker run -d -p 22 mysnapshot /usr/sbin/sshd -D

# Sie müssen herausfinden, an welchen Port Sie sich anschließen sollen:
docker ps

Auf diese Weise können Sie Ihre App über ssh ausführen (verbinden und ausführen, was Sie möchten).

D) Verwenden Sie nsenter

Verwenden Sie nsenter, siehe Warum Sie in Ihren Docker-Containern kein SSHd ausführen müssen

Die Kurzfassung lautet: Mit nsenter können Sie eine Shell in einen vorhandenen Container erhalten, auch wenn dieser Container kein SSH oder einen speziellen Daemon ausführt

437voto

Khalil Gharbaoui Punkte 5559

UPDATE: ERKUNDUNG!

Mit diesem Befehl kannst du einen laufenden Docker-Container erkunden:

docker exec -it name-of-container bash

Das Äquivalent dafür in Docker-Compose wäre:

docker-compose exec web bash

(web ist der Name des Dienstes in diesem Fall und es hat standardmäßig tty.)

Einmal drinnen, führe aus:

ls -lsa

oder irgendeinen anderen Bash-Befehl wie:

cd ..

Mit diesem Befehl kannst du ein Docker-Image erkunden:

docker run --rm -it --entrypoint=/bin/bash name-of-image

einmal drinnen, führe aus:

ls -lsa

oder irgendeinen anderen Bash-Befehl wie:

cd ..

Das -it steht für interaktiv... und tty.


Mit diesem Befehl kannst du einen laufenden Docker-Container oder ein Image inspizieren:

docker inspect name-of-container-or-image

Du könntest das tun und herausfinden, ob darin ein bash oder sh vorhanden ist. Suche nach dem Eintragspunkt oder der Befehlsliste im JSON-Output.

HINWEIS: Diese Antwort setzt voraus, dass gewöhnliche Tools vorhanden sind, aber falls kein bash-Shell oder gewöhnliche Tools wie ls vorhanden sind, könntest du zuerst einen in einer Schicht hinzufügen, wenn du Zugang zur Dockerfile hast: Beispiel für Alpine:

RUN apk add --no-cache bash

Ansonsten, wenn du keinen Zugriff auf die Dockerfile hast, kopiere einfach die Dateien aus einem neu erstellten Container und schaue sie dir durch, indem du folgendes machst:

docker create   # gibt die Container-ID zurück, der Container wird nie gestartet.
docker cp : 
docker rm 
cd  && ls -lsah

Siehe Docker exec Dokumentation

Sehe Docker-Compose exec Dokumentation

Sehe Docker inspect Dokumentation

Sehe Docker create Dokumentation

240voto

Ilya Murav'jov Punkte 2517

Falls Ihr Container gestoppt ist oder keine Shell hat (z.B. hello-world in der Installationsanleitung erwähnt, oder nicht-alpine traefik), ist dies wahrscheinlich die einzige mögliche Methode, um das Dateisystem zu erkunden.

Sie können das Dateisystem Ihres Containers in eine Tar-Datei archivieren:

docker export adoring_kowalevski > contents.tar

Oder die Dateien auflisten:

docker export adoring_kowalevski | tar t

Beachten Sie, dass je nach Image etwas Zeit und Festplattenspeicher benötigt werden könnte.

64voto

Julius Printz Punkte 741

Die am meisten hochgewertete Antwort funktioniert für mich, wenn der Container tatsächlich gestartet ist, aber wenn es nicht möglich ist, ihn auszuführen und man beispielsweise Dateien aus dem Container kopieren möchte, hat mir folgendes schon einmal geholfen:

docker cp : 

Dank docker cp (link) können Sie direkt aus dem Container kopieren, als wäre es ein Teil Ihres Dateisystems. Zum Beispiel, um alle Dateien innerhalb eines Containers wiederherzustellen:

mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/

Beachten Sie, dass Sie nicht angeben müssen, dass Sie rekursiv kopieren möchten.

58voto

Gaurav Ingalkar Punkte 1177

Vor Containererstellung:

Wenn Sie die Struktur des Bildes erkunden möchten, das innerhalb des Containers gemountet ist, können Sie Folgendes tun

sudo docker image save image_name > image.tar
tar -xvf image.tar

Dies würde Ihnen die Sichtbarkeit aller Schichten eines Bildes und seiner Konfiguration geben, die in JSON-Dateien enthalten sind.

Nach der Containererstellung:

Dafür gibt es bereits viele Antworten oben. Mein bevorzugter Weg, dies zu tun, wäre -

docker exec -t -i container /bin/bash

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X