bash - hub - acceder al túnel ssh del host desde el contenedor docker
docker run (2)
Creo que puedes hacerlo agregando --net=host
a la ejecución de tu docker. Pero vea también esta pregunta: Reenviar el puerto del host al contenedor de la ventana acoplable
Usando ubuntu tusty, hay un servicio que se ejecuta en una máquina remota, a la que puedo acceder a través del reenvío de puertos a través de un túnel ssh desde localhost:9999
.
Tengo un contenedor docker funcionando. Necesito acceder a ese servicio remoto a través del túnel del host, desde dentro del contenedor.
Intenté hacer un túnel desde el contenedor al host con -L 9000:host-ip:9999
, y luego acceder al servicio a través de 127.0.0.1:9000
desde el interior del contenedor no se pudo conectar. Para verificar si la asignación de puertos estaba nc -luv -p 9999 # at host nc -luv -p 9000 # at container
, probé nc -luv -p 9999 # at host nc -luv -p 9000 # at container
siguiendo esto, parag. 2 pero no se percibió comunicación, incluso al hacer nc -luv host-ip -p 9000
en el contenedor
También intenté mapear los puertos a través de la docker run -p 9999:9000
, pero esto informa que el enlace falló porque el puerto del host ya está en uso (desde el túnel del host a la máquina remota, probablemente).
Así que mis preguntas son
1 - ¿Cómo lograré la conexión? ¿Necesito configurar un túnel ssh para el host o esto se puede lograr solo con la asignación de puertos de la ventana acoplable?
2 - ¿Cuál es una forma rápida de probar que la conexión está funcionando? Via bash, preferiblemente.
Gracias.
Usar su red de hosts como red para sus contenedores a través de --net=host
o en docker-compose a través de network_mode: host
es una opción pero esto tiene el efecto secundario no deseado de que (a) ahora expone los puertos de contenedores en su sistema host y ( b) que ya no puede conectarse a esos contenedores que no están asignados a su red host.
En su caso, una solución más rápida y limpia sería hacer que su túnel ssh esté disponible para su sistema host (es decir, su puente docker0
) en lugar de exponer sus contenedores docker en su entorno host (como se sugiere en la respuesta aceptada).
Configuración del túnel:
Para que esto funcione, recupere la ip que docker0
puente docker0
mediante:
ifconfig
Verás algo como esto:
docker0 Link encap:Ethernet HWaddr 03:41:4a:26:b7:31
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
Ahora necesita decirle a ssh que se enlace a esta ip para escuchar el tráfico dirigido hacia el puerto 9000 a través de
ssh -L 172.17.0.1:9000:host-ip:9999
Sin establecer la dirección de vinculación,: :9000
only estaría disponible para la interfaz de bucle de retorno de su host y no per se para sus contenedores docker.
Nota al margen: también puede vincular su túnel a 0.0.0.0
, lo que hará que ssh escuche todas las interfaces.
Configurando tu aplicación:
En su aplicación en contenedor, use el mismo docker0
ip para conectarse al servidor: 172.17.0.1:9000
. Ahora el tráfico que se enruta a través de su puente docker0
también llegará a su túnel ssh :)
Por ejemplo, si tiene una aplicación "DOT.NET Core" que necesita conectarse a una base de datos remota ubicada en :9000
, su "ConnectionString" contendría "server=172.17.0.1,9000;