Debugging Docker

Docker ist eine feine Sache, doch die Fehlersuche gestaltet sich hin und wieder zum Albtraum, da der Container zunÀchst mal irgendwie nicht greifbar ist - insbesondere nicht, wenn er nicht mehr lÀuft. Die Fehlersuche hat mich anfangs vor ein ziemliches Problem gestellt und dazu bewogen, die Docker-Konzepte zunÀchst mal ansatzweise zu verstehen. Nichtsdestotrotz stand ich auch danach erst mal wie der Ochs vorm Berg.


Container lÀuft noch

Wenn ein Docker Container nicht schon beim Start stirbt oder gleich nach dem Start beendet wird (weil nur ein paar Befehle ausgefĂŒrt werden), dann ist die Fehlersuche schon mal einfacher.

Logs anschauen

Per docker logs myContainer kann man sich die Logs des Container anschauen - das funktioniert auch mit nicht mehr laufenden Containern (siehe docker ps -a).

Befehle im Container

Per docker exec -it myRunningContainer bash kann man sich eine Shell im Container ergattern und ein wenig rumschnĂŒffeln.

Installation von Tools

Problematisch finde ich, daß in den meisten Images nicht mal die einfachsten Tools (z. B. less) verfĂŒgbar sind (natĂŒrlich nicht, denn die Images sind i. a. minimal). Die Nutzung von Analyse-Tools ist somit erst gar nicht möglich.

Allerdings lassen sich diese Tools on-the-fly nachinstallieren. Hierzu öffnet man eine Konsole im Container (docker exec -it myRunningContainer bash) und installiert die Software (z. B. apt-get install telnet) mit dem jeweiligen Paketmanager.

Konfiguration anschauen

Mitdocker inspect myContainer erhĂ€lt man Informationen ĂŒber den Container - das funktioniert auch mit nicht mehr laufenden Containern (siehe docker ps -a).

docker events

Per

docker events

erhÀlt man auf der Konsole zusÀtzliche Informationen wie diese:

137 pfh@workbench ~ % docker events                                                                                                                                     :(
2016-09-12T13:25:39.211049880+02:00 container create 55260...
	(image=mobi3006/glassfish:3.1.2.2, name=nostalgic_bohr)
2016-09-12T13:25:39.212171664+02:00 container attach 55260...
	(image=mobi3006/glassfish:3.1.2.2, name=nostalgic_bohr)
2016-09-12T13:25:39.230392314+02:00 network connect fdd42...
	(container=55260..., name=bridge, type=bridge)
2016-09-12T13:25:39.233426688+02:00 volume mount ffadc...
	(container=55260..., destination=/mnt/containerContributions/artifacts, driver=local, propagation=, read/write=true)
2016-09-12T13:25:39.233447617+02:00 volume mount e3ebb...
	(container=55260..., destination=/mnt/containerContributions/config, driver=local, propagation=, read/write=true)
2016-09-12T13:25:39.378383107+02:00 container start 55260...
	(image=mobi3006/glassfish:3.1.2.2, name=nostalgic_bohr)
2016-09-12T13:25:39.379673101+02:00 container resize 5526...
	(height=35, image=mobi3006/glassfish:3.1.2.2, name=nostalgic_bohr, width=171)
2016-09-12T13:25:39.416374044+02:00 container die 55260...
	(exitCode=99, image=mobi3006/glassfish:3.1.2.2, name=nostalgic_bohr)
2016-09-12T13:25:39.526018442+02:00 network disconnect fdd42...
	(container=55260..., name=bridge, type=bridge)
2016-09-12T13:25:39.550278951+02:00 volume unmount ffadc...
	(container=55260..., driver=local)
2016-09-12T13:25:39.550304339+02:00 volume unmount e3ebb...
	(container=55260..., driver=local)

Am besten fĂŒhrt man diesen Befehl in einem anderen Konsolenfenster aus, damit sich die Informationen nicht so mitten rein mischen.


Container stirbt beim Start

Wenn ein Docker Container schon beim Start stirbt, dann ist die Fehlersuche schwieriger.

Logs anschauen

... funktioniert auch bei beendeten Containern - siehe oben

Konfiguration anschauen

... funktioniert auch bei beendeten Containern - siehe oben

Shellzugriff durch EinschrÀnkung der Initialisierungsroutine

Wenn der Container schon beim Starten abraucht, so kann am Entrypoint des Images liegen, der fĂŒr die Initialisierung des Containers zustĂ€ndig ist. Hier wird ein Container des Images panubo/vsftpd gestartet, ohne den Entrypoint des Images auszufĂŒhren:

docker run -t -it panubo/vsftpd /bin/bash

Auf diese Weise erhĂ€lt man eine Konsole auf dem Container und kann das Entrypoint-Script evtl. manuell ausfĂŒhren und so den Fehler reproduzieren.

Last updated

Was this helpful?