tutorial - Docker y netstat: netstat no muestra puertos, expuestos por contenedores docker
mapeo de puertos docker (1)
netstat debe mostrar los puertos expuestos. Aquí hay un ejemplo
anovil@anovil-Latitude-E6440:docker$ sudo netstat -at|grep 3030
anovil@anovil-Latitude-E6440:docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
anovil@anovil-Latitude-E6440:docker$ docker run -d -p 3030:80 httpd:2.4
4310ac5fbdbc7314ab4d23e34099a710a3a8790dcf2c6d0a84202c1de5c9fd30
anovil@anovil-Latitude-E6440:docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4310ac5fbdbc httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:3030->80/tcp hungry_fermat
anovil@anovil-Latitude-E6440:docker$ sudo netstat -at|grep 3030
tcp6 0 0 [::]:3030 [::]:* LISTEN
anovil@anovil-Latitude-E6440:docker$ sudo netstat -tulpn|grep 3030
tcp6 0 0 :::3030 :::* LISTEN 10294/docker-proxy
anovil@anovil-Latitude-E6440:docker$
Algunas cosas básicas que necesita para verificar usted mismo:
- ¿Está ejecutando netstat con privilegios elevados? Algunas cosas pueden perderse cuando no eres root
- ¿Se está ejecutando el contenedor de la ventana acoplable en el mismo host que espera? Consulte con
docker ps
- ¿El
docker ps
enumera el reenvío de puertos? Como en el ejemplo anterior, debería poder ver algo como esto0.0.0.0:3030->80/tcp
También tenga en cuenta que, el docker-proxy es el que se ejecuta en el host. Todos los comandos anteriores asumen que se ejecuta en Linux. Esto fue probado con ubuntu 15.10
Si aún cree que le falta el reenvío, devuelva su sistema operativo, la versión de la ventana acoplable, etc.
Gracias,
Expongo los puertos de la ventana acoplable de mis contadores al equipo host con algo como
docker run -p 80:80 ...
luego trato de mostrar todos los puertos de escucha para fines de depuración con netstat
por ejemplo:
netstat -at
Lo extraño es que netstat no mostrará mis contenedores docker con puertos expuestos, aunque están escuchando y respondiendo al navegador.
¿Cómo hago que netstat
muestre esos puertos expuestos?
ACTUALIZACIÓN: Estoy ejecutando esto en Debian 8 Jessie. Esto es lo que hago:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dfa08bab50d workflows-nginx "/bin/sh -c ''/usr/sbi" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp workflows-nginx
d0b0c3f90f13 workflows-django "/bin/sh -c ''python /" 7 hours ago Up 3 hours 0.0.0.0:8000->8000/tcp workflows-django
99a857c92533 workflows-db "/docker-entrypoint.s" 7 hours ago Up 3 hours 5432/tcp workflows-db
Aquí, la ventana acoplable informa que los puertos de contenedor se reenvían al host. Por otra parte, si detengo el workflows-nginx
contenedor workflows-nginx
, deja de responder al navegador mediante http (puerto 80). Si vuelvo a empezar, vuelve a responder.
Aquí está la salida de sudo netstat -at | less
sudo netstat -at | less
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 *:15672 *:* LISTEN
tcp 0 0 *:postgresql *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:25672 *:* LISTEN
tcp 0 0 *:48142 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:epmd *:* LISTEN
tcp 0 0 bob-acer:34866 104.16.33.249:http ESTABLISHED
tcp 0 0 bob-acer:42380 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42543 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42525 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:44076 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42944 stackoverflow.com:https ESTABLISHED
tcp 0 0 localhost:epmd localhost:50831 ESTABLISHED
tcp 0 0 bob-acer:42655 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42384 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:44626 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42390 stackoverflow.com:https ESTABLISHED
tcp 0 0 localhost:50831 localhost:epmd ESTABLISHED
tcp 0 0 bob-acer:48301 c2.52.c0ad.ip4.st:https ESTABLISHED
tcp 0 0 bob-acer:42151 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42205 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:42539 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:44737 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-acer:39648 77.94.164.251:https ESTABLISHED
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 [::]:postgresql [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:44794 [::]:* LISTEN
tcp6 0 0 [::]:8000 [::]:* LISTEN
tcp6 0 0 [::]:amqp [::]:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
tcp6 1 0 localhost:58497 localhost:ipp CLOSE_WAIT
Como puede ver, no se notifica el puerto 80 ni el puerto 443. El puerto 8000 de workflows-django
de workflows-django
se abre por alguna razón en la interfaz IPv6. Además, me olvidé de deshabilitar postgres en la máquina host y aún así no chocan con los workflows-db
contenedores de postgres workflows-db
.
Todo se ejecuta en mi cuaderno local, así que supongo que no puede haber ninguna confusión con el host.
Mi versión docker es:
docker --version
Docker version 1.10.3, build 20f81dd
RESPUESTA: Esto está relacionado con el parámetro EXPOSE de la ventana acoplable. Si escribe esta línea en su archivo docker y ejecuta el contenedor con -p, el puerto estará visible en netstat. Si usa -p pero no escribe EXPOSE, su puerto no será listado por netstat.