Domanda

Io uso Docker su OSX con boot2docker .

Voglio ottenere una connessione SSH dal mio terminale in un contenitore in esecuzione.

Ma non posso farlo: (

Penso che sia perché Docker è in esecuzione in una macchina virtuale.

È stato utile?

Soluzione

Ci sono molte cose che devi fare per abilitare ssh'ing a un contenitore in esecuzione in una VM:

    .
  1. Installare ed eseguire sshd nel tuo contenitore ( Esempio ). sshd non è lì per impostazione predefinita perché i contenitori in genere eseguono solo un solo processo, anche se possono correre quanti ne vuoi.
  2. EXPOSE una porta come parte della creazione dell'immagine, tipicamente 22, in modo che quando si esegue il contenitore, il daemon si connette alla porta EXPOSE'd all'interno del contenitore e qualcosa può essere esposto all'esterno del contenitore. .
  3. Quando si esegue il contenitore, è necessario decidere come mappare questa 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.
  4. Aggiungi un portmap alla VM per esporre la porta al tuo host. per esempio. Quando il tuo VM non è in esecuzione, puoi aggiungere una mappatura come questa: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
  5. Poi dal tuo host, dovresti essere in grado di ssh a Port 42222 sull'host per raggiungere il daemon SSH 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 root@localhost -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.
    root@localhost'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.
    
    root@26e4b94e5a13:~# exit
    logout
    
    .

    In modo che spettacoli ssh-> localhost 42222-> porta VM 42222-> porta del contenitore 22.

Altri suggerimenti

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 bash sul contenitore corrente.

Se vuoi solo entrare nel contenitore in esecuzione, potresti prendere in considerazione l'utilizzo di nsenter .Ecco un semplice script di bash ( suggerito daChris Jones ) che è possibile utilizzare per entrare in un contenitore Docker.Salvalo da qualche parte nel tuo $PATH come Docker-enter 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
args=$@
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 che desideri inserire)

Una variante leggermente modificata della risposta di Michael che richiede solo il contenitore che si desidera inserire essere denominato (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 }')
.

Ho testato questo per un'immagine Ubuntu 16.04 in esecuzione su un host con lo stesso sistema operativo, Docker 18.09.2, dovrebbe funzionare anche per Boot2Docker con modifiche minori.

Costruisci l'immagine. Eseguilo nel contenitore di sfondo ( youruser potrebbe essere root):

$ docker run -ditu <youruser> <imageId>

Attaccati ad esso con una shell:

$ docker exec -it <containerId> /bin/bash

Installare il server OpenSSH (sudo Necessario Se YourUser non è root, il comando potrebbe differire per Boot2Docker):

$ sudo apt-get install -y openssh-server

Eseguilo:

$ sudo service ssh start

(il passo seguente è facoltativo, se YourUser ha una password, è possibile saltarlo e fornire la password ad ogni connessione SSH).

Creare un tasto RSA sull'host del client:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_rsa.
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub.
.

Sull'immagine Docker, creare una directory $HOME/.ssh:

$ cd
$ mkdir .ssh && cd .ssh
$ vi authorized_keys
.

Copia e incolla il contenuto di $HOME/.ssh/id_rsa.pub sul computer client a authorized_keys sull'immagine Docker e salvare il file.

(fine del passaggio facoltativo).

Jot Down l'indirizzo IP dell'immagine:

$ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  63448863ac39
^^^^^^^^^^ this
.

Ora la connessione dall'host del client dovrebbe essere efficace:

$ ssh 172.17.0.2
Enter passphrase for key '/home/youruser/.ssh/id_rsa': 
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-46-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Fri Apr  5 09:50:30 2019 from 172.17.0.1
.

Ovviamente è possibile applicare la procedura sopra indicata non interattivamente nel tuo Dockerfile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top