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.
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
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.
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.
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 ...
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 dannlxc-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.
Ermitteln Sie die vollständige Container-ID
Geben Sie den Befehl lxc attach ein.
Oben zeigt mein Apache-Prozess, auf dem das Andockfenster gestartet wurde.
Wie wäre es, wenn Sie tmux/GNU Screen innerhalb des Containers laufen lassen?
$ docker attach {container id}
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>
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
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
docker exec -t -i container_name /bin/bash
Bringt Sie zur Container-Konsole.
Ich habe Powershell auf einem laufenden Microsoft/iis als Daemon Using gestartet
docker exec -it <nameOfContainer> powershell
docker-Stop-Containername
docker-Start -i Containername
Dies funktionierte für mich im Terminal Remote in Ubuntu eingeloggt