Normalerweise möchten Sie, dass Docker-Anwendungen vollständig enthalten sind, aber manchmal ist es für Entwicklungs- oder Automatisierungszwecke nützlich, mit Docker-Containern arbeiten zu können, als ob es Linux-VMs gäbe. Docker bietet Tools zum Ausführen von Befehlen und sogar ganzen Shells in Containern.
Befehle in Containern ausführen
Um einen Befehl in einem Container auszuführen, benötigen Sie seine Container-ID, es sei denn, Sie haben einen bestimmten Namen für diesen Container eingerichtet. Dies ist eine lange Hex-Zeichenfolge, die Sie der Docker-Prozessliste entnehmen können:
docker ps
Dann können Sie exec -it
verwenden Befehl, der im Container ausgeführt werden soll. Betrachten Sie beispielsweise die Ausgabe einer Protokolldatei:
docker exec -it containerID tail /var/log/nginx/access.log
Sie können Skripte auch innerhalb von Containern ausführen:
docker exec -it containerID script.sh
Das -it
Flags sind für den „interaktiven Modus“ bzw. TTY und werden fast immer verwendet. Es gibt noch ein paar andere Flags, die Sie verwenden können:
--workdir
oder-w
ändert das aktuelle Verzeichnis vor dem Befehl.--detach
, oder-d
, führt den Befehl im Hintergrund aus.--env
, oder-e
, setzt Umgebungsvariablen vor der Ausführung.--env-file
tut dasselbe, ist aber sicherer für den Umgang mit Geheimnissen.--privileged
führt den Befehl mit erweiterten Berechtigungen aus.--user
läuft unter einem anderen Benutzer
Dies funktioniert natürlich nur auf einem laufenden Container. Wenn Sie einen Container zu Wartungszwecken anhalten möchten, müssen Sie entweder Updates über eine neue Image-Version bereitstellen oder Änderungen an den auf Volumes bereitgestellten Daten vom Host-Betriebssystem vornehmen.
SSHing in einen Container
Sie sind nicht auf einfache Befehle beschränkt, Sie können tatsächlich eine Shell öffnen, indem Sie /bin/bash
ausführen als Befehl. Möglicherweise sind Sie bei den verfügbaren Tools eingeschränkt – die meisten Container verfügen über eine ziemlich einfache Linux-Installation – aber es macht die Ausführung vieler Befehle viel einfacher.
docker exec -it containerID /bin/bash
Dies ist einfach eine vom Host aus zugängliche Shell, die in den meisten Fällen gut funktioniert. Aber wenn Sie möchten, können Sie Ihre Container so einrichten, dass sie wie ein VPS vollständig über SSH verfügbar sind. Weitere Informationen zum Einrichten finden Sie in unserem Leitfaden zum Ausführen eines SSH-Dienstes in einem Docker-Container.
VERBUNDEN: SSH in einen Docker-Container
Kopieren von Dateien in und aus Containern
Ausführen von Befehlen mit exec -it
funktioniert, aber es gibt immer noch eine Schicht zwischen dem Host und dem Container, die ein einfaches Skripting verhindert. Zum einen ist es zwar einfach, Befehle an einen Container zu senden, aber es ist schwieriger, eine Ausgabe aus dem Dateisystem herauszuholen.
Während Sie das STDOUT von exec -it
weiterleiten können zu anderen Diensten auf dem Host-Betriebssystem können Sie auch Dateien in das und aus dem Dateisystem des Containers kopieren. Ziehen Sie beispielsweise eine Protokolldatei heraus und fügen Sie sie auf dem Host ein:
docker cp container:/var/log/nginx/example.log example.log
Oder ganze Verzeichnisse herausziehen:
docker cp nginx:/etc/nginx/ nginxconfig/
Wenn Sie dies jedoch regelmäßig tun, sollten Sie die Verwendung einer Bindung oder eines Volume-Mounts in Betracht ziehen, um die Daten direkt vom Host aus zugänglich zu machen.
VERBUNDEN: So verwenden Sie Docker Cp zum Kopieren von Dateien zwischen Host und Containern