Mapeo de puertos con Docker

En este post vamos trabajar con el mapeo de puertos con Docker, esto significa que asignaremos un puerto local de host para apuntarlo a  un puerto de la aplicación que esta corriendo en el contenedor.

En primer lugar a inspeccionaremos el repositorio llamado training para saber si alguna de las imágenes nos sirve para hacer pruebas, para hacer esto usamos el comando: docker search training

[pastacode lang=»markup» manual=»docker%20search%20training%0ANAME%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20DESCRIPTION%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20STARS%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20OFFICIAL%20%20%20%20%20%20%20%20%20%20%20%20AUTOMATED%0Atraining%2Fwebapp%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2074%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Atraining%2Fsinatra%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2018%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Atraining%2Fpostgres%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2010%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Atraining%2Fnamer%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%202%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Atermit%2Ftraining-apache%20%20%20%20%20%20%20%20%20%20%20%20%20%20Apache%20image%20for%20the%20Kubernetes%20training%20%20%20%20%20%20%20%201%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Atraining%2Fwhoami%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HTTP%20docker%20service%20printing%20it’s%20container%20%E2%80%A6%20%20%201%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Acloudbees%2Ftraining-jenkins%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Akidk%2Ftraining-images-receiver%20%20%20%20%20%20%20Docker%20image%20with%20receiver%20service%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Akidk%2Ftraining-images-calc_words%20%20%20%20%20Docker%20image%20with%20calc_words%20service%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Akidk%2Ftraining-images-processor%20%20%20%20%20%20Docker%20image%20with%20processor%20service%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Akidk%2Ftraining-images-web%20%20%20%20%20%20%20%20%20%20%20%20Docker%20image%20with%20web%20service%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Akidk%2Ftraining-images-nginx%20%20%20%20%20%20%20%20%20%20Docker%20image%20with%20nginx%20service%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Akidk%2Ftraining-images-calc_letters%20%20%20Docker%20image%20with%20calc_letters%20service%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Acloudbees%2Ftraining-jenkins-agent%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Acnfltraining%2Ftraining-tools%20%20%20%20%20%20%20%20%20Tools%20used%20in%20Confluent%20training%20courses%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Akidk%2Ftraining-images-generator%20%20%20%20%20%20Docker%20image%20with%20generator%20service%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Axaan001%2Ftraining-demo-repoz%20%20%20%20%20%20%20%20%20training-demo-repoz%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Atraining%2Fdockercoins-worker%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Akidk%2Ftraining-images-rabbitmq%20%20%20%20%20%20%20Docker%20image%20with%20rabbitmq%20service%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5BOK%5D%0Atraining%2Fdockercoins-hasher%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Atraining%2Fdockercoins-rng%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Atraining%2Fdockercoins-webui%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Acloudbees%2Ftraining-devbox%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Acloudbees%2Ftraining-web%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0Atraining%2Fstress%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20duped%20for%20stability%20from%20https%3A%2F%2Fhub.docker.%E2%80%A6%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A» message=»docker search training» highlight=»» provider=»manual»/]

 

Para trabajar descargaremos del repositorio training una imagen llamada webapp, esta aplicación escrita en Python muestra simplemente «Hello World». En la ejecución del comando incluí el parámetro -P el cual permite mapear un puerto cualquiera del host donde esta corriendo docker con el puerto de aplicación en este caso el 5000.

Mapeo de puertos con docker
Mapeo de puertos con docker

[pastacode lang=»markup» manual=»docker%20run%20-d%20-P%20training%2Fwebapp%0AUnable%20to%20find%20image%20’training%2Fwebapp%3Alatest’%20locally%0Alatest%3A%20Pulling%20from%20training%2Fwebapp%0AImage%20docker.io%2Ftraining%2Fwebapp%3Alatest%20uses%20outdated%20schema1%20manifest%20format.%20Please%20upgrade%20to%20a%20schema2%20image%20for%20better%20future%20compatibility.%20More%20information%20at%20https%3A%2F%2Fdocs.docker.com%2Fregistry%2Fspec%2Fdeprecated-schema-v1%2F%0Ae190868d63f8%3A%20Pull%20complete%20%0A909cd34c6fd7%3A%20Pull%20complete%20%0A0b9bfabab7c1%3A%20Pull%20complete%20%0Aa3ed95caeb02%3A%20Pull%20complete%20%0A10bbbc0fc0ff%3A%20Pull%20complete%20%0Afca59b508e9f%3A%20Pull%20complete%20%0Ae7ae2541b15b%3A%20Pull%20complete%20%0A9dd97ef58ce9%3A%20Pull%20complete%20%0Aa4c1b0cb7af7%3A%20Pull%20complete%20%0ADigest%3A%20sha256%3A06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d%0AStatus%3A%20Downloaded%20newer%20image%20for%20training%2Fwebapp%3Alatest%0Acbdb779edf011f3bde30f7ad786bd9f00c407c473946a2e9bc8e59fedec1dd0a%0A» message=»docker run -d -P training/webapp» highlight=»» provider=»manual»/]

Podemos observar como esta corriendo el contenedor y el puerto mapeado utilizando el comnado: docker ps -a

[pastacode lang=»markup» manual=»docker%20ps%20-a%0ACONTAINER%20ID%20%20%20%20%20%20%20%20IMAGE%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20COMMAND%20%20%20%20%20%20%20%20%20%20%20%20%20CREATED%20%20%20%20%20%20%20%20%20%20%20%20%20STATUS%20%20%20%20%20%20%20%20%20%20%20%20%20%20PORTS%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAMES%0Acbdb779edf01%20%20%20%20%20%20%20%20training%2Fwebapp%20%20%20%20%20%22python%20app.py%22%20%20%20%20%2057%20seconds%20ago%20%20%20%20%20%20Up%2054%20seconds%20%20%20%20%20%20%200.0.0.0%3A32771-%3E5000%2Ftcp%20%20%20inspiring_dijkstra%0A» message=»docker ps -a» highlight=»» provider=»manual»/]

Para avanzar un paso vamos a mapear el puerto 5000 del host con el puerto 5000 del contenedor. Utilizando el parámetro -p de la siguiente manera.

 

[pastacode lang=»markup» manual=»docker%20run%20-d%20-p%205000%3A5000%20%20training%2Fwebapp%0Aad829f81f6ef202df46ee2a3a85eec5665d6751f31b80675edd6354f3667c329%0A%0A» message=»docker run -d -p 5000:5000 training/webapp» highlight=»» provider=»manual»/]

Para verificar podemos navegar utilizando un navegador de texto  como por ejemplo links, de la siguiente manera.

[pastacode lang=»markup» manual=»links%20http%3A%2F%2Flocalhost%3A5000″ message=»» highlight=»» provider=»manual»/]

 

Monitoreo de Logs

Ahora vamos a monitorear el mapeo de puertos docker con el comando docker logs de la siguiente manera:

[pastacode lang=»markup» manual=»%20docker%20logs%20gallant_jackson%20%0A%20*%20Running%20on%20http%3A%2F%2F0.0.0.0%3A5000%2F%20(Press%20CTRL%2BC%20to%20quit)%0A172.17.0.1%20-%20-%20%5B09%2FJun%2F2020%2011%3A40%3A59%5D%20%22GET%20%2F%20HTTP%2F1.1%22%20200%20-%0A» message=» docker logs gallant_jackson » highlight=»» provider=»manual»/]

 

Otra forma de monitorear logs es utilizando el comando top de la siguiente manera

[pastacode lang=»markup» manual=»docker%20top%20gallant_jackson%20%0AUID%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PID%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PPID%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20STIME%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TTY%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CMD%0Aroot%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%208260%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%208242%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2008%3A36%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2000%3A00%3A00%20%20%20%20%20%20%20%20%20%20%20%20python%20app.py%0A%0A» message=»docker top gallant_jackson » highlight=»» provider=»manual»/]

Hasta aqui hemos visto como docker nos permite mapear puertos de manera muy sencilla, a la hora de trabajar es muy importante saber bien como es el mapeo de puertos con docker.

Mas información en https://docs.docker.com/config/containers/container-networking/

Tengamos en cuenta que también podemos mapear puertos udp si fuera necesario.