Es kann notwendig sein, dass wir uns mit einem Container unter Docker verbinden müssen, um Konfigurationen vorzunehmen und die Umgebung durch Modifikationen oder Installationen zu erweitern. In diesem Beitrag zeige ich euch, wie wir auf die interaktive Shell innerhalb unseres Docker-Containers zugreifen können.
Was ist Docker? (Kurzform)
Docker ist eine Open-Source-Plattform, die es Software-Entwicklern ermöglicht, Anwendungen mitsamt all ihren Abhängigkeiten und Bibliotheken in einem kompakten Container bereitzustellen, die dann unabhängig vom Hostsystem ausgeführt werden können. Das ermöglicht eine schnellere Implementierung von Software und eine noch bessere Skalierung der bereits vorhandenen IT-Infrastruktur. Die größte Alternative zu Docker ist im übrigen Podman. Wie die Software installiert wird, habe ich euch bereits in einem anderen Artikel von mir gezeigt.
Inhaltsverzeichnis: Eine Verbindung mit einem Docker-Container über die Shell herstellen (Anleitung)
Die Voraussetzungen, um eine interaktive Verbindung mit einem Container unter Docker aufzubauen
Zunächst benötigen wir einen laufenden Docker-Container, mit dem wir uns verbinden können. Wir müssen über die notwendigen Berechtigungen für die Verwaltung von Docker-Containern verfügen und der Container darf selbsterklärend, nicht offline sein. Überprüfen lässt sich der aktuelle Status mit dem folgenden Befehl:
docker ps
Wir benötigen den Namen und die verwendete ID von dem Container, mit dem wir eine interaktive Shell-Sitzung herstellen möchten. Der Name wird unter dem Bereich „NAMES“ ausgegeben (siehe Screenshot).
Beispiel Name und ID:
19ada10c5ad7
httpd
Eine Verbindung zum Docker-Container mit dem exec-Befehl herstellen
Die beste Methode, die wir verwenden können, um eine Sitzung mit dem Container herzustellen, ist der exec-Befehl. Verwenden wir diesen Befehl mit den beiden Optionen t und i, starten wir eine interaktive Shell-Session mit dem Container:
docker exec -t -i <name> /bin/bash
Sobald der Befehl abgesendet wurde, befinden wir uns auf dem Container und können direkt mit dessen Umgebung interagieren. Wir sind haben jetzt die Möglichkeit, Linux-Befehle einzugeben, eigenständige Konfigurationen und Anpassungen vorzunehmen und zusätzliche Software innerhalb des Docker-Containers zu installieren.
Hinweis: Würden wir uns mit dem Container aus dem obigen Beispiel verbinden wollen, würde der Befehl nun wie folgt eingegeben werden: docker exec -t -i httpd /bin/bash
Nachdem wir den Befehl abgesendet haben, befinden wir uns umgehend auf dem Docker-Container. Benutzen wir den ls-Befehl wird ersichtlich, dass ein Container auch über Verzeichnisse verfügt und wie ein UNIX basiertes System über die Shell/Terminal bedient werden kann. Ähnlich wie bei einer SSH-Sitzung haben wir uns im Beispiel als root mit dem Container verbunden.
Die interaktive Shell-Session kann mit der Eingabe des folgenden Befehls beendet werden. Anschließend befinden wir uns wieder auf dem Hostsystem.
exit
Kann man sich mit einem laufenden Docker-Container remote über SSH verbinden?
Ja, sicherlich könnte man sich auch über SSH mit einem Container in einer Dockerumgebung verbinden. Dafür müsste man zunächst die IP-Adresse des Docker-Containers ermitteln. Dafür können wir den folgenden Befehl verwenden:
docker inspect -f "{{ .NetworkSettings.IPAddress }}" <container_name>
Damit wir uns nun aber über SSH mit dem Zielsystem verbinden können, müssten wir uns jetzt zuerst mit dem exec-Befehl mit dem Container verbinden und den SSH-Dienst installieren, genauer gesagt aktivieren. Anschließend wäre es möglich, den SSH-Befehl gefolgt von der IP-Adresse des Docker-Containers einzugeben, um eine Sitzung herzustellen.
Das könnte jetzt wie folgt aussehen:
ssh root@172.17.0.4
Da von außen aber kein anderes System Zugriff auf diese interne IP-Adresse unseres Containers hat, würde man die SSH-Season allerdings ausschließlich auf dem aktuellen Hostsystem, auf dem der Container unter Docker ausgeführt wird, durchführen können. Und dann bietet sich vermutlich besser der exec-Befehl mit der interaktiven Shell-Sitzung an.
Zusammenfassung
In diesem kurzen Beitrag habe ich euch gezeigt, wie man sich mit einem Docker-Container verbinden kann, um Terminal-Befehle über eine interaktive Shell-Sitzung direkt im Container ausführen zu können. Wir sollten aber im Hinterkopf behalten, dass wir Container unter Docker ja gerade aufgrund ihrer leichten Gewichtigkeit verwenden.
Ist es wirklich notwendig, dass wir einen SSH-Konnektivität implementieren und zusätzliche Softwarekonfigurationen vornehmen müssen? Dann eignet sich in den allermeisten Fällen wahrscheinlich doch eher eine virtuelle Maschine (VM), die erheblich mehr eigenständige Anpassungen und Modifikationen der Umgebung erlaubt.