Curso de Docker Avanzado

Cómo funcionan los puertos en Docker

Curso de Docker Avanzado

Contenido del curso

Optimización Avanzada en Docker

Orquestación

Cómo funcionan los puertos en Docker

Resumen

Entender cómo funcionan los puertos en Docker es una de esas habilidades que marcan la diferencia entre seguir tutoriales y desplegar contenedores con criterio propio. Aquí aprendes a mapear puertos entre tu máquina y los contenedores, por qué Docker los cierra por defecto y cómo elegir entre asignarlos manualmente o dejar que Docker lo haga por ti.

¿Por qué Docker cierra los puertos por defecto?

Docker fue diseñado pensando en seguridad desde el primer día. Por eso, cuando despliegas un contenedor, todos sus puertos están cerrados a menos que tú indiques lo contrario. Esto es una de las mejores prácticas de seguridad del mercado: nada queda expuesto sin tu consentimiento explícito.

La contraparte es que, como usuario, necesitas aprender a abrir y mapear puertos manualmente. Y ahí es donde muchos nos trabamos al principio.

¿Qué hace el parámetro -p en Docker? Mapea un puerto de tu máquina a un puerto del contenedor. El primer número es el puerto local con el que tú te comunicas a Docker; el segundo es el puerto interno con el que Docker habla con el contenedor.

¿Cómo mapear un puerto manualmente con docker run?

El comando base para abrir un puerto se ve así, ejecutado [00:48] en la terminal:

bash docker run -d -p 8080:80 --name mi-nginx nginx

Lo que sucede aquí es directo:

  • El flag -d ejecuta el contenedor en segundo plano.
  • -p 8080:80 indica que tú escribes al puerto 8080 de tu máquina y Docker lo redirige al puerto 80 dentro del contenedor.
  • --name mi-nginx le da un nombre legible al contenedor.
  • nginx es la imagen base que se descarga y ejecuta.

Una vez corriendo, abres el navegador en localhost:8080 y aparece la página de inicio de nginx. Si cambias el primer número a 8081, entonces el 8080 deja de funcionar porque ya nadie está escuchando ahí. Tendrías que ir a localhost:8081 para volver a ver tu sitio.

¿Puedo correr varios contenedores de la misma imagen?

Sí, siempre que cada uno use un puerto distinto en tu máquina. Dos contenedores no pueden compartir el mismo puerto al mismo tiempo. Por ejemplo, puedes lanzar uno en 8081 y otro en 1524 a partir de la misma imagen de nginx, cambiando además el nombre de cada contenedor para evitar conflictos.

Desde Docker Desktop puedes ver, en la sección de Containers, qué puerto está usando cada uno. Es un inventario visual muy útil para saber cuáles ya no puedes reutilizar. Incluso puedes lanzar una tercera instancia desde la sección de Images, expandir las configuraciones opcionales y asignar un puerto como 6223 antes de ejecutarla [04:30].

¿Cuándo conviene usar -P en mayúscula?

Si no quieres lidiar con elegir puertos a mano, Docker tiene un atajo. El parámetro -P (con P mayúscula) le dice a Docker que abra un puerto disponible automáticamente en tu nombre.

bash docker run -d -P --name nginx3 nginx

Docker se encarga de elegir un puerto libre y mapearlo al puerto interno de la imagen. Si no tienes Docker Desktop a la mano, puedes consultar el mapeo desde la terminal con:

bash docker port nginx3

La salida te muestra algo como 80/tcp -> 0.0.0.0:32768, lo que significa que Docker se comunica internamente por el puerto 80 y lo expuso en tu máquina a través del 32768 [05:45]. Le das clic a esa dirección en Docker Desktop y llegas al mismo nginx que verías con un mapeo manual.

¿Cuál es la diferencia entre -p y -P en Docker? La -p minúscula te deja definir manualmente el puerto local y el del contenedor. La -P mayúscula deja que Docker asigne automáticamente un puerto local libre.

¿Cómo recordar el orden de los puertos sin equivocarte?

La regla mental más simple, y la que te salva siempre, es esta:

  • El primer puerto del parámetro es con el que tu computadora se comunica a Docker.
  • El segundo puerto es con el que Docker se comunica al contenedor.

Con esa frase en mente, ya no necesitas memorizar más. Sea que despliegues 3, 20 o 50 contenedores de la misma imagen, basta con asignarles puertos locales distintos y dejar que Docker haga el resto del trabajo de ruteo interno.

¿Cuál prefieres en tu flujo: elegir puertos fijos o dejar que Docker los asigne con -P? Cuéntalo en los comentarios.