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

Ich möchte ssh oder Bash in einen laufenden Docker-Container einbinden. Bitte, siehe Beispiel:

$ sudo docker run -d webserverwebserver is clean image from ubuntu:14.04$ sudo docker psCONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES665b4a1e17b6  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 (oder vielleicht 665b4a1e17b6 stattdessen)
$ root@665b4a1e17b6:/#

Wenn ich jedoch die obige Zeile ausführe, erhalte ich eine neue CONTAINER-ID:

$ root@42f1e37bd0e5:/#

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

Die Antwort ist Dockers attach Befehl. Für mein obiges Beispiel lautet die Lösung also:

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

Für Docker Version 1.3 oder höher: Danke an den Benutzer WiR3D wer hat einen anderen Weg vorgeschlagen, um die Hülle eines Containers zu bekommen. Wenn wir verwenden 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 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$ root@665b4a1e17b6:/#

Ab Docker 1.3:

docker exec -it <containerIdOrName> bash

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

Auch um Bash zu beenden, ohne Bash in einem Schurkenprozess laufen zu lassen:

exit

Ja, so einfach ist es.

Obwohl der Autor der Frage ausdrücklich gesagt hat, dass er an einem laufenden Container interessiert ist, ist es auch erwähnenswert, dass der Container ausgeführt werden kann, wenn er nicht ausgeführt wird, Sie ihn jedoch ausführen möchten, um herumzustöbern:

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

Versuchen Sie dies:

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

Quelle: https://docs.docker.com/engine/reference/commandline/run/

Basierend auf @ Timurs Antwort habe ich Folgendes erstellt praktisches Skript

Setup

Setzen docker-ssh datei in Ihrem $PATH mit folgenden Inhalten

#!/bin/bash -xe# docker container id or name might be given as a parameterCONTAINER=$1if [[ "$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

Beachten: Einige Behälter enthalten nicht bash, aber ash, sh usw. In diesen Fällen bash wird im obigen Skript ersetzt.

Nutzung

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

$> docker-ssh 

Andernfalls geben Sie ihm einen Docker-ID-Parameter, den Sie von erhalten docker ps (erste Spalte)

$> docker-ssh 50m3r4nd0m1d

Wenn in Ihrem Container keine bash installiert ist, können Sie sh ausprobieren:

docker exec -it CONTAINER /bin/sh

Oder suchen Sie zuerst nach Muscheln in / bin:

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

Ich habe einen containerisierten SSH-Server erstellt, der jedem laufenden Container SSH-Funktionen bereitstellt. 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 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

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

@jpetazzo hat eine toller 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...

Jubel

Sie können dem Docker-Container auch eine routingfähige IP-Adresse mit Rohrleitungen geben und danach mit dieser neuen IP-Adresse auf den Computer SSH.

Dies wird "traditioneller" (ssh) sein, anstatt einen anwendungsspezifischen Befehl wie zu verwenden docker attach, und wird es schließlich 'portabler' über Systeme und Versionen hinweg machen.

Manchmal ist es praktisch, ssh in einen Docker-Container zu können, insbesondere während der Entwicklung. Das folgende Docker-Image ermöglicht das SSH in einen Container mit einem privaten Schlüssel:

UbuntuWithSSH-Docker

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

Beachten Sie, dass die Verwendung von SSH zum Einschlagen in laufende Container eine schlechte Praxis ist - siehe [Begründung hier] (If you run SSHD in your Docker containers, you're doing it wrong! /). sudo docker exec -i -t containername / bin bash’ ist ein Weg zu gehen.

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