Exponer contenedores de Docker en Internet con Ngrok

Exponer contenedores de Docker en Internet con Ngrok

Imaginemos el siguiente panorama, estamos ejecutando un servicio, API o aplicación en un contenedor de Docker de manera local y quieres dar acceso a tus clientes para que vean el avance del proyecto, a ti mismo para poder visualizar el diseño en tu teléfono o a algún compañero que se encuentre trabajando en otra ciudad. Probablemente viene a tu mente utilizar el servicio de ngrok para esto pero ¿Cómo podemos usarlo con los contenedores de Docker? La solución a esto es más sencillo de lo que imaginas.

El primer paso para esto es crear una red de Docker, el motivo de esto es que ngrok necesita ser capaz de poder ver el puerto del servicio que queremos compartir para así poder generar una URL efímera que podamos compartir por medio de Internet.

Todo esto suena un poco confuso así que vamos al grano.

docker network create myngroknet

En este ejemplo estamos creando una red con el nombre de myngroknet y todos los contenedores que vayamos a crear deberán utilizar esta red.

Ahora vamos a crear nuestro contenedor de manera habitual con la única diferencia de que vamos a indicar el nombre de la red que acabos de crear para que sea utilizada en el contenedor de nuestra aplicación.

docker container run -d -p 80 --net myngroknet --name www nginx

Este comando creará un contenedor con la imagen de nginx el cual solamente mostará la página de bienvenida de nginx. Noten como aquí estamos usando el parámetro --net para indicar el nombre de la red.

Ahora vamos a crear otro contenedor con la imagen de ngrok y lo vamos a asociar a la misma red, esto permitirá que nuestro contenedor de ngrok pueda tener acceso al contenedor de nginx utilizando www como hostname y tendremos que exponer el puerto 4040, el cual es utilizado por el servicio de ngrok.

docker container run -d -p 4040:4040 --net myngroknet --name ngrok wernight/ngrok ngrok http www:80

A continuación daré una explicación detallada del comando utilizado

  • docker container run va a crear nuestro contenedor
  • -d hará que el contenedor se ejecute en el background (detached)
  • -p 4040:4040 creará un tunel entre el puerto 4040 de nuestro localhost con el puerto 4040 del contenedor
  • --net myngroknet indica que vamos a utilizar la red llamada myngroknet
  • --name ngrok indica que el nombre de nuestro contenedor será ngrok
  • wernight/ngrok es el nombre de la imagen que vamos a utilizar
  • ngrok http www:80 expone el servicio http del host www en el puerto 80

Ahora todo parece estar funcionando bien pero ¿cuál es la URL que debemos compartir? esto podemos saberlo con una sencilla llamada curl a nuestro contenedor de ngrok y podemos hacerlo de la siguiente manera

curl $(docker port ngrok 4040)/api/tunnels

Con esto podremos tener un resultado como el siguiente en donde podremos ver la URL.

Ahora simplemente vamos a pegar esta url en el navegador para de esta manera poder compartir nuestro proyecto local con quien sea en cualquier parte del mundo