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


934

Voglio ssh o bash in un contenitore docker in esecuzione. Per favore, vedi 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 del genere (andare nel contenitore corrente):

$ 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.


in alternativa sudo docker exec -i -t 665b4a1e17b6 /bin/shper poter installare programmi e pacchetti apt
fonjeekay

1
Si noti che l'utilizzo di SSH per colpire nel container in esecuzione è una pratica inadeguata - vedere la logica qui . sudo docker exec -i -t container-name /bin/bashè una strada da percorrere.
patryk.beza,

Risposte:


1306

La risposta è il attachcomando di Docker . 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 successive: grazie all'utente WiR3D che ha suggerito un altro modo per ottenere la shell di un container. Se usiamo attachpossiamo 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:/#

5
In alternativa, eseguisudo docker attach loving_heisenberg
Thiago Perrotta il

51
il comando attach non funziona per me, provoca il blocco della finestra mobile .. qualche idea sul perché sta accadendo?
Mo J. Mughrabi,

10
Un promemoria per gli utenti boot2docker: rimuovi sudo :)
Henno il

17
-i -tè uguale a-it
pasha.zhukov il

47
Questa è una risposta pericolosa da selezionare e così votata. docker attachl'ing in un'istanza MongoDB, ad esempio, ucciderà l'istanza. Come spiegato più in dettaglio in questa domanda attach e execsono diversi animali.
fwc,

676

Da Docker 1.3 in poi:

docker exec -it <containerIdOrName> bash

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

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

exit

Sì, è così semplice.


non ho ancora capito come far funzionare nano. Pensa che potrebbe coinvolgere docker-ssh dalla
phusion

C'è un modo per impostare bash di default nelle finestre mobili?
ipeacocks

@ipeacocks sì, se il RUNcomando nel file docker è /bin/bash. Ma dipende da cosa intendi. Se vuoi eseguire il container e avere bash immediatamente disponibile nello stesso terminale, allora correre con -itdovrebbe farlo
WiR3D

10
L'uso del gruppo docker è una cattiva pratica. Qualsiasi utente che si trova nel gruppo finestra mobile viene utilizzato essenzialmente con autorizzazioni di root senza la necessità di utilizzare sudo. projectatomic.io/blog/2015/08/…
Maiku Mori

1
Penso che non fa molta differenza, dal punto di vista della sicurezza ospite, che si utilizzi sudovs dockergruppo. In entrambi i casi, esiste una falla di sicurezza integrata nella finestra mobile che può fornire all'ospite i privilegi completi nel file system host, indipendentemente dal fatto che si usi il gruppo finestra mobile o sudoper avviare il contenitore.
nobar,

123

Anche se l'autore della domanda ha affermato specificamente di essere interessato a un container in esecuzione, vale anche la pena notare che se il container non è in esecuzione, ma si desidera eseguirlo per curiosare, è possibile eseguire:

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


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


19

Sulla base della risposta di @ Timur, ho creato il seguente script utile

Impostare

Inserisci il docker-sshfile nel tuo $PATHcon 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, shecc. In questi casi bashdevono essere sostituiti nello script precedente.

uso

Se hai solo un'istanza in esecuzione, esegui semplicemente

$> docker-ssh 

Altrimenti, forniscigli un parametro id docker da cui ottieni docker ps(primo col)

$> docker-ssh 50m3r4nd0m1d

Posso sapere perché alla fine abbiamo bisogno di -l?
Nam G VU,

avviare bash come shell di login, leggendo i parametri di ambiente (descritti nella riga sopra il comando)
Matyas

13

Se il tuo contenitore non ha bash installato, puoi provare sh:

docker exec -it CONTAINER /bin/sh

Oppure cerca prima le shell in / bin:

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

Che cos'è il "console" ? Hai un riferimento per questo? Vuoi dire "console" ?
Peter Mortensen,

9

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

Se si dispone di un contenitore con nome "web-server1". Il seguente comando di esecuzione docker avvierebbe un secondo contenitore che avrebbe fornito 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 suggerimenti, controlla https://github.com/jeroenpeeters/docker-ssh


Questa dovrebbe essere la risposta accettata ^
Nam G VU

A proposito, come possiamo caricare automaticamente .bashrc all'avvio di una sessione ssh usando la tua soluzione? Ha anche pubblicato un problema su github github.com/jeroenpeeters/docker-ssh/issues/30
Nam G VU

6

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

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

PS: non dimenticare di controllare la discussione nei commenti del post ...

Saluti


1
Questo è un post piuttosto vecchio che non è più veramente necessario . La docker execsoluzione di @ WiR3D è piuttosto più conveniente.
drevicko,

4

È inoltre possibile assegnare al contenitore Docker un indirizzo IP instradabile con Pipework e successivamente SSH nella macchina con quel nuovo indirizzo IP.

Questo sarà più "tradizionale" (ssh), invece di usare un comando specifico dell'applicazione come docker attach, e alla fine lo renderà più "portatile" tra sistemi e versioni.


Per favore, aggiungi il modo semplice come farlo. Se devo essere sincero, ne ho davvero bisogno, ma non ho tempo per cercare la soluzione più semplice. Potresti pubblicare la tua risposta qui? Sarebbe fantastico ..
Timur Fayzrakhmanov,

2
Ci sono 2 modi per farlo, ma non è semplice e diventerebbe un post di grandi dimensioni. Puoi controllare questo link da solo, per usare pipework o questo link , streghe essenzialmente realizza lo stesso di Pipework ed è un po 'più semplice, ma devi farlo manualmente. Quindi dipende da quanti server parlano. Se non riesci a capire qualcosa di più specifico, fammi sapere. Ma non ho nemmeno il tempo di scrivere un tutorial completo.
Radriaanse,

Hai ragione: non esiste un modo ovvio e semplice per farlo (Grazie per i collegamenti, penso che lo
rivedrò



1

ANDARE ALL'INTERNO

installa lo goinsidestrumento da riga di comando con:

sudo npm install -g goinside

e vai all'interno di un contenitore docker con una dimensione terminale corretta con:

goinside docker_container_name

per maggiori dettagli controlla questo .


0

Per colpire in un contenitore in esecuzione, digitare questo:

docker exec -t -i container_name /bin/bash

1
questa è la stessa risposta di @AdamKalnas
Bruni,

0

Solo per informazione. Se è necessario accedere a un contenitore semplice che non sia un demone, è necessario utilizzare i seguenti comandi:

docker start {id}
docker attach {id}

-1

se il contenitore viene arrestato come ad esempio un contenitore di soli dati, una buona soluzione è eseguire un contenitore usa e getta ogni volta che si desidera collegarlo al contenitore di dati. In questo caso il contenitore di dati stesso potrebbe essere completamente vuoto, poiché il contenitore temporaneo avrebbe gli strumenti del sistema operativo.

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.