Docker-Container bieten isolierte Umgebungen für die Ausführung von Anwendungen und gewährleisten so Konsistenz und Portabilität. Wenn du mit Docker-Containern arbeitest, ist es wichtig, dass du ihre Shells einsehen und dich mit ihnen verbinden kannst. Auf diese Weise kannst du Befehle ausführen, Probleme beheben und das Verhalten der Container in Echtzeit überwachen.

In diesem Artikel erfährst du, wie du auf lokale und entfernte Docker-Container zugreifen kannst, um sie zu warten und zu aktualisieren.

Warum du auf deine Container zugreifen musst

Der Zugriff auf Container ist für eine effektive Verwaltung und Fehlerbehebung in containerisierten Umgebungen unerlässlich. So kannst du die Logs und Laufzeitinformationen des Containers analysieren und Fehler leicht identifizieren und beheben.

Der Zugriff auf Container ermöglicht es dir außerdem, Befehle für schnelle Konfigurationsaktualisierungen, Paketinstallationen und andere administrative Aufgaben auszuführen. Ohne Zugriff müsstest du das gesamte Container-Image mit der aktualisierten Konfiguration neu erstellen, was zeitaufwändig und ineffizient sein kann.

In einem verteilten Anwendungsökosystem müssen Container auch miteinander kommunizieren können. Du brauchst also Zugang zu den Containern, um Befehle zu diagnostizieren und sicherzustellen, dass die Verbindung zwischen den Containern einwandfrei funktioniert.

Es ist zwar möglich, über ein herkömmliches Secure Shell (SSH)-Protokoll auf Container zuzugreifen, aber Docker bietet mehrere integrierte Methoden, mit denen du Zeit sparen und die Effizienz steigern kannst. Dazu gehören:

  • docker exec
  • docker run
  • docker attach
  • docker compose exec
  • docker compose run

Jede Methode hat ihre eigenen Anwendungsfälle und Vorteile. Wenn du den richtigen Befehl für deinen Anwendungsfall kennst, kannst du deinen Ansatz optimieren.

Wie und warum du docker exec verwenden solltest

docker exec ermöglicht es dir, auf die Shell-Sitzung eines laufenden Containers zuzugreifen und Befehle auszuführen, ohne eine neue Instanz starten zu müssen. Beachte, dass dieser Befehl nicht persistent ist, d.h. er wird nicht erneut ausgeführt, wenn der Container heruntergefahren oder neu gestartet wird.

Um auf einen laufenden Container zuzugreifen, brauchst du seinen Namen oder seine ID (du kannst sie mit docker ps -a herausfinden). Dann gibst du sie in den folgenden Befehl ein:

docker exec -it  /bin/bash

Der Befehl docker exec wird im Terminal ausgeführt, um eine Bash-Shell innerhalb eines Containers zu starten.
Zugriff auf einen Container mit docker exec

Wie und warum du docker run verwenden solltest

Mit dem Befehl docker run kannst du einen neuen Container starten und sofort auf seine Shell zugreifen. Dieser Container ist nicht standardmäßig mit deiner aktuellen Shell-Sitzung verbunden, aber du kannst ihn mit der Option -it verbinden.

Mit dem folgenden Befehl kannst du einen neuen Container starten, ihn an deine aktuelle Shell-Sitzung anhängen und eine Bash-Shell starten:

docker run -it  /bin/bash

Der Befehl docker run wird im Terminal ausgeführt, um einen Container zu starten und darin eine Bash-Shell zu erzeugen.
Zugriff auf einen Container mit docker run

Wie und warum man docker attach verwendet

Der Befehl docker attach ist nützlich für die Überwachung und Fehlersuche bei Containeroperationen. Er ermöglicht es dir, dich mit einem laufenden Container zu verbinden und seine Standardeingabe-, Ausgabe- und Fehlerströme in Echtzeit einzusehen.

Um ihn zu verwenden, starte deinen Container mit docker run. Dann trennst du dich von ihm, indem du Strg+P und Strg+Q drückst. Du kannst stattdessen auch das -d Flag für diesen Container angeben.

Sobald dein Container im Hintergrund läuft, kannst du ihn mit dem folgenden Befehl aufrufen:

docker attach 

Der Docker-Attach wird im Terminal ausgeführt, um auf einen Container zuzugreifen.
Mit docker attach auf einen Container zugreifen

Wie und warum du Docker Compose verwenden solltest

Mit Docker Compose kannst du Docker-Anwendungen mit mehreren Containern erstellen und ausführen. Du kannst damit die Dienste, aus denen deine Anwendung besteht, in einer YAML-Datei definieren und diese Datei dann verwenden, um alle Container gemeinsam zu starten und zu verwalten. Es eignet sich für Entwicklungs- und Testumgebungen, in denen du schnell komplexe Umgebungen aufsetzen musst.

Um auf einen bestimmten, bereits laufenden Container zuzugreifen, führst du den folgenden Befehl docker compose aus, gefolgt vom Namen des Dienstes und dem gewünschten Befehl:

docker compose exec app /bin/bash

Dieser Befehl startet einen neuen Prozess innerhalb des Containers, der den angegebenen Befehl ausführt. Du kannst damit jeden Befehl innerhalb des Containers ausführen, auch interaktive Shells wie die Bash.

Wenn du einen neuen Container mit Docker Compose starten und sofort auf ihn zugreifen willst, führst du den folgenden Befehl aus:

docker compose run app /bin/bash

Beachte, dass docker compose zwei verschiedene Syntaxen hat: docker-compose (Version 1) und code>docker compose (Version 2). Die Syntax der Version 2 ist flexibler und leistungsfähiger, daher wird empfohlen, sie zu verwenden, wann immer es möglich ist.

Die Befehle docker compose run und docker compose exec werden im Terminal ausgeführt, um auf Container zuzugreifen.
Docker Compose für den Zugriff auf Container verwenden

So fügst du einen SSH-Server zu deinem Docker-Container hinzu

Wenn du einen SSH-Server zu deinem Docker-Container hinzufügst, kannst du deine containerisierten Anwendungen besser verwalten und Fehler beheben. Mit einem SSH-Server kannst du von überall aus auf Container zugreifen und sie verwalten, Befehle ausführen und Protokolle einsehen.

Du kannst einen SSH-Server hinzufügen, indem du ihn in dein Dockerfile aufnimmst, bevor du den Container baust, und ihn dann mit einem SSH-Client verbindest. Alternativ kannst du auch einen temporären SSH-Zugang einrichten, indem du eine Shell in einem laufenden Container startest und darin einen SSH-Server installierst.

Einbindung eines SSH-Servers beim Bau deines Docker-Containers

Wenn du einen Docker-Container baust, kann es nützlich sein, einen SSH-Server in den Container einzubinden, wenn du dauerhaft per SSH auf den Container zugreifen willst. Er ermöglicht den Fernzugriff und das Debugging des Containers während der Entwicklung oder der Fehlersuche. Mit einem SSH-Server innerhalb des Containers kannst du auch Dateien sicher in und aus dem Container übertragen.

Um einen SSH-Server während des Builds einzubinden, musst du ein paar Änderungen an der Dockerdatei des Containers vornehmen. Hier ist ein Beispiel für ein Dockerfile, das einen SSH-Server enthält:

FROM debian:latest

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:root123' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

EXPOSE 22

CMD ["/usr/sbin/sshd", "-D"]

Ein SSH-Befehl, der im Terminal ausgeführt wird, um auf einen Container zuzugreifen.
Docker-Container mit SSH-Server gebaut

Dieser Code erstellt einen Container mit dem neuesten Debian-Image und installiert den SSH-Server. Außerdem erstellt er ein neues Verzeichnis für den SSH-Server, setzt das Root-Passwort und aktiviert den Root-Login über die SSH-Konfiguration.

Schließlich gibt er Port 22 frei, den Standardport von SSH.

Um diese Dockerdatei zu verwenden, musst du den Container mit dem Befehl docker build erstellen und ihn dann mit docker run ausführen. Hier ist ein Beispiel:

docker build . -t ssh-container 
docker run -d -p 2222:22 ssh-container

Dieser Befehl erstellt einen Container mit der Dockerdatei und versieht ihn mit dem Namen ssh-container. Verwende -d, um den Container im abgetrennten Modus zu starten. Als Nächstes ordnest du Port 22 innerhalb des Containers mit -p auf Port 2222 auf dem Host-Rechner zu.

Sobald der Container läuft, kannst du dich mit dem Befehl ssh per SSH in den Container einloggen:

ssh root@localhost-p 2222

Wenn du nach dem Passwort gefragt wirst, gibst du das Passwort ein, das du in der YAML-Datei festgelegt hast. In diesem Fall ist es „root123“ Du bist jetzt mit dem SSH-Server verbunden, der im Container läuft. Das bedeutet, dass du aus der Ferne debuggen oder Dateien in und aus dem Container übertragen kannst.

Vorübergehend einen SSH-Server zu einem laufenden Docker-Container hinzufügen

Du kannst auch einen SSH-Server zu einem laufenden Container hinzufügen, indem du den Befehl docker exec verwendest:

docker exec <container_name_or_id> /bin/bash

Sobald du Zugriff auf den Container hast, installierst du den OpenSSH-Server und startest den SSH-Daemon:

apt update && apt install openssh-server && /usr/sbin/openssh -D

Dadurch wird eine neue Instanz des SSH-Servers innerhalb des Containers geöffnet. Jetzt kannst du dich mit einem SSH-Client auf deinem lokalen Rechner mit dem Server verbinden.

Beachte, dass du dich nur dann per SSH mit dem Container verbinden kannst, wenn du oder dein Team den SSH-Port während der Ausführungs- oder Bauphase freigegeben haben.

Verbinde dich mit dem SSH-Server deines Containers

Beginne damit, die IP-Adresse oder den Hostnamen des Containers über deine Containerverwaltungsplattform oder deinen Dienst zu ermitteln.

Um dich mit der IP-Adresse zu verbinden, verwende den Befehl ssh:

ssh [username]@[container-ip-address]

Sobald du dazu aufgefordert wirst, gibst du das Passwort für den angegebenen Benutzernamen ein. Einige SSH-Server verwenden anstelle eines Passworts eine schlüsselbasierte Sicherheit.

Du solltest jetzt eine Remote-Terminal-Sitzung haben, die mit dem Container verbunden ist.

Zusammenfassung

Da Docker immer beliebter wird, ist es wichtig, dass du die Container, die in deiner Umgebung laufen, überprüfen kannst. Diese Funktion ermöglicht es dir, Probleme während der Entwicklung zu diagnostizieren und zu beheben.

Docker bietet außerdem eine vielseitige Reihe von integrierten Befehlen für verschiedene Entwicklungsaufgaben. Mit diesen Befehlen kannst du deine Arbeitsabläufe optimieren, ohne dich auf die traditionellen SSH-Methoden verlassen zu müssen.

Schau dir Kinsta an, um deine Anwendungen, WordPress-Websites oder Datenbanken zu hosten. Mit Kinsta hast du einen schnellen und sicheren Hoster, der deine Projekte auf einer Infrastruktur bereitstellt, die auf dem Premium Tier Network und den C2-Maschinen von Google Cloud Platform basiert. Wähle zwischen 37 Rechenzentren und einem HTTP/3-fähigen CDN mit 260+ PoPs. Mit isolierter Containertechnologie, zwei starken Firewalls und fortschrittlichem DDoS-Schutz auf Basis von Cloudflare bist du sicher. Und mit der Kinsta-API kannst du Anwendungen integrieren oder Workflows automatisieren.

Marcia Ramos Kinsta

Ik ben de Editorial Team Lead bij Kinsta. Ik ben een open source liefhebber en ik houd van coderen. Met meer dan 7 jaar ervaring in technisch schrijven en redactiewerk voor de tech-industrie, werk ik graag samen met mensen om duidelijke en beknopte content te creëren en workflows te verbeteren.