Pregunta

Yo uso Docker en OSX con boot2docker.

Quiero obtener una conexión Ssh desde mi terminal a un contenedor en ejecución.

Pero no puedo hacer esto :(

Creo que es porque Docker se ejecuta en una máquina virtual.

¿Fue útil?

Solución

Hay varias cosas que debe hacer para permitir que SSH'ing sea un contenedor que se ejecuta en una VM:

  1. Instale y ejecute sshd en su contenedor ( ejemplo ). sshd no está allí de forma predeterminada porque los contenedores suelen ejecutar solo un proceso, aunque pueden ejecutar tantos como quieras.
  2. EXPOSE Un puerto como parte de la creación de la imagen, típicamente 22, de modo que cuando ejecute el contenedor, el demonio se conecta al puerto de EXPOSE'd dentro del contenedor y algo se puede exponer en el exterior del contenedor.
  3. Cuando ejecuta el contenedor, debe decidir cómo asignar ese puerto. Puede dejar que Docker lo haga automáticamente o sea explícito. Sugeriría ser explícito: docker run -p 42222:22 ... que mapea el puerto 42222 en la VM a puerto 22 en el contenedor.
  4. Agregue un portMap a la VM para exponer el puerto a su host. p.ej. Cuando su VM no se está ejecutando, puede agregar un mapeo como este: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
  5. Luego de su anfitrión, debe poder ssh al puerto 42222 en el host para llegar al demonio ssh del contenedor.

    Esto es lo que sucede cuando realizo los pasos anteriores:

    $ 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
    

    Entonces, eso muestra ssh-> localhost 42222-> vm puerto 42222-> Puerto de contenedor 22.

Otros consejos

Docker ha agregado el comando docker exec a DOCTER 1.3.0.Puede conectarse a un contenedor de ejecución utilizando lo siguiente:

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

que se conectará a un indicador de bash en el contenedor de ejecución.

Si solo desea ingresar al contenedor en ejecución, puede considerar usar nsenter.Aquí hay un script bash simple (sugerido por Chris Jones) que puede usar para ingresar a un contenedor acoplable.Guárdalo en algún lugar de tu $PATH como docker-enter y 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[@]}"

Entonces puedes correr docker-enter 89af3d (o cualquier configuración que quieras ingresar)

Una variante ligeramente modificada de la respuesta de Michael que solo requiere que el contenedor desea ingresar sea nombrado (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 }')

Probé esto para una imagen de Ubuntu 16.04 que se ejecuta en un host con el mismo sistema operativo, Docker 18.09.2, también debería funcionar para boot2Docker con modificaciones menores.

Construye la imagen.Ejecútelo en el contenedor en segundo plano (tu usuario puede ser raíz):

$ docker run -ditu <youruser> <imageId>

Adjuntarlo con un caparazón:

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

Instale el servidor openssh (sudo solo es necesario si su usuario no es root, el comando puede diferir para boot2Docker):

$ sudo apt-get install -y openssh-server

Ejecutarlo:

$ sudo service ssh start

(El siguiente paso es opcional; si su usuario tiene una contraseña, puede omitirlo y proporcionar la contraseña en cada conexión ssh).

Cree una clave RSA en el host del cliente:

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

En la imagen de la ventana acoplable, cree un directorio. $HOME/.ssh:

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

Copia y pega el contenido de $HOME/.ssh/id_rsa.pub en la máquina cliente para authorized_keys en la imagen de la ventana acoplable y guarde el archivo.

(Fin del paso opcional).

Anota la dirección IP de tu imagen:

$ 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

Ahora la conexión desde el host del cliente debería ser efectiva:

$ 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

Por supuesto, puede aplicar el procedimiento anterior de forma no interactiva en su Dockerfile.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top