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.
[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.