Ich möchte in einen laufenden Docker-Container ssh oder bash. Bitte siehe Beispiel:
$ Sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ Sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
665b4a1e17b6 webserver:latest /bin/bash ... ... 22/tcp, 80/tcp loving_heisenberg
jetzt möchte ich so etwas bekommen (gehe in den laufenden Container):
$ Sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ [email protected]:/#
However when I run the line above I get new CONTAINER ID
$ [email protected]:/#
Ich habe Vagrant verwendet und möchte ein ähnliches Verhalten wie vagrant ssh
erhalten.
Die Antwort lautet Dockers attach
Befehl. Für mein Beispiel oben lautet die Lösung also:
$ Sudo docker attach 665b4a1e17b6 #by ID
or
$ Sudo docker attach loving_heisenberg #by Name
$ [email protected]:/#
Für Docker Version 1.3 oder höher: Vielen Dank an Benutzer WiR3D , der einen anderen Weg vorgeschlagen hat, die Shell eines Containers abzurufen. Wenn wir attach
verwenden, können wir nur eine Instanz der Shell verwenden. Wenn wir also ein neues Terminal mit einer neuen Instanz der Shell eines Containers öffnen möchten, müssen wir nur Folgendes ausführen:
$ Sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID
oder
$ Sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ [email protected]:/#
Ab Docker 1.3:
docker exec -it <containerIdOrName> bash
Wenn der Docker-Container mit dem Befehl /bin/bash
gestartet wurde, können Sie mit attach
darauf zugreifen. Wenn nicht, müssen Sie den Befehl ausführen, um mit exec
eine Bash-Instanz im Container zu erstellen.
So beenden Sie Bash, ohne Bash in einem Schurkenprozess laufen zu lassen:
exit
Ja, so einfach ist das.
Obwohl der Autor der Frage ausdrücklich erklärt hat, dass sie an einem laufenden Container interessiert sind, ist es auch erwähnenswert, dass Sie, wenn der Container nicht läuft, ihn ausführen möchten, um herumzustöbern, Folgendes ausführen können:
docker run -i -t --entrypoint /bin/bash <imageID>
Versuche dies:
Sudo docker run -i -t webserver /bin/bash
Quelle: https://docs.docker.com/articles/basics/#running-an-interactive-Shell
Basierend auf der Antwort von @ Timur habe ich das folgende handliches Skript erstellt
Fügen Sie die docker-ssh
-Datei mit dem folgenden Inhalt in Ihre $PATH
ein
#!/bin/bash -xe
# docker container id or name might be given as a parameter
CONTAINER=$1
if [[ "$CONTAINER" == "" ]]; then
# if no id given simply just connect to the first running container
CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi
# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (Alpine), or simply sh
# the -l at the end stands for login Shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l
Hinweis : Einige Container enthalten nicht bash
, sondern ash
, sh
usw. In diesen Fällen bash
wird im obigen Skript ersetzt.
Wenn Sie nur eine laufende Instanz haben, führen Sie einfach aus
$> docker-ssh
Andernfalls geben Sie einen Docker-ID-Parameter an, den Sie von docker ps
(erste Spalte) erhalten.
$> docker-ssh 50m3r4nd0m1d
Wenn in Ihrem Container kein Bash installiert ist, können Sie Folgendes versuchen:
docker exec -it CONTAINER /bin/sh
Oder suchen Sie zuerst in/bin nach Muscheln:
docker export CONTAINER|tar -t|egrep ^bin/
Ich habe einen containerisierten SSH-Server erstellt, der jedem ausgeführten Container SSH-Funktionen bietet. Sie müssen Ihren Container nicht wechseln. Die einzige Voraussetzung ist, dass der Container Bash hat.
Wenn Sie einen Container mit dem Namen 'web-server1' haben. Der folgende Docker-Ausführungsbefehl startet einen zweiten Container, der SSH für den ersten Container bereitstellt.
docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh
Weitere Hinweise finden Sie unter checkout https://github.com/jeroenpeeters/docker-ssh
@jpetazzo hat einen toller Beitrag zu diesem Thema . Die kurze Antwort wäre, nsenter
zu verwenden:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
P .: Vergiss nicht, die Diskussion in den Kommentaren des Beitrags zu überprüfen ...
Prost
Sie können dem Docker-Container auch eine routingfähige IP-Adresse mit Pipework zuweisen und anschließend SSH mit dieser neuen IP-Adresse auf den Computer übertragen.
Dies wird "traditioneller" (ssh) sein, anstatt einen anwendungsspezifischen Befehl wie docker attach
zu verwenden, und wird ihn schließlich system- und versionsübergreifend "portabler" machen.
Manchmal ist es praktisch, in einen Docker-Container zu sshen, besonders während der Entwicklung. Das folgende Docker-Image ermöglicht es, mit einem privaten Schlüssel in einen Container zu sshen:
Der Kern der Docker-Datei ist https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .
docker run -it openjdk:8
Das funktioniert :-)
installieren Sie das Befehlszeilentool goinside
mit:
Sudo npm install -g goinside
und gehen Sie in einen Docker-Container mit einer geeigneten Terminalgröße mit:
goinside docker_container_name
weitere Informationen finden Sie unter this out.
Nur zur Information. Wenn Sie sich in einem einfachen Container anmelden müssen, der kein Daemon ist, müssen Sie die folgenden Befehle verwenden:
docker start {id}
docker attach {id}
Geben Sie Folgendes ein, um in einen laufenden Container zu hauen:
docker exec -t -i container_name /bin/bash