Instrucción EXPOSE Dockerfile

instruccion-expose-dockerfile
instruccion-expose-dockerfile

En esta lección aprenderás instrucción EXPOSE Dockerfile y una diferencia clave: EXPOSE documenta qué puerto espera usar la aplicación, pero no publica ese puerto automáticamente en tu máquina.

Esto evita una confusión muy común al empezar con Dockerfile: escribir EXPOSE 80 no equivale a usar docker run -p 8080:80. Son pasos relacionados, pero no son lo mismo.

👉 Y recuerda, si quieres aprender más de Linux, visita el curso de Linux gratis.

🐳 Si quieres aprender más de Docker, visita el curso de Docker gratis.

Qué hace la instrucción EXPOSE Dockerfile

Problema: una imagen puede contener una aplicación web, API o servicio que escucha en un puerto interno, pero otras personas no siempre saben cuál es.

Qué aporta Docker: EXPOSE deja documentado en la imagen el puerto previsto. Herramientas, humanos y Compose pueden usar esa información como pista, aunque la publicación real depende de cómo arranques el contenedor.

ConceptoQué significa
EXPOSE 80La imagen declara que la app escucha en el puerto 80 dentro del contenedor.
docker run -p 8080:80Publica el puerto 80 del contenedor como 8080 en el host.
Sin -pEl contenedor puede escuchar internamente, pero no queda accesible desde fuera por ese puerto.

Protocolos y varios puertos

Si no se indica un protocolo, EXPOSE documenta TCP. Para un servicio UDP hay que escribir el protocolo, por ejemplo EXPOSE 53/udp. Si una aplicación utiliza el mismo número por TCP y UDP, declara ambos de forma explícita. Esta instrucción describe lo que ofrece la imagen: la aplicación debe estar configurada para escuchar realmente en ese puerto y protocolo.

También puedes declarar varios puertos. Mantén la lista ajustada a los servicios reales: añadir puertos que la aplicación no escucha no los activa, y puede confundir a quien use la imagen.

Ejemplo práctico

FROM nginx:stable-alpine
COPY ./public /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
docker build -t web-expose-demo:1.0 .
docker run -d --name web-expose-demo -p 8080:80 web-expose-demo:1.0
docker ps --filter "name=web-expose-demo"

En el Dockerfile, EXPOSE 80 documenta el puerto interno. En el comando docker run, -p 8080:80 es lo que hace accesible la aplicación desde el host.

Publicar y comprobar el puerto

Para asignar un puerto conocido del host, utiliza docker run -p HOST:CONTENEDOR, como en el ejemplo anterior. La opción -P (mayúscula) publica todos los puertos declarados con EXPOSE en puertos altos disponibles del host; después puedes consultar el mapeo con docker port web-expose-demo. La opción -p minúscula permite elegirlo y fijarlo.

Si el servicio debe quedar accesible solo desde el propio equipo, limita la publicación a 127.0.0.1, por ejemplo docker run -p 127.0.0.1:8080:80. Sin una dirección de host, el mapeo puede quedar disponible en las interfaces del host y ser alcanzable desde la red, según el firewall y la configuración del servidor.

Por último, comprueba que la aplicación escucha dentro del contenedor en una interfaz accesible, normalmente 0.0.0.0. Si escucha solo en 127.0.0.1 dentro del contenedor, la publicación del puerto puede existir y aun así las conexiones externas al contenedor no llegar al servicio.

Errores comunes

  • Creer que EXPOSE publica el puerto: no lo hace; necesitas -p, Compose ports o una configuración equivalente.
  • Exponer puertos que la aplicación no usa: confunde a quien mantenga la imagen.
  • Confundir puerto interno y externo: en -p 8080:80, 8080 es host y 80 es contenedor.
  • Usar EXPOSE como medida de seguridad: no abre ni cierra firewall; solo documenta intención.

Advertencia: no asumas que un puerto está protegido solo porque no aparece en EXPOSE. La seguridad depende de red, publicación de puertos, firewall y permisos reales.

Lecciones relacionadas del curso Docker

Documentación oficial y recursos

La instrucción EXPOSE Dockerfile queda bien usada cuando comunica el puerto interno esperado sin prometer publicación automática.

Cuando necesites acceso desde fuera del contenedor, combina esta documentación con -p, Compose o la configuración de red adecuada.

Comentarios

No hay comentarios aún. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *