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:
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
:
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
:
En general es mejor especificar ambos puertos al crear contenedores con port-mapping.