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:
- 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. -
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 deEXPOSE
dentro del contenedor y algo puede quedar expuesto en el exterior del contenedor. - 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. - 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 }'')