Saltar a contenido

Puertos

Introducción

Los contenedores se comunican con el resto del software mediante el protocolo TCP/IP, implementando sockets ("zócalos").

Los sockets se componen por una dirección IP y por un número de puerto. Cada imagen tiene un número de puerto preasignado, el cual es heredado del software interno y cuyo contenedor hereda también de manera predeterminada.
Por este motivo varios contenedores activos pueden heredar un mismo número de puerto, por ejemplo si se manejan imágenes de un mismo framework en distintas versiones o si se trata de una misma imagen siendo usada para varios programas distintos.

Port Mapping

Dos o más imágenes activas pueden tener un mismo número de puerto huesped, en tanto que dos contenedores activos no pueden tener un mismo número de puerto para comunicarse con el host. El port mapping o mapeo de puertos consiste en asignar números de puerto a cada contenedor para prevenir conflictos entre ellos.

Sintaxis

El mapeo se implementa con la opción -p (publish) y consta de:

  • El número de puertos para el anfitrión;
  • El número de puerto de la imagen.

La sintaxis es la siguiente:

Contenedor - con port mapping
docker create -p puerto_anfitrion:puerto_imagen --name nombre_contenedor  nombre_imagen
Contenedor - con port mapping
podman create -p puerto_anfitrion:puerto_imagen --name nombre_contenedor nombre_imagen

Importante: no poner espacios entre números de puerto y signo :.

Material for MkDocs

Este framework que renderiza documentos en formato Markdown implementa su live server (servidor para pruebas) locales el puerto 8000. Por ello, los contenedores creados para implementar dicho server deben mapear al puerto 8000:

mkdocs-material - live server
docker pull mkdocs-material    
cd ruta_proyecto
docker create --name live_server -p puerto_host:8000 -v ${PWD}:/docs mkdocs-material
mkdocs-material - live server
podman pull mkdocs-material   
cd ruta_proyecto
podman create --name live_server -p puerto_host:8000 --security-opt label=disable -v ${PWD}:/docs mkdocs-material

Aclaración: la opción adicional -v ${PWD}:/docs tiene que ver con el uso de volumenes. Es la ruta relativa a los documentos internos del proyecto actual.

Nº de puerto único

Si se indica un solo número de puerto entonces la máquina de contenedores asumirá que éste es puerto de la imagen y entonces elegirá el puerto de host arbitrarimente.

Por ejemplo, MongoDB usa el puerto 27017. Al indicar dicho numero durante la creación del container y al no especificar el puerto de host el engine asigna un puerto de host arbitrario como el 46665 o el52043:

docker create  -p27017 --name mong_p1    mongo
podman create  -p27017 --name mong_p1    mongo

En general es mejor especificar ambos puertos al crear contenedores con port-mapping.