¿Cómo utilizar los puertos en Docker?
Vamos a crear un contenedor con un servidor web nginx, para ello utilizamos el contenedor con el mismo nombre.
docker container run -d nginx
Si exploramos los contenedores en ejecución nos daremos cuenta que existe un puerto 80 disponible pero este no esta enrutado a ningun puerto en el host.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
723b2fe61ad4 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp crazy_hugl
Podemos obtener la ip del contenedor explorando los detalles mediante el comando container inspect.
docker container inspect 723b2fe61ad4
En mi caso el valor de IPAddress es 172.17.0.2. Por lo cual al abrir la dirección http://172.17.0.2 me muestra la pagina de bienvenida de nginx. Sin embargo si intentamos conectarnos al servidor web utilizando el localhost vamos a encontrarnos que no se muestra la pagina de bienvenida debido a que no hemos mapeado el puerto del host al del contenedor.
Para enrutar un puerto del contener a uno del host en docker, utilizamos el parámetro -p puerto_host:puerto_contenedor. Por ejemplo para mapear el puerto 80 del contenedor al 8081.
docker container run -d -p 8081:80/tcp -p 8081:80/udp nginx
En este ejemplo hemos mapeado el puerto 80 del contenedor al 8081 del host, tanto para tcp como para udp.
Si ejecutamos curl sobre el puerto 8081 o abrimos http://localhost:8081 en el navegador podremos ver la página de bienvenida de nginx.
curl http://localhost:8081
Por último si deseamos ver la lista de puertos asociados a un contenedor podemos usar el comando container port indicando el identificador del contenedor.
docker container port c66dea11c677
80/tcp -> 0.0.0.0:8081
80/udp -> 0.0.0.0:8081