run para mac community macos ssh docker boot2docker linux-containers

macos - para - homebrew docker



Cómo obtener conexión ssh con el contenedor docker en OSX(boot2docker) (5)

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

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

Eso se conectará a un mensaje de bash en el contenedor en ejecución.

Yo uso docker en OSX con boot2docker .

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

Pero no puedo hacer esto :(

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


Hay varias cosas que debes hacer para habilitar el ssh''ing en un contenedor que se ejecuta en una máquina virtual:

  1. instale y ejecute sshd en su contenedor ( example ). sshd no está allí de forma predeterminada porque los contenedores normalmente ejecutan solo un proceso, aunque pueden ejecutar tantos como desee.
  2. EXPOSE un puerto como parte de la creación de la imagen, generalmente 22, de modo que cuando ejecuta el contenedor, el demonio se conecta al puerto de EXPOSE dentro del contenedor y algo puede quedar expuesto en el exterior del contenedor.
  3. Cuando ejecute el contenedor, debe decidir cómo asignar ese puerto. Puedes dejar que Docker lo haga automáticamente o sea explícito. Yo sugeriría ser explícito: la docker run -p 42222:22 ... que asigna el puerto 42222 en la VM al puerto 22 en el contenedor.
  4. Agregue un mapa de puertos a la máquina virtual para exponer el puerto a su host. por ejemplo, cuando su VM no se está ejecutando, puede agregar una asignación como esta: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Luego, desde su host, debería poder ssh al puerto 42222 en el host para alcanzar el 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

Así que eso muestra ssh-> localhost 42222-> VM puerto 42222-> puerto contenedor 22.


He probado 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. Ejecutarlo en el contenedor de fondo (su usuario puede ser root):

$ docker run -ditu <youruser> <imageId>

Adjuntar con una concha:

$ 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 omitirla 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 $HOME/.ssh acoplable, cree un directorio $HOME/.ssh :

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

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

(Fin de paso opcional).

Apunte la dirección IP de su 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 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.


Si solo desea ingresar al contenedor en ejecución, puede considerar usar nsenter . Aquí hay un simple script de bash ( sugerido por Chris Jones ) que puede usar para ingresar a un contenedor docker. 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[@]}"

Luego puede ejecutar docker-enter 89af3d (o la configuración que desee ingresar)


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