Docker et netstat: netstat ne montre pas de ports, exposés par des conteneurs docker
j'expose le panneau de ports de mon contaners à la machine hôte avec quelque chose comme
docker run -p 80:80 ...
puis j'essaie d'afficher tous les ports d'écoute pour le débogage avec netstat
e.g.:
netstat -at
ce qui est étrange, c'est que netstat n'affiche pas mes conteneurs docker avec des ports exposés, bien qu'ils écoutent et répondent au navigateur.
Comment faire netstat
afficher les personnes exposées les ports?
mise à jour: J'exécute ceci sur Debian 8 Jessie. Voici ce que je fais:
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
ici docker signale que les ports de conteneurs sont transmis à l'hôte. De plus, si j'arrête workflows-nginx
conteneur, il cesse de répondre au navigateur par http (port 80). Si je le redémarre, il recommence à répondre.
voici le résultat de 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
Comme vous pouvez le voir, ni le port 80, ni le port 443 signaler. Port 8000 de workflows-django
pour une raison quelconque est ouvert sur l'interface IPv6. De plus, j'ai oublié de désactiver postgres sur la machine hôte et pourtant ils ne s'opposent pas avec le conteneur postgres workflows-db
.
Tout fonctionne sur mon carnet local, donc je suppose qu'il ne peut pas y avoir de confusion avec l'hôte.
ma version docker est:
docker --version
Docker version 1.10.3, build 20f81dd
ANSWER: ceci est lié au paramètre D'exposition du docker. Si vous écrivez cette ligne votre fichier dockerfile et exécuter le conteneur avec -p, le port sera visible dans netstat. Si vous utilisez-p mais n'écrivez pas EXPOSE, votre port ne sera pas listé par netstat.
1 réponses
netstat devrait afficher les ports exposés. Voici un exemple
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$
Certaines choses de base que vous devez vérifier vous-même:
- utilisez-vous netstat avec des privilèges élevés? Il y a des choses risquent de manquer lorsque vous êtes non-root
- votre conteneur docker fonctionne-t-il sur le même hôte? Vérifiez avec
docker ps
docker ps
liste des transferts de ports? Comme d'en haut, vous devriez être capable de voir quelque chose comme ça0.0.0.0:3030->80/tcp
notez aussi que le docker-proxy est celui qui tourne sur l'hôte. Toutes les commandes ci-dessus supposent que vous utilisez linux. Cela a été testé avec ubuntu 15.10
si vous pensez toujours que vous manquez la redirection, alors postez votre système D'exploitation, version docker, etc.
Merci,