it-swarm.com.de

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

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.

926

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]:/#
1300

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.

670
WiR3D

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>

121
Adam Kalnas

Versuche dies:

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

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

27
kraxor

Basierend auf der Antwort von @ Timur habe ich das folgende handliches Skript erstellt

Konfiguration

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.

Verwendungszweck

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
18
Matyas

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/
11
laktak

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

9
Jeroen Peeters

@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

6
Richard

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.

4
radriaanse

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:

buntuWithSSH-Docker

Der Kern der Docker-Datei ist https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .

3
Dev Khadka
docker run -it openjdk:8

Das funktioniert :-)

2
Kishan B

GEHEN HINEIN

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.

1
Soorena

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}
0
Nek

Geben Sie Folgendes ein, um in einen laufenden Container zu hauen:

docker exec -t -i container_name /bin/bash
0