2 formas de SSH en un contenedor Docker en ejecución

En este tutorial, veremos cómo obtener bash shell en un contenedor Docker que se ejecuta en segundo plano. También cubrirá cómo ssh en un contenedor docker que se inició y se dejó ejecutándose en segundo plano sin una sesión de consola activa.

La adopción de Docker ha sido tremenda, especialmente en el mundo de los microservicios y el desarrollo. La mayoría de los contenedores Docker que se ejecutan durante largos períodos de tiempo no tienen una consola de shell activa. Probablemente te conectes a bash shell bajo demanda, es decir, cuando desee ejecutar algunos comandos en el terminal. Una alternativa a esto será ssh al contenedor usando una dirección IP.

Consiguiendo bash de un contenedor que se ejecuta en segundo plano se puede lograr de dos maneras

1) Usando el comando docker exec

El motor de Docker tiene una herramienta de línea de comandos que se utiliza para interactuar con los contenedores. La opción de comando ejecutivo se utiliza para ejecutar un comando en un contenedor en ejecución. Al pasar algunos parámetros, deberíamos poder obtener bash sesión. La sintaxis de comando utilizada es:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

A continuación se muestra una lista de opciones que se pueden usar con esto.

-d, –detach Modo independiente: ejecutar comando en segundo plano
-i, –interactivo Mantenga STDIN abierto incluso si no está conectado
-t, –tty Asignar un pseudo-TTY
-u, –usuario cadena Nombre de usuario o UID (formato: [:<group|gid>])
-w, –workdir string Directorio de trabajo dentro del contenedor

Nuestro interés está en las opciones -t y -I ya que bash tiene que ejecutarse en modo interactivo. Consideremos un example para dejar esto en claro.

Extraiga la imagen de Nginx Docker:

# docker pull nginx 
Using default tag: latestlatest: Pulling from library/nginx
f2aa67a397c4: Pull complete 3c091c23e29d: Pull complete 4a99993b8636: Pull complete 
Digest: sha256:0edf702c890e9518b95b2da01286509cd437eb994b8d22460e40d72f6b79be49Status: 
Downloaded newer image for nginx:latest

Inicie un contenedor de prueba en segundo plano según la imagen de la ventana acoplable descargada.

# docker run --name nginx-bg -d nginx 
3bd76e19ad6ce2ff15657ebf4de4cc42eb503c55f608071a438de6ca709ba73b

Esto iniciará un contenedor llamado nginx-bg en el fondo de nginx imagen de Docker. Verifique para confirmar que el contenedor se está ejecutando:

# docker ps

Ahora ejecute el siguiente comando para obtener bash consola en este contenedor.

# docker exec -it nginx-bg /bin/bash
root@3bd76e19ad6c:/# apt-get update
Get:2 https://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 https://cdn-fastly.deb.debian.org/debian stretch InRelease 
Get:3 https://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Hit:4 https://cdn-fastly.deb.debian.org/debian stretch Release
Fetched 185 kB in 2s (83.4 kB/s) 
Reading package lists... Done

donde nginx-bg es el nombre del contenedor y /compartimiento/bash es el camino a bash binario en el contenedor. Una vez que haya terminado de ejecutar comandos en bash shell, puede salir escribiendo el comando exit.

root@3bd76e19ad6c:/# exit

2) Usando el comando adjuntar docker

Un método alternativo a Docker Exec es Docker Attach. La sintaxis es

# docker attach <container-name>

Entonces, en nuestro caso, ejecutaremos:

# docker attach nginx-bg

Esto debería llevarte a bash shell por defecto.

ssh en un contenedor en ejecución

Si desea enviar un ssh a un contenedor Docker en ejecución, necesita la dirección IP del contenedor o el nombre de host configurado en / etc / hosts o un registro DNS válido en su red.

Si no conoce la dirección IP del contenedor, puede obtenerla usando el siguiente comando:

export INSTANCE_NAME="nginx-bg"
docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $INSTANCE_NAME

Ejemplo:

# export INSTANCE_NAME="nginx-bg"
# docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" $INSTANCE_NAME
172.17.0.7

Tenga en cuenta que puede reemplazar el nombre del contenedor con su ID. Conseguimos que la dirección IP sea 172.17.0.7, intente hacer ping para ver si responde.

# ping -c 2 172.17.0.7

PING 172.17.0.7 (172.17.0.7) 56(84) bytes of data.
64 bytes from 172.17.0.7: icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from 172.17.0.7: icmp_seq=2 ttl=64 time=0.058 ms
--- 172.17.0.7 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.058/0.082/0.107/0.026 ms

Debe haber configurado ssh en el contenedor antes de ejecutar el comando ssh en él. Una vez configurado, puede acceder a él mediante el nombre de usuario y la dirección IP del contenedor.

# ssh [email protected] 
[email protected]'s password: 
Linux 672175da3a51 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@672175da3a51:~#

SSH sin contraseña entre contenedores

Si necesita autenticación sin contraseña, considere copiar su clave pública SSH al contenedor cuando lo ejecute. No recomiendo crear una imagen con la clave pública, sino tener el archivo en el sistema host que tiene todas las claves públicas autorizadas.

Creemos un archivo:

# mkdir ~/container-ssh-keys
# vim  ~/container-ssh-keys/authorized_keys
# chmod 0600 ~/container-ssh-keys/authorized_keys

Luego agregue su clave SSH pública al archivo, puede agregar tantas como desee. Ahora, cuando inicie el contenedor, asigne este archivo a /root/.ssh/authorized_keys en el contenedor, p. ej.

# docker run --name mycon -it -v $HOME/container-ssh-keys/authorized_keys:/root/.ssh/authorized_keys 
ubuntu:16.04 /bin/bash

Entonces debería poder ssh desde su sistema host con el par de claves privadas para la clave pública copiada sin que se le solicite la contraseña.

# ssh root@container-ip

Lea también:

  • Cómo configurar DockerUI: una interfaz web para Docker
  • 20 contenedores de Docker impresionantes para un usuario de escritorio

Esto marca el final de la guía. Espero que esto haya sido útil y una buena referencia al trabajar con contenedores Docker.