Redirección de puertos Redirección de puertos

🥇 Redirección de puertos

Los contenedores si bien se encuentran aislados, tienen la capacidad de abrir ciertos puertos para que estos sean direccionados al puerto del host (sistema operativo en donde se alojan). De forma que por ejemplo el puerto 80 (http) de un contenedor pueda ser accesado en el puerto 8080 de la maquina que hospeda los contenedores.

En este ocasión vamos a utilizar la imagen de docker nginx.

docker container run -d nginx

El parámetro -d del comando docker container run arranca el contenedor en modo detached, por lo que el contenedor se mantiene en operación en segundo plano.

Al finalizar la descarga y el arranque del contenedor podemos ver que se encuentra en ejecución mediante docker container ls. La salida sera algo parecido a lo siguiente.

docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d7480009dd72        nginx               "/docker-entrypoint.…"   15 seconds ago      Up 14 seconds       80/tcp              modest_neumann

En la columna PORTS podemos ver que el puerto 80/tcp se encuentra expuesto dentro del contenedor, sin embargo este no es accesible desde fuera del contenedor.

🍿 ¿Cómo obtener la dirección IP de un contenedor Docker?

Para obtener la dirección IP de nuestro contenedor utilizando el comando docker container inspect, este comando nos regresará bastante información.

docker container inspect

Como solo estamos interesados en la información de la dirección IP, podemos utilizar pipe | y grep para solo mostrar la línea pertinente.

docker container inspect | grep IPAddress

La salida se ve algo así…

"SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

Si en el navegador abrimos esta dirección en mi caso http://172.17.0.2 veremos el mensaje de bienvenida del servidor web nginx.

Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

Sin embargo como el contenedor esta alojado dentro de mi equipo, cuya dirección es localhost, cuando intento abrir la dirección web http://localhost en el navegador, este no puede acceder a servidor web del contenedor. Si bien ambos funcionan sobre el puerto 80, cuando intento acceder al puerto 80 de mi equipo (host) este no apunta al mismo servicio http que el del contenedor.

🍿 ¿Cómo enrutar el puerto 80 del host al puerto 80 de un contenedor?

Para enrutar puertos en Docker utilizamos el parámetro -p del comando docker container run. En el caso de nginx vamos a pasarle al parámetro -p el valor 8080:80, de forma que al acceder a http://localhost:8080 nos redirija al puerto 80 del contenedor que es en donde se encuentra resolviendo el servidor web.

docker container run -d -p 8080:80 nginx

Si entramos ahora a la dirección http://localhost:8080 podremos ver el servidor nginx ejecutándose.

🍿 ¿Cómo asignar puertos aleatorios en Docker?

Cada contenedor puede tener una serie de puertos expuestos, si deseamos enrutar cada uno de estos puertos a un puerto del host podemos reemplazar el parámetro -p por -P, la diferencia es que este último no requiere de un valor ya que cuando se utiliza Docker asigna un puerto en el host para cada uno de los puertos expuestos por el contenedor. Este rango de puertos es conocido como los puertos efímeros, que dan del rango del número 30000 al 60000 (aproximadamente).

docker container run -d -P nginx

Si listamos los contenedores nuevamente docker container ls nos daremos cuenta que hay un puerto autoasignado para enrutar el puerto 80 del contenedor. La salida se verá algo así:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
d778010f104f        nginx               "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds        0.0.0.0:32768->80/tcp   serene_turing
Administración de Contenedores Volúmenes dentro de los contenedores de Docker
comments powered by Disqus