Reenvío de puertos en contenedores Docker para acceder a aplicaciones

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

Este tutorial lo guiará a través del proceso de reenviar puertos en contenedores Docker para proporcionar acceso externo a sus aplicaciones. Aprenderá cómo exponer puertos, mapearlos entre contenedores y el host, y configurar el reenvío de puertos en Docker Compose. Al final de este artículo, tendrá una comprensión sólida del reenvío de puertos de Docker y podrá aplicarlo a sus propios proyectos.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} docker/start -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} docker/stop -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} docker/create -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} docker/port -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} docker/network -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} docker/build -.-> lab-393010{{"Reenvío de puertos en contenedores Docker para acceder a aplicaciones"}} end

Introducción a los contenedores Docker

Docker es una popular plataforma de código abierto que permite a los desarrolladores construir, desplegar y ejecutar aplicaciones en un entorno contenerizado. Los contenedores son paquetes de software livianos, independientes y ejecutables que incluyen todo lo necesario para ejecutar una aplicación, incluyendo el código, el entorno de ejecución, las herramientas del sistema y las bibliotecas.

Los contenedores Docker proporcionan una forma consistente y confiable de empaquetar y distribuir aplicaciones, asegurando que se ejecutarán de la misma manera independientemente de la infraestructura subyacente. Esto facilita el desarrollo, la prueba y el despliegue de aplicaciones, así como su escalado y gestión en producción.

Para comenzar con Docker, necesitará instalar el motor de Docker en su sistema. En Ubuntu 22.04, puede hacer esto ejecutando los siguientes comandos:

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

Una vez que tenga Docker instalado, puede crear y gestionar contenedores utilizando la herramienta de línea de comandos docker. Por ejemplo, para crear un nuevo contenedor basado en la imagen oficial de Ubuntu, puede ejecutar:

docker run -it ubuntu:latest /bin/bash

Esto iniciará un nuevo contenedor basado en la última imagen de Ubuntu y lo llevará a una shell de bash dentro del contenedor. Desde aquí, puede instalar software adicional, ejecutar su aplicación y más.

En general, los contenedores Docker proporcionan una forma poderosa y flexible de desarrollar, desplegar y gestionar aplicaciones, lo que facilita garantizar un comportamiento de aplicación consistente y confiable en diferentes entornos.

Comprendiendo el mapeo de puertos en Docker

Puertos y redes en contenedores Docker

Cuando se ejecuta un contenedor, está aislado del sistema host y de otros contenedores, incluyendo su propia pila de red. Esto significa que cualquier puerto de red expuesto por la aplicación que se ejecuta dentro del contenedor solo es accesible dentro del propio contenedor.

Para hacer que la aplicación sea accesible desde fuera del contenedor, es necesario mapear los puertos del contenedor a los puertos correspondientes en el sistema host. Este proceso se conoce como "mapeo de puertos" o "reenvío de puertos".

Exponiendo puertos en Docker

Para exponer un puerto en un contenedor Docker, se puede utilizar la opción -p o --publish al ejecutar el comando docker run. Por ejemplo, para exponer el puerto 80 en el contenedor y mapearlo al puerto 8080 en el host, se puede ejecutar:

docker run -p 8080:80 nginx

Esto iniciará un contenedor de servidor web Nginx y mapeará el puerto 80 dentro del contenedor al puerto 8080 en el sistema host.

También se pueden especificar múltiples mapeos de puertos utilizando la opción -p varias veces:

docker run -p 8080:80 -p 8443:443 nginx

Esto mapeará el puerto 80 en el contenedor al puerto 8080 en el host, y el puerto 443 en el contenedor al puerto 8443 en el host.

Accediendo a los puertos mapeados

Una vez que se ha mapeado un puerto en el contenedor a un puerto en el host, se puede acceder a la aplicación que se ejecuta en el contenedor conectándose al puerto correspondiente en el host. Por ejemplo, si se ha mapeado el puerto 8080 en el host al puerto 80 en el contenedor, se puede acceder a la aplicación visitando http://localhost:8080 en el navegador web.

En general, comprender el mapeo de puertos es crucial para hacer que las aplicaciones basadas en Docker sean accesibles desde fuera del contenedor y para permitir la comunicación entre contenedores y otros sistemas.

Exponiendo puertos para el acceso a aplicaciones

Identificando los puertos de la aplicación

El primer paso para exponer puertos para el acceso a una aplicación es identificar los puertos en los que la aplicación está escuchando. Esta información generalmente se proporciona en la documentación de la aplicación o se puede determinar inspeccionando el código o la configuración de la aplicación.

Por ejemplo, si está ejecutando un servidor web como Nginx, probablemente esté escuchando en el puerto 80 (HTTP) y/o en el puerto 443 (HTTPS). Si está ejecutando un servidor de base de datos, podría estar escuchando en un puerto específico como el 3306 para MySQL o el 5432 para PostgreSQL.

Exponiendo puertos con el comando docker run

Una vez que haya identificado los puertos que utiliza su aplicación, puede exponerlos al sistema host utilizando la opción -p o --publish al ejecutar el comando docker run. Esto mapeará los puertos del contenedor a los puertos correspondientes en el sistema host.

Por ejemplo, para exponer el puerto 80 en el contenedor y mapearlo al puerto 8080 en el host, puede ejecutar:

docker run -p 8080:80 nginx

Esto iniciará un contenedor de servidor web Nginx y mapeará el puerto 80 dentro del contenedor al puerto 8080 en el sistema host.

Exponiendo múltiples puertos

Puede exponer múltiples puertos utilizando la opción -p varias veces. Por ejemplo, para exponer los puertos 80 y 443 en el contenedor y mapearlos a los puertos 8080 y 8443 en el host, puede ejecutar:

docker run -p 8080:80 -p 8443:443 nginx

Esto mapeará el puerto 80 en el contenedor al puerto 8080 en el host, y el puerto 443 en el contenedor al puerto 8443 en el host.

Al exponer los puertos adecuados, puede asegurarse de que sus aplicaciones basadas en Docker sean accesibles desde fuera del contenedor, lo que permite a los usuarios y otros sistemas interactuar con sus aplicaciones.

Mapeo de puertos entre contenedores y el host

Comprendiendo la sintaxis del mapeo de puertos

Al exponer puertos en Docker, se utiliza la siguiente sintaxis para mapear un puerto de contenedor a un puerto de host:

-p <puerto_host>:<puerto_contenedor>

Por ejemplo, para mapear el puerto 8080 del host al puerto 80 del contenedor, se utilizaría:

docker run -p 8080:80 nginx

Esto mapea el puerto 80 del contenedor al puerto 8080 del sistema host.

Mapeo dinámico de puertos

En lugar de especificar un puerto de host concreto, también se puede dejar que Docker elija un puerto disponible en el sistema host omitiendo el puerto de host:

docker run -p 80 nginx

Esto mapeará un puerto disponible en el sistema host al puerto 80 del contenedor. Se puede encontrar el puerto mapeado ejecutando docker port <nombre_contenedor> o inspeccionando la configuración de red del contenedor.

Mapeo de múltiples puertos

Se pueden mapear múltiples puertos especificando la opción -p varias veces:

docker run -p 8080:80 -p 8443:443 nginx

Esto mapeará el puerto 80 del contenedor al puerto 8080 del host, y el puerto 443 del contenedor al puerto 8443 del host.

Visualización de puertos mapeados

Se pueden ver los puertos mapeados de un contenedor en ejecución utilizando el comando docker port:

docker port <nombre_contenedor>

Esto mostrará el mapeo entre los puertos del contenedor y los puertos del host.

Al comprender cómo mapear puertos entre contenedores y el sistema host, se puede asegurar que las aplicaciones basadas en Docker sean accesibles desde fuera del contenedor, lo que permite a los usuarios y otros sistemas interactuar con las aplicaciones.

Configuración del reenvío de puertos en Docker Compose

Introducción a Docker Compose

Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker de múltiples contenedores. Permite definir los servicios, redes y volúmenes de su aplicación en un solo archivo YAML, lo que facilita la gestión y el despliegue de su aplicación.

Configuración del reenvío de puertos en Docker Compose

En un archivo Docker Compose, se puede configurar el reenvío de puertos utilizando la directiva ports. La sintaxis es similar al comando docker run:

version: "3"
services:
  web:
    image: nginx
    ports:
      - 8080:80

En este ejemplo, el servicio web está ejecutando el servidor web Nginx, y el puerto 80 del contenedor se mapea al puerto 8080 del sistema host.

También se pueden mapear múltiples puertos especificando la directiva ports varias veces:

version: "3"
services:
  web:
    image: nginx
    ports:
      - 8080:80
      - 8443:443

Esto mapeará el puerto 80 del contenedor al puerto 8080 del host, y el puerto 443 del contenedor al puerto 8443 del host.

Mapeo dinámico de puertos

Similar al comando docker run, también se puede utilizar el mapeo dinámico de puertos en Docker Compose omitiendo el puerto de host:

version: "3"
services:
  web:
    image: nginx
    ports:
      - 80

Esto mapeará un puerto disponible en el sistema host al puerto 80 del contenedor. Se puede encontrar el puerto mapeado ejecutando docker-compose port web 80.

Al configurar el reenvío de puertos en su archivo Docker Compose, puede asegurarse de que sus aplicaciones de múltiples contenedores sean accesibles desde fuera del entorno Docker, lo que permite a los usuarios y otros sistemas interactuar con sus aplicaciones.

Mejores prácticas para el reenvío de puertos

Utilice puertos de host específicos

Cuando sea posible, utilice puertos de host específicos en lugar de depender del mapeo dinámico de puertos. Esto facilita recordar y acceder a sus aplicaciones, y también puede simplificar cualquier configuración de firewall o red que pueda ser necesaria.

Evite conflictos de puertos

Asegúrese de que los puertos de host que elija no entren en conflicto con ningún otro servicio o aplicación que se esté ejecutando en el sistema host. Esto puede evitar conflictos de puertos y garantizar que sus aplicaciones basadas en Docker se puedan acceder sin problemas.

Documente los mapeos de puertos

Documente claramente los mapeos de puertos utilizados por sus aplicaciones basadas en Docker, tanto en su código como en cualquier documentación de implementación o configuración. Esto facilitará a otros desarrolladores o equipos de operaciones entender y trabajar con sus aplicaciones.

Utilice variables de entorno para la configuración de puertos

Considere utilizar variables de entorno para configurar los mapeos de puertos de sus aplicaciones basadas en Docker. Esto puede facilitar cambiar la configuración de puertos sin tener que modificar el código de la aplicación o los archivos de configuración de Docker.

version: "3"
services:
  web:
    image: nginx
    ports:
      - ${WEB_PORT}:80

En este ejemplo, se utiliza la variable de entorno WEB_PORT para configurar el puerto de host al que se mapea el servidor web Nginx.

Monitoree y gestione el uso de puertos

Monitoree regularmente el uso de puertos en sus sistemas host para asegurarse de que no se le estén agotando los puertos disponibles para sus aplicaciones basadas en Docker. Considere implementar herramientas o scripts automatizados para ayudar a gestionar y optimizar el uso de puertos.

Si sigue estas mejores prácticas, puede asegurarse de que sus aplicaciones basadas en Docker sean accesibles, seguras y fáciles de gestionar, lo que facilitará desarrollar, implementar y mantener sus aplicaciones en un entorno contenerizado.

Resumen

En esta guía integral, has aprendido los conceptos esenciales del reenvío de puertos en contenedores Docker. Ahora sabes cómo exponer puertos, mapearlos entre contenedores y el host, y configurar el reenvío de puertos en Docker Compose. Al aplicar estas técnicas, puedes asegurarte de que tus aplicaciones basadas en Docker sean accesibles desde el mundo exterior, lo que permite una integración y un despliegue sin problemas. Recuerda seguir las mejores prácticas para el reenvío de puertos para mantener un entorno Docker seguro y eficiente.