Frage Wie bekomme ich bash oder ssh im Hintergrundmodus in einen laufenden Container?


Ich möchte ssh oder bash in einen laufenden docker container. 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 (geh in den running container):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

Ich habe Vagrant benutzt und ich möchte ein ähnliches Verhalten wie vagrant ssh.


795
2017-08-01 16:19


Ursprung


Alternative sudo docker exec -i -t 665b4a1e17b6 /bin/sh um apt-Programme und -Pakete installieren zu können - fonjeekay


Antworten:


Die Antwort ist Docker attach Befehl. Also für mein Beispiel oben wird die Lösung sein:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Für Docker Version 1.3 oder höher: Danke an den Benutzer WiR3D wer schlug einen anderen Weg vor, um die Schale eines Containers zu bekommen. Wenn wir es benutzen attach Wir können nur eine Instanz der Shell verwenden. Wenn wir also ein neues Terminal mit einer neuen Instanz der Shell eines Containers öffnen wollen, 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
$ root@665b4a1e17b6:/#

1178
2017-08-05 06:01



Alternativ, führen Sie aus sudo docker attach loving_heisenberg - thiagowfx
Der attach-Befehl funktioniert nicht für mich, es verursacht das Einfrieren des Dockers ... irgendwelche Ideen, warum es passiert? - Mo J. Mughrabi
Eine Erinnerung für boot2docker Benutzer: entfernen Sie sudo :) - Henno
-i -t ist gleich -it - pasha.zhukov
Dies ist eine gefährliche Antwort ausgewählt und so hoch gewählt. docker attachB. zu einer MongoDB-Instanz führen, wird die Instanz beendet. Wie ausführlicher in diese Frage  attach und exec sind verschiedene Tiere. - fwc


Ab Docker 1.3:

docker exec -it <containerIdOrName> bash

Grundsätzlich, wenn der Docker Container mit dem gestartet wurde /bin/bash Befehl, mit dem Sie darauf zugreifen können attach. Wenn nicht, müssen Sie den Befehl ausführen, um eine Bash-Instanz innerhalb des Containers zu erstellen exec.

Um Bash auch zu verlassen, ohne Bash in einem Rogue-Prozess laufen zu lassen:

exit

Ja, so einfach ist es.


585
2017-10-29 07:46



habe immer noch nicht herausgefunden, wie man Nano zur Arbeit bringt. Think, das docker-ssh von der Phusion mit einbeziehen kann - WiR3D
Gibt es eine Möglichkeit, bash standardmäßig in Andockern zu setzen? - ipeacocks
@ipeacocks ja, wenn die RUN Befehl in der Dockerdatei ist /bin/bash. Aber hängt davon ab, was du meinst. Wenn Sie den Container ausführen und bash sofort in demselben Terminal verfügbar haben möchten, dann fahren Sie mit -it Sollte es tun - WiR3D
Docker-Gruppe zu verwenden ist eine schlechte Übung. Jeder Benutzer, der sich in der Docker-Gruppe befindet, wird im Wesentlichen mit Root-Rechten verwendet, ohne dass sudo verwendet werden muss. projectatomic.io/blog/2015/08/... - Maiku Mori
Ich denke, es macht keinen großen Unterschied, ob Sie es verwenden oder nicht sudo vs docker Gruppe. In jedem Fall gibt es eine Sicherheitslücke im Andockfenster, die dem Gast vollständige Rechte im Host - Dateisystem zur Verfügung stellen kann - unabhängig davon, ob Sie die Andockgruppe oder verwenden sudo um den Container zu starten. - nobar


Obwohl der Autor der Frage ausdrücklich gesagt hat, dass sie an einem laufenden Container interessiert sind, ist es auch erwähnenswert, dass wenn der Container nicht ausgeführt wird, Sie ihn aber ausführen möchten, um herumzustöbern, können Sie Folgendes ausführen:

docker run -i -t --entrypoint /bin/bash <imageID>


101
2017-11-07 18:46



Das ergibt einen anderen Container, genau wie @kraxors Antwort. - Blaisorblade


Versuche dies:

sudo docker run -i -t webserver /bin/bash

Quelle: https://docs.docker.com/articles/basics/#running-an-interactive-shell


24
2017-08-01 16:29



Es ist nicht geeignet, weil ich unterschiedliche CONTAINER ID (root@42f1e37bd0e5:/# und nicht root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
Link ist tot, du solltest updaten - Ahmet Karakaya


Basierend auf @ Timurs Antwort habe ich Folgendes erstellt handliches Skript

Konfiguration

Stellen docker-ssh Datei in Ihrem $PATH mit folgendem Inhalt

#!/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, aber ash, sh usw. In diesen Fällen bash soll im obigen Skript ersetzt werden.

Verwendung

Wenn Sie eine laufende Instanz haben, führen Sie sie einfach aus

$> docker-ssh 

Andernfalls stellen Sie es mit einem Docker-ID-Parameter, aus dem Sie erhalten docker ps (erste Spalte)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Darf ich wissen, warum wir am Ende -l brauchen? - Nam G VU
bash als Login-Shell starten, die Umgebungsparameter lesen (in der Zeile über dem Befehl beschrieben) - Matyas


Ich habe einen SSH-Server in Containerform erstellt, der jedem ausgeführten Container SSH-Funktionen zur Verfügung stellt. Sie müssen Ihren Container nicht ändern. Die einzige Voraussetzung ist, dass der Container Bash hat.

Wenn Sie einen Container mit dem Namen 'web-server1' haben. Der folgende Befehl docker run würde einen zweiten Container starten, der SSH für den ersten Container bereitstellen würde.

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

Für mehr Hinweise, Kasse https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Dies sollte die akzeptierte Antwort sein - Nam G VU
Übrigens, wie können wir .bashrc automatisch laden, wenn Sie eine ssh-Sitzung mit Ihrer Lösung starten? Hat auch ein Problem auf GitHub gepostet github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo hat eine tolle Post zu diesem Thema. Die kurze Antwort wäre zu verwenden nsenter:

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

PS .: Vergessen Sie nicht, die Diskussion in den Kommentaren des Beitrags zu überprüfen ...

Prost


5
2018-03-14 10:12



Das ist ein ziemlich alter Beitrag ist nicht mehr wirklich notwendig. @ WiR3Ds docker exec Lösung ist eher bequemer. - drevicko


Wenn Ihr Container keine Bash installiert hat (zB Konsul), können Sie versuchen:

docker exec -it CONTAINER /bin/sh

Oder suche zuerst nach Muscheln in / bin:

docker export CONTAINER|tar -t|egrep ^bin/

3
2017-07-29 13:40



Was ist "Konsul"? Hast du eine Referenz dafür? Meinst du "Konsole"? - Peter Mortensen


Sie können dem Docker-Container auch eine routbare IP-Adresse mit Pipework zuweisen und danach SSH mit dieser neuen IP-Adresse in den Computer aufnehmen.

Dies wird eher "traditionell" (ssh), anstatt einen anwendungsspezifischen Befehl wie docker attachund wird es schließlich über Systeme und Versionen "tragbarer" machen.


3
2017-10-29 11:58



Fügen Sie bitte die einfache Methode hinzu. Um ehrlich zu sein, ich brauche es wirklich, aber ich habe keine Zeit, die einfachste Lösung dafür zu suchen. Könnten Sie Ihre Antwort hier posten? Es wäre toll.. - Timur Fayzrakhmanov
Es gibt zwei Möglichkeiten, dies zu erreichen, aber es ist nicht einfach und würde zu einem großen Beitrag werden. Sie könnten das überprüfen Verknüpfung selbst, für die Verwendung von Rohrleitungen oder dies Verknüpfung, die im Wesentlichen das Gleiche wie Pipework erreicht und etwas einfacher ist, aber Sie müssen es manuell tun. Es hängt also davon ab, wie viele Server sprechen. Wenn Sie nichts Genaueres herausfinden können, lassen Sie es mich wissen. Aber ich habe auch nicht die Zeit, ein komplettes Tutorial zu schreiben. - radriaanse
Du hast Recht - es gibt keinen offensichtlichen und einfachen Weg, dies zu tun (Danke für die Links, ich denke, ich werde später darauf zurückkommen). - Timur Fayzrakhmanov


docker run -it openjdk:8

Das funktioniert :-)


2
2017-09-06 15:11





Manchmal ist es hilfreich, wenn Sie während der Entwicklung in einen Docker-Container scannen können. Das folgende Docker-Image ermöglicht es, mithilfe eines privaten Schlüssels in einen Container zu wechseln:

UbuntuWithSSH-Docker

Der Kern der Dockerfile ist https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.


2
2017-08-26 15:26