Domanda Come ottenere bash o ssh in un contenitore in esecuzione in modalità background?


Voglio ssh o bash in un contenitore mobile in esecuzione. Per favore, vedi l'esempio:

$ 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 

ora voglio ottenere qualcosa di simile (entra nel contenitore funzionante):

$ 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:/#

Ho usato Vagrant e mi piacerebbe avere un comportamento simile a vagrant ssh.


795
2017-08-01 16:19


origine


in alternativa sudo docker exec -i -t 665b4a1e17b6 /bin/sh essere in grado di installare programmi e pacchetti adatti - fonjeekay


risposte:


La risposta è Docker's attach comando. Quindi, per il mio esempio sopra, la soluzione sarà:

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

Per Docker versione 1.3 o successiva: grazie all'utente WiR3D chi ha suggerito un altro modo per ottenere il guscio di un contenitore. Se usiamo attach possiamo usare solo un'istanza della shell. Quindi, se vogliamo aprire un nuovo terminale con una nuova istanza della shell di un contenitore, dobbiamo solo eseguire quanto segue:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

o

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

1178
2017-08-05 06:01



In alternativa, esegui sudo docker attach loving_heisenberg - thiagowfx
il comando attach non funziona per me, fa sì che la finestra mobile si congeli. Qualche idea sul perché avvenga? - Mo J. Mughrabi
Un promemoria per gli utenti di boot2docker: rimuovere sudo :) - Henno
-i -t equivale -it - pasha.zhukov
Questa è una risposta pericolosa da selezionare e così altamente votata. docker attachad esempio, un'istanza di MongoDB, ucciderà l'istanza. Come spiegato in maggior dettaglio in questa domanda  attach e exec sono diversi animali. - fwc


Da Docker 1.3 in poi:

docker exec -it <containerIdOrName> bash

Fondamentalmente, se il contenitore Docker è stato avviato utilizzando il /bin/bash comando puoi accedervi usando attach. In caso contrario, è necessario eseguire il comando per creare un'istanza di Bash all'interno del contenitore utilizzando exec.

Anche per uscire da Bash senza lasciare Bash in esecuzione in un processo canaglia:

exit

Sì, è così semplice.


585
2017-10-29 07:46



ancora non ho capito come ottenere nano al lavoro. Supponiamo che possa coinvolgere docker-ssh dalla phusion - WiR3D
C'è un modo per impostare bash di default nei dockers? - ipeacocks
@ipeacocks si, se il RUN il comando nel file Docker è /bin/bash. Ma dipende da cosa intendi. Se si desidera eseguire il contenitore e avere bash disponibile immediatamente nello stesso terminale, quindi in esecuzione con -it dovrebbe farlo - WiR3D
L'uso del gruppo docker è una cattiva pratica. Qualsiasi utente che si trova nel gruppo mobile è essenzialmente utilizzato con i permessi di root senza la necessità di usare sudo. projectatomic.io/blog/2015/08/... - Maiku Mori
Penso che non faccia molta differenza, dal punto di vista della sicurezza dell'ospite, se lo usi sudo vs docker gruppo. Ad ogni modo, c'è un buco di sicurezza incorporato nella finestra mobile che può fornire i privilegi completi nel file system host dal guest, indipendentemente dal fatto che si utilizzi il gruppo docker o sudo per avviare il contenitore. - nobar


Anche se l'autore della domanda ha detto esplicitamente che sono interessati a un contenitore funzionante, vale la pena notare che se il contenitore non è in esecuzione, ma vorresti eseguirlo per attirare l'attenzione, puoi eseguire:

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


101
2017-11-07 18:46



Questo dà un contenitore diverso, proprio come la risposta di @ kraxor. - Blaisorblade


Prova questo:

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

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


24
2017-08-01 16:29



Non è adatto, perché ottengo diversi ID del CONTAINER (root@42f1e37bd0e5:/# e non root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
link è morto, dovresti aggiornare - Ahmet Karakaya


Sulla base della risposta di @ Timur, ho creato quanto segue script a portata di mano

Impostare

Mettere docker-ssh file nel tuo $PATH con i seguenti contenuti

#!/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

Nota: Alcuni contenitori non contengono bash, ma ash, sh ecc. In questi casi bash deve essere sostituito nello script sopra.

uso

Se hai una istanza in esecuzione semplicemente esegui

$> docker-ssh 

Altrimenti fornitelo con un parmeter id docker da cui vieni docker ps (prima colonna)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Posso sapere perché abbiamo bisogno di -l alla fine? - Nam G VU
per avviare bash come shell di login, leggendo i parametri dell'ambiente (descritti nella riga sopra il comando) - Matyas


Ho creato un server SSH containerizzato che fornisce funzionalità SSH a qualsiasi contenitore in esecuzione. Non è necessario cambiare il contenitore. L'unico requisito è che il contenitore abbia bash.

Se hai un contenitore con il nome "web-server1". Il seguente comando di esecuzione della finestra mobile avvia un secondo contenitore che fornisce SSH per il primo contenitore.

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

Per ulteriori indicazioni, checkout https://github.com/jeroenpeeters/docker-ssh


8
2017-10-03 16:20



Questa dovrebbe essere la risposta accettata ^ - Nam G VU
A proposito, come possiamo avere .bashrc auto caricato all'avvio di una sessione ssh usando la tua soluzione? Inoltre ha pubblicato un problema su github github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


@jpetazzo ha un post fantastico su questo argomento. La risposta breve sarebbe da usare nsenter:

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

P.S .: Non dimenticare di controllare la discussione nei commenti del post ...

Saluti


5
2018-03-14 10:12



Questo è un post piuttosto vecchio non è più realmente necessario. @ WiR3D di docker exec la soluzione è piuttosto più conveniente. - drevicko