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.

18voto

Florent Punkte 1093

Die am meisten gewählte Antwort ist gut, es sei denn, Ihr Container ist kein tatsächliches Linux-System.

Viele Container (insbesondere die auf Go basierenden) haben keine Standard-Binärdatei (/bin/bash oder /bin/sh). In diesem Fall müssen Sie direkt auf die tatsächliche Datei des Containers zugreifen:

Funktioniert wie ein Charme:

name=
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId

Hinweis: Sie müssen es als Root ausführen.

18voto

piercebot Punkte 1708

Unter Ubuntu 14.04 mit Docker 1.3.1 habe ich das Container-Root-Dateisystem auf dem Host-Rechner im folgenden Verzeichnis gefunden:

/var/lib/docker/devicemapper/mnt//rootfs/

Vollständige Docker-Version Informationen:

Client-Version: 1.3.1
Client API-Version: 1.15
Go-Version (Client): go1.3.3
Git-Commit (Client): 4e9bbfa
OS/Arch (Client): linux/amd64
Server-Version: 1.3.1
Server API-Version: 1.15
Go-Version (Server): go1.3.3
Git-Commit (Server): 4e9bbfa

16voto

telamon Punkte 395

Ich verwende einen weiteren schmutzigen Trick, der aufs/devicemapper-agnostisch ist.

Ich schaue mir den Befehl an, den der Container ausführt, z.B. docker ps und wenn es ein Apache oder java ist, mache ich einfach folgendes:

sudo -s
cd /proc/$(pgrep java)/root/

und voilá, du bist im Container.

Im Grunde genommen kannst du als Root in den /proc//root/ Ordner cd'n, solange dieser Prozess vom Container ausgeführt wird. Vorsicht, Symbolic Links werden beim Verwenden dieses Modus keinen Sinn ergeben.

14voto

Raphael Punkte 7956

Keine der vorhandenen Antworten behandelt den Fall eines Containers, der beendet wurde (und nicht neu gestartet werden kann) und/oder kein Shell installiert hat (z. B. distroless). Dies funktioniert, solange Sie root-Zugriff auf den Docker-Host haben.

Für eine echte manuelle Prüfung ermitteln Sie zunächst die Layer-IDs:

docker inspect my-container | jq '.[0].GraphDriver.Data'

In der Ausgabe sollten Sie etwas ähnliches sehen wie

"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"

Navigieren Sie in diesem Ordner (als Root), um den aktuellen sichtbaren Zustand des Dateisystems des Containers zu finden.

9voto

LeYAUable Punkte 1038

Dies startet eine Bash-Sitzung für das Bild:

docker run --rm -it --entrypoint=/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