Hereinspaziert: Docker-Container im laufenden Betrieb untersuchen

Einen Docker-Container zu starten fällt leicht. Doch was, wenn die darin ausgeführte Anwendung nicht wie gewünscht funktioniert? Einen Container im laufenden Betrieb zu untersuchen, scheint auf den ersten Blick nahezu unmöglich. Ein kleines Werkzeug schafft Abhilfe.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 4 Min.
Von
  • Golo Roden

Einen Docker-Container zu starten fällt leicht. Doch was, wenn die darin ausgeführte Anwendung nicht wie gewünscht funktioniert? Einen Container im laufenden Betrieb zu untersuchen, scheint auf den ersten Blick nahezu unmöglich. Ein kleines Werkzeug schafft Abhilfe.

Funktioniert eine Anwendung nicht wie gewünscht, untersucht man sie üblicherweise mit den integrierten Werkzeugen des Betriebssystems und einem Debugger. Das funktioniert allerdings ausschließlich dann, wenn man entweder direkten Zugriff auf die Anwendung oder eine Möglichkeit für das Remote-Debugging vorgesehen hat.

Führt man eine Anwendung innerhalb eines Docker-Containers aus, fehlt in der Regel beides. Der direkte Zugriff ist nach dem Start des Containers nicht möglich. Einzig die Anweisung

$ docker attach <container>

führt halbwegs in die gewünschte Richtung. Zusätzlich lassen sich mit den Anweisungen

$ docker inspect <container>

und

$ docker logs <container>

verschiedene Metadaten und die Protokolle des angegebenen Containers ausgeben. Das ist hilfreich, bietet aber nicht den gewünschten Komfort. Um das Remote-Debugging steht es noch schlechter: Wurde es dem Container bei dessen Erstellung nicht explizit hinzugefügt, lässt es sich im Nachhinein auch nicht aktivieren. Daher müsste man den Container von Grund auf neu erstellen.

Häufig wird der Einsatz eines SSH-Dämons als Lösung angesehen. Das wirft aber verschiedene Probleme auf, unter anderem in Bezug auf Sicherheitsaktualisierungen und die Schlüsselverwaltung. Daher raten auch die Entwickler von Docker in dem Blogeintrag "Why you don't need to run SSHd in your Docker containers" vom Einsatz eines SSH-Dämons ab.

Eine deutlich bessere Lösung stellt das Werkzeug nsenter dar, das in dem Paket util-linux enthalten ist. In Bezug auf Docker ermöglicht es das Betreten eines Containers im laufenden Betrieb. Da die Installation von nsenter das Kompilieren von Hand unter bestimmten Voraussetzungen erfordert, stellt der Entwickler Jérôme Petazzoni unter dem Namen jpetazzo/nsenter ein Docker-Image zur Verfügung, das die Aufgabe übernimmt.

So wird die Installation auf den einmaligen Start eines Containers reduziert. Das Installationsziel übergibt man dem Container dabei als Volume unter dem Pfad /target. Um nsenter beispielsweise in das lokale Verzeichnis /usr/local/bin zu installieren, genügt dann der folgende Aufruf:

$ docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

Die Angabe des Parameters --rm sorgt dafür, dass der Container nach der erfolgten Installation entsorgt wird und nicht als unnötiger Datenmüll im System verbleibt.

Nach kurzer Wartezeit steht anschließend die Anweisung nsenter zur Verfügung, die neben einigen weiteren Parametern vor allem die Angabe der Prozess-ID des zu untersuchenden Containers erfordert. Sie lässt sich der bereits erwähnten Anweisung docker inspect ermitteln:

$ PID=$(docker inspect --format {{.State.Pid}} <container>)
$ nsenter --target $PID --mount --uts --ipc --net --pid

Etwas mehr Komfort bietet das gemeinsam mit nsenter installierte Werkzeug docker-enter, das die beiden Schritte automatisch ausführt und eine Konsole innerhalb des Containers startet:

$ docker-enter <container>

Alternativ nimmt die Anweisung zusätzlich ein Kommando entgegen, das innerhalb des Containers ausgeführt werden soll. So ist es beispielsweise möglich, eine Liste aller derzeit im Container ausgeführten Prozesse zu erhalten:

$ docker-enter <container> ps -ax

Die Werkzeuge nsenter und docker-enter bieten eine einfache, aber leistungsfähige Möglichkeit, um Container im laufenden Betrieb zu untersuchen. Da die Installation ihrerseits mit Hilfe von Docker erfolgt, kann dabei kaum etwas fehlschlagen.

Wer mit einer virtuellen Maschine für die Entwicklung arbeitet, kann die Installation bereits beim Provisionieren ausführen, sodass die Werkzeuge anschließend jedem Entwickler zur Verfügung stehen.

tl;dr: Das Werkzeug nsenter aus dem Paket util-linux dient dazu, laufende Container zu betreten. Der Container jpetazzo/nsenter bietet eine einfache Installation und enthält außerdem das Komfort-Werkzeug docker-enter. ()