it-swarm.com.de

So geben Sie einen Docker-Container ein, der bereits mit einem neuen TTY läuft

Ich habe einen Container, der den Apache-Dienst im Vordergrund ausführt. Ich möchte in der Lage sein, von einer anderen Shell auf den Container zuzugreifen, um darin herum "herumzustochern" und die Dateien zu untersuchen. Wenn ich mich an den Container anschließe, schaue ich momentan auf den Apache-Daemon und kann keine Befehle ausführen.

Ist es möglich, ein weiteres tty an einen laufenden Container anzuschließen? Möglicherweise kann ich die Tatsache nutzen, dass Docker eigentlich nur LXC-Container umgibt. Ich habe Sudo lxc-console -n [container-id] -t [1-4] ausprobiert, aber es scheint, dass nur ein TTY verfügbar ist und der Apache-Daemon ausgeführt wird. Vielleicht gibt es eine Möglichkeit, mehrere LXC-Konsolen während des Builds zu aktivieren?

Ich würde lieber nicht konfigurieren und den Container möglichst mit einem openssh-Dienst erstellen.

432
Programster

Mit Docker 1.3 gibt es einen neuen Befehl docker exec . Damit können Sie ein laufendes Docker eingeben:

docker exec -it [container-id] bash
853
Michael_Scharf

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

Installieren Sie einfach mit: docker run -v /usr/local/bin:/target jpetazzo/nsenter

Verwenden Sie dann den Befehl docker-enter <container-id>, um den Container einzugeben.

40
Hyperfocus

Update

Ab Docker 0.9 muss nun die /etc/default/docker-Datei mit dem '-e lxc' auf die Startoption des Docker-Daemons aktualisiert werden, bevor die folgenden Schritte ausgeführt werden können, bevor der Daemon neu gestartet wird. 

update to the /etc/default/docker file

Das ist alles weil ...

... es [Docker 0.9] enthält eine neue Abstraktion des "Motortreibers", um die Verwendung von .__ zu ermöglichen. von einer anderen API als LXC zum Starten von Containern. Es gibt auch ein neues Engine-Treiber basierend auf einer neuen API-Bibliothek (libcontainer), die in der Lage ist Kontrollgruppen behandeln, ohne LXC-Tools zu verwenden. Das Hauptproblem ist wenn Sie sich auf lxc-attach verlassen, um Aktionen mit Ihrem .__ auszuführen. Container, wie beim Starten einer Shell innerhalb des Containers. Dies ist wahnsinnig nützlich für Entwicklungsumgebungen ...

Quelle

Bitte beachten Sie, dass dies verhindert, dass die neuen optionalen Netzwerkfunktionen von Host "Docker 0.11 " funktionieren und dass nur die Loopback-Schnittstelle angezeigt wird. Fehlerbericht


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

... Sie können Docker ps -notrunc verwenden, um die vollständige lxc-Container-ID und .__ zu erhalten. Verwenden Sie dann lxc-attach -n <container_id> run bash in diesem Container als Wurzel.

Update: In Kürze müssen Sie ps --no-trunc anstelle von ps -notrunc verwenden, der veraltet ist.

enter image description here Ermitteln Sie die vollständige Container-ID

enter image description hereGeben Sie den Befehl lxc attach ein.

enter image description here Oben zeigt mein Apache-Prozess, auf dem das Andockfenster gestartet wurde.

18
Programster

Wie wäre es, wenn Sie tmux/GNU Screen innerhalb des Containers laufen lassen?

$ docker attach {container id}
4
cig0

nsenter tut das. Ich musste jedoch auch einen Container auf einfache Weise eingeben und nsenter reichte für meine Bedürfnisse nicht aus. In einigen Fällen war es fehlerhaft (schwarzer Bildschirm und -wd-Flag funktioniert nicht). Außerdem wollte ich mich als bestimmter Benutzer und in einem bestimmten Verzeichnis anmelden.

Am Ende baute ich mein eigenes Werkzeug, um Container zu betreten. Sie finden es unter: https://github.com/Pithikos/docker-enter

Die Verwendung ist so einfach wie

./docker-enter [-u <user>] [-d <directory>] <container ID>
4
Pithikos

Erste Schritt-Container-ID abrufen:

docker ps

Das wird Ihnen etwas zeigen

CONTAINER ID BILDBEFEHL ERSTELLTE STATUSPORTS-NAMEN

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

1170fe9e9460 ist in diesem Fall die Container-ID.

Zweitens , das Docker eingeben:

docker exec -it [container_id] bash

so im obigen Fall: docker exec -it 1170fe9e9460 bash

3
patapouf_ai

Der "nsinit" Weg ist:

installiere nsinit

git clone [email protected]:dotcloud/docker.git
cd docker
make Shell

aus dem Behälter:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

von außen:

docker cp id_docker_container:/go/bin/nsinit /root/

benutze es

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash
2
Ivailo Bardarov
docker exec -t -i container_name /bin/bash

Bringt Sie zur Container-Konsole.

1
Zemuldo

Ich habe Powershell auf einem laufenden Microsoft/iis als Daemon Using gestartet 

docker exec -it <nameOfContainer> powershell
1
Ahmed Samir

docker-Stop-Containername

docker-Start -i Containername

Dies funktionierte für mich im Terminal Remote in Ubuntu eingeloggt

0
Flavio