SSH Login in laufenden Docker Container
In diesem Artikel zeige ich wie man einen SSH Login in einen laufenden Docker Container durchführt um diesen zu untersuchen. Das ist bei der Fehlersuche in Microservices die als Docker Container gebaut werden immer wieder nötig.
SSH Login in laufenden Docker Container
Ein Microservice hat einen großen Vorteil: man entwickelt ein recht kleinen spezialisierten Teil einer vermutlich weitaus größeren und komplexeren Applikation. Das Team kann sehr effizient arbeiten, schnell Fortschritte machen und die Codebasis bleibt auf einem überschaubaren Level. Der Nachteil: das Debuggen ist etwas schwieriger und ohne gutes Logging ist man als Systementwickler bei dutzenden Microservices schnell verloren. Geht es um ein spezielles Problem bei einem einzelnen Microservice ist es oft nötig während der Entwicklungsphase in den Container hinein zu schauen. In meinem speziellen Fall meldet docker-compose beim Bau des Containers, dass eine Datei an einem Ort nicht existiert. Doch warum?
Container Innereien
Absolute und relative Pfade sind gerne mal ein Grund für die Verwirrung. Speziell wenn man Betriebssystem übergreifend programmiert kommt mal schnell mal mit den Eigenheiten des Betriebssystem durcheinander. Gerade in diesem Umfeld sollte man Pfade nur relativ angeben. Liegt die ausführbare Datei im Container doch an einem anderen Ort als gedacht sucht man schnell mal Daten unter einem Falschen Pfad. Gerade wenn es um Linux geht ist auch die korrekte Schreibweise (Linux ist Case-Sensitiv, Windows nicht!) eine mögliche Fehlerquelle. Kommt man nicht schnell auf die Lösung schaut man einfach mal schnell in den Container hinein und prüft ob die Datei auch im korrekten Pfad liegt. In meinem Fall entwickle ich meine Services unter Windows und deploye diese Docker Container auf einen Linux Server.
Das geht so:
docker ps
es werden alle laufenden Docker Container angezeigt. In einen davon möchte ich mich nun mittels SSH einloggen:
docker exec -it CONTAINERNAME /bin/bash
Der Befehl docker exec führt einen Befehl in einem Container aus. In meinem Fall ist das schlicht und einfach die bash. Neben dem absoluten Pfad zum Kommando muss man auch den Namen des Containers angeben. Dieser wird mitunter durch Indizes erweitert, da man Container auch skalieren kann (also beispielsweise app1, app2, app3 usw.). Über die bash kann ich nun im Container arbeiten durchführen. In dem Beispiel gebe ich einfach die Dateien im app Verzeichnis aus. Das ist in diesem Fall die gepublishte .NET Core Applikation.
Alternativen
Wie immer gibt es auch Alternativen. Will man nur prüfen ob eine Datei in einem bestimmten Ordner liegt, dann geht das auch mit Visual Studio und Docker for Windows. Sobald man das docker-compose im Debugmodus startet hat man die Möglichkeit die Dateien der geladenen Container zu durchsuchen.
Fazit
Ich habe gezeigt wie man sich in einen Docker Container über eine Bash anmelden kann. Über diesen Weg kann ich über SSH auf jeden Container zugreifen, der auf meinem Linux Server läuft. Das ist gerade während der Entwicklung hilfreich und kann auch später in einem Produktivsystem sinnvoll sein.