Cómo exponer un puerto en un Dockerfile

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Docker es una potente plataforma de contenedores (containerization) que permite a los desarrolladores empaquetar y desplegar aplicaciones de manera consistente y reproducible. Uno de los aspectos clave al trabajar con Docker es entender cómo exponer puertos en tu Dockerfile, lo cual es esencial para que tus aplicaciones contenerizadas sean accesibles. Este tutorial te guiará a través del proceso de exponer puertos en un Dockerfile y proporcionará las mejores prácticas para garantizar que tus despliegues de Docker sean seguros y eficientes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/create -.-> lab-410085{{"Cómo exponer un puerto en un Dockerfile"}} docker/port -.-> lab-410085{{"Cómo exponer un puerto en un Dockerfile"}} docker/build -.-> lab-410085{{"Cómo exponer un puerto en un Dockerfile"}} end

Comprender los puertos de Docker

En el mundo de la contenerización (containerization), Docker ha revolucionado la forma en que se empaquetan, despliegan y gestionan las aplicaciones. En el corazón de la funcionalidad de Docker se encuentra el concepto de puertos, que juegan un papel crucial para permitir la comunicación entre los contenedores y el mundo exterior.

¿Qué son los puertos de Docker?

Los puertos de Docker son las puertas de enlace a través de las cuales el tráfico de red puede fluir hacia dentro y hacia fuera de un contenedor. Cuando un contenedor está en ejecución, puede escuchar en puertos específicos para conexiones entrantes. Estos puertos se pueden mapear a los puertos de la máquina host, lo que permite a los clientes externos acceder a los servicios que se ejecutan dentro del contenedor.

Importancia de los puertos de Docker

Exponer puertos en Docker es esencial por varios motivos:

  1. Comunicación: Los puertos permiten la comunicación entre el contenedor y los clientes externos, lo que les permite acceder a los servicios o aplicaciones que se ejecutan dentro del contenedor.
  2. Redes: Los puertos son los puntos de entrada para el tráfico de red, lo que permite a los contenedores comunicarse entre sí o con recursos externos, como bases de datos o servidores web.
  3. Accesibilidad del servicio: Al exponer puertos, puedes hacer que tus aplicaciones contenerizadas sean accesibles para los usuarios u otros sistemas, lo que les permite interactuar con los servicios que se ejecutan dentro de los contenedores.

Comprender el mapeo de puertos

El mapeo de puertos es el proceso de asociar el puerto interno de un contenedor con un puerto en la máquina host. Este mapeo permite a los clientes externos acceder a los servicios que se ejecutan dentro del contenedor conectándose al puerto del host.

graph LR A[Host Machine] -- maps to --> B[Container] B[Container] -- exposes --> C[Port]

En el diagrama anterior, la máquina host mapea su puerto al puerto expuesto del contenedor, lo que permite a los clientes externos acceder al servicio que se ejecuta dentro del contenedor.

Conclusión

Comprender los puertos de Docker es crucial para desplegar y gestionar de manera efectiva las aplicaciones contenerizadas. Al exponer los puertos adecuados, puedes asegurarte de que tus servicios contenerizados sean accesibles para el mundo exterior, lo que facilita la comunicación y la integración sin problemas con otros sistemas.

Exponer puertos en Dockerfiles

Al construir imágenes de Docker, puedes especificar los puertos que deben exponerse dentro del contenedor utilizando la instrucción EXPOSE en el Dockerfile.

Sintaxis para exponer puertos

La instrucción EXPOSE en un Dockerfile sigue esta sintaxis:

EXPOSE < port > [ < port > / < protocol > ...]

Aquí, <port> representa el número de puerto, y el <protocol> opcional especifica el protocolo, que puede ser tcp (por defecto) o udp.

Por ejemplo, para exponer el puerto 80 (HTTP) y el puerto 22 (SSH) en tu contenedor, utilizarías la siguiente instrucción EXPOSE:

EXPOSE 80 22

Mapear puertos expuestos en tiempo de ejecución

Cuando ejecutas un contenedor basado en la imagen, puedes mapear los puertos expuestos a los puertos de la máquina host utilizando la bandera -p o --publish con el comando docker run.

docker run -p <host-port>:<container-port> <image-name>

Por ejemplo, para mapear el puerto 80 del contenedor al puerto 8080 del host, utilizarías el siguiente comando:

docker run -p 8080:80 my-app

Esto permite a los clientes externos acceder al servicio que se ejecuta en el puerto 80 dentro del contenedor conectándose al puerto 8080 en la máquina host.

Exponer múltiples puertos

Puedes exponer múltiples puertos en un Dockerfile utilizando múltiples instrucciones EXPOSE. Esto es útil cuando tu contenedor ejecuta múltiples servicios o aplicaciones que deben ser accesibles desde el host.

EXPOSE 80
EXPOSE 22
EXPOSE 3306

Al ejecutar el contenedor, puedes mapear cada uno de estos puertos expuestos a los puertos del host utilizando la bandera -p o --publish.

docker run -p 8080:80 -p 2222:22 -p 3306:3306 my-app

Siguiendo este enfoque, puedes asegurarte de que todos los puertos necesarios estén expuestos y sean accesibles desde la máquina host.

Mejores prácticas para la exposición de puertos

Cuando se trata de exponer puertos en Docker, hay varias mejores prácticas a considerar para un rendimiento y una seguridad óptimos.

Principio de privilegio mínimo

Adhiérese al principio de privilegio mínimo al exponer puertos. Solo exponga el número mínimo de puertos necesarios para que su aplicación funcione correctamente. Esto ayuda a reducir la superficie de ataque y mejora la seguridad general de su entorno contenerizado.

Asignación dinámica de puertos

Evite codificar números de puerto específicos en sus Dockerfiles o configuraciones de contenedor. En su lugar, utilice la asignación dinámica de puertos, donde deje que Docker asigne puertos disponibles en la máquina host. Este enfoque hace que sus contenedores sean más portátiles y fáciles de escalar, ya que no tiene que preocuparse por conflictos de puertos.

Utilice variables de entorno

Si su aplicación requiere números de puerto específicos, considere utilizar variables de entorno para almacenar estos valores. Esto le permite configurar fácilmente la configuración de los puertos sin modificar el Dockerfile o los parámetros de tiempo de ejecución del contenedor.

## Dockerfile
ENV APP_PORT=8080
EXPOSE $APP_PORT
## docker run
docker run -e APP_PORT=8080 -p $APP_PORT:$APP_PORT my-app

Documente los puertos expuestos

Documente claramente los puertos expuestos por sus imágenes de Docker en el Dockerfile o en el archivo README del proyecto. Esta información ayuda a otros desarrolladores u operadores a entender los requisitos de red de su aplicación contenerizada.

Monitoree y proteja los puertos expuestos

Monitoree regularmente los puertos expuestos en su entorno Docker para asegurarse de que se estén utilizando como se pretendía. Considere implementar medidas de seguridad, como firewalls o políticas de red, para restringir el acceso a puertos específicos o limitar las direcciones IP de origen que pueden conectarse a sus contenedores.

Conclusión

Siguiendo estas mejores prácticas para la exposición de puertos, puede asegurarse de que sus aplicaciones contenerizadas sean seguras, escalables y fáciles de administrar. Recuerde, la clave es encontrar un equilibrio entre la funcionalidad y la seguridad al exponer puertos en su entorno Docker.

Resumen

En este tutorial, has aprendido cómo exponer puertos en un Dockerfile, lo cual es un paso crucial para hacer que tus contenedores de Docker sean accesibles. Al entender los conceptos básicos de la exposición de puertos y seguir las mejores prácticas, puedes optimizar tus despliegues de Docker y asegurarte de que tus aplicaciones sean accesibles para los usuarios u otros servicios. Con este conocimiento, puedes llevar tus habilidades en Docker al siguiente nivel y construir aplicaciones contenerizadas más robustas y escalables.