2014-04-11 6 views

risposta

32

Ci sono diverse cose che si deve fare per consentire ssh'ing a un contenitore in esecuzione in una VM:.

  1. installare ed eseguire sshd nel contenitore (example) sshd non è lì per default, perché i contenitori in genere eseguite solo processo, anche se possono funzionare come molti come si desidera
  2. .
  3. EXPOSE una porta come parte della creazione dell'immagine, in genere 22, in modo che quando si esegue il contenitore, il daemon si connette alla porta 'EXPOSE' all'interno del contenitore e qualcosa può essere esposto all'esterno del contenitore.
  4. Quando si esegue il contenitore, è necessario decidere come mappare quella porta. Puoi lasciare che Docker lo faccia automaticamente o essere esplicito. Suggerirei di essere esplicito: docker run -p 42222:22 ... che mappa la porta 42222 sulla VM alla porta 22 nel contenitore.
  5. Aggiungere una portmap alla VM per esporre la porta all'host. per esempio. quando la vostra macchina virtuale non è in esecuzione, è possibile aggiungere una mappatura come questo: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Poi dal vostro ospite, si dovrebbe essere in grado di ssh alla porta 42222 sull'host per raggiungere ssh daemon del contenitore.

Ecco cosa succede quando eseguo i passaggi precedenti:

$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222" 
$ ./boot2docker start 
[2014-04-11 12:07:35] Starting boot2docker-vm... 
[2014-04-11 12:07:55] Started. 
$ docker run -d -p 42222:22 dhrp/sshd 
Unable to find image 'dhrp/sshd' (tag: latest) locally 
Pulling repository dhrp/sshd 
2bbfe079a942: Download complete 
c8a2228805bc: Download complete 
8dbd9e392a96: Download complete 
11d214c1b26a: Download complete 
27cf78414709: Download complete 
b750fe79269d: Download complete 
cf7e766468fc: Download complete 
082189640622: Download complete 
fa822d12ee30: Download complete 
1522e919ec9f: Download complete 
fa594d99163a: Download complete 
1bd442970c79: Download complete 
0fda9de88c63: Download complete 
86e22a5fdce6: Download complete 
79d05cb13124: Download complete 
ac72e4b531bc: Download complete 
26e4b94e5a13b4bb924ef57548bb17ba03444ca003128092b5fbe344110f2e4c 
$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
26e4b94e5a13  dhrp/sshd:latest /usr/sbin/sshd -D  6 seconds ago  Up 3 seconds  0.0.0.0:42222->22/tcp loving_einstein  
$ ssh [email protected] -p 42222 
The authenticity of host '[localhost]:42222 ([127.0.0.1]:42222)' can't be established. 
RSA key fingerprint is .... 
Are you sure you want to continue connecting (yes/no)? yes 
Warning: Permanently added '[localhost]:42222' (RSA) to the list of known hosts. 
[email protected]'s password: screencast 
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64) 

* Documentation: https://help.ubuntu.com/ 

The programs included with the Ubuntu system are free software; 
the exact distribution terms for each program are described in the 
individual files in /usr/share/doc/*/copyright. 

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by 
applicable law. 

[email protected]:~# exit 
logout 

in modo che mostra ssh-> localhost 42222-> porta VM 42222-> porto container 22.

1

Se si desidera ottenere nel contenitore funzionante, potresti prendere in considerazione l'utilizzo di nsenter. Ecco un semplice script di bash (suggested by Chris Jones) che è possibile utilizzare per accedere a un contenitore di finestra mobile. Salvarlo da qualche parte nel vostro $PATH come finestra mobile-entrare e chmod +x

#!/bin/bash 
set-e 
# Check for nsenter. If not found, install it 
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter' 
# Use bash if no command is specified 
[email protected] 
if[[ $# = 1 ]]; then 
    args+=(/bin/bash) 
fi 

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "${args[@]}" 

Quindi è possibile eseguire docker-enter 89af3d (o qualsiasi configurazione si vuole entrare)

0

Una variante leggermente modificata di risposta di Michael che richiede solo il contenitore si vogliono entrare essere chiamato (APPNAME):

boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter' 

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter $(docker ps | grep $APPNAME | awk '{ print $1 }') 
32

Docker ha aggiunto il comando docker exec a Docker 1.3.0. È possibile connettersi a un contenitore in esecuzione utilizzando quanto segue:

docker exec -it <container id> /bin/bash 

Che si connetterà a un prompt di bash sul contenitore in esecuzione.

+3

questo è molto più semplice della risposta accettata –

+0

Funziona anche con la finestra mobile-comporre come 'finestra mobile-comporre eseguire /bin/bash' –