662 Stimmen

Wie kann man in einen bereits laufenden Docker-Container mit einem neuen TTY eintreten?

Ich habe einen Container, der den Apache-Dienst im Vordergrund ausführt. Ich möchte in der Lage sein, auf den Container von einer anderen Shell aus zuzugreifen, um darin zu "herumzustochern" und die Dateien zu untersuchen. Im Moment, wenn ich mich an den Container anhänge, sehe ich nur den Apache-Dämon und kann keine Befehle ausführen.

Ist es möglich, einem laufenden Container einen weiteren tty anzuhängen? Möglicherweise kann ich davon profitieren, dass Docker tatsächlich nur um LXC-Container herumwickelt? Ich habe versucht sudo lxc-console -n [container-id] -t [1-4], aber anscheinend wird nur ein tty zur Verfügung gestellt und das ist das, auf dem der Apache-Dämon läuft. Vielleicht gibt es eine Möglichkeit, während des Builds mehrere lxc-Konsolen zu aktivieren?

Ich würde es lieber nicht konfigurieren und den Container mit einem openssh-Dienst erstellen, wenn möglich.

1296voto

Michael_Scharf Punkte 30896

Mit Docker 1.3 gibt es einen neuen Befehl docker exec. Dies ermöglicht es Ihnen, einen laufenden Container zu betreten:

docker exec -it [container-id] bash

Hinweis: Dies setzt voraus, dass bash in Ihrem Container installiert ist. Sie können auch sh oder ein anderes interaktives Shell ausführen, das im Container installiert ist.

42voto

Hyperfocus Punkte 763

Sie sollten das Tool von Jérôme Petazzoni namens 'nsenter' verwenden, um einen Container ohne Verwendung von SSH zu betreten. Siehe: https://github.com/jpetazzo/nsenter

Installieren Sie es einfach durch Ausführen von: docker run -v /usr/local/bin:/target jpetazzo/nsenter

Verwenden Sie dann den Befehl docker-enter um den Container zu betreten.

22voto

Programster Punkte 11662

Aktualisierung

Ab docker 0.9 muss man für die unten stehenden Schritte nun das /etc/default/docker Datei mit dem '-e lxc' zum Docker-Daemon-Startparameter aktualisieren, bevor man den Daemon neu startet (das habe ich durch einen Neustart des Hosts gemacht).

Aktualisierung der /etc/default/docker Datei

Dies liegt alles daran...

...dass es [docker 0.9] eine neue "Engine-Treiber" Abstraktion enthält, um die Verwendung eines anderen APIs als LXC zum Starten von Containern zu ermöglichen. Es bietet auch einen neuen Engine-Treiber basierend auf einer neuen API-Bibliothek (libcontainer), die in der Lage ist, Control Groups ohne Verwendung von LXC-Tools zu verarbeiten. Das Hauptproblem ist, dass, wenn man sich auf lxc-attach verlässt, um Aktionen in seinem Container auszuführen, wie zum Beispiel das Starten eines Shells innerhalb des Containers, was für die Entwicklungsumgebung unverzichtbar ist...

Quelle

Bitte beachten Sie, dass dies das neue host-only networking)-Optionfeature von Docker 0.11 daran hindern wird, zu "funktionieren", und Sie nur die Loopback-Schnittstelle sehen werden. Fehlerbericht


Es stellt sich heraus, dass die Lösung für eine andere Frage auch die Lösung für diese war:

...man kann docker ps -notrunc verwenden, um die vollständige LXC-Container-ID zu erhalten und dann lxc-attach -n ausführen, um als root bash in diesem Container auszuführen.

Aktualisierung: Bald muss man ps --no-trunc anstelle von ps -notrunc verwenden, das veraltet wird.

Bildbeschreibung hier eingeben Finde die vollständige Container-ID

Bildbeschreibung hier eingeben Gib den lxc-attach Befehl ein.

Bildbeschreibung hier eingeben Oben ist mein Apache-Prozess zu sehen, den Docker gestartet hat.

12voto

Flavio Punkte 426
docker exec -ti 'CONTAINER_NAME' sh

oder

docker exec -ti 'CONTAINER_ID' sh

10voto

patapouf_ai Punkte 15406

Erster Schritt Container-ID abrufen:

docker ps

Dies zeigt Ihnen etwas ähnliches wie

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

1170fe9e9460 localhost:5000/python:env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" vor 26 Sekunden Hochgefahren vor 25 Sekunden 0.0.0.0:8989->9999/tcp SLURM_TASK-303337_0

1170fe9e9460 ist in diesem Fall die Container-ID.

Zweiter Schritt, den Docker betreten :

docker exec -it [container_id] bash

also in obigem Fall: docker exec -it 1170fe9e9460 bash

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X