J'expose les ports docker de mes contaners à la machine hôte avec quelque chose comme
docker run -p 80:80 ...
puis j'essaie d'afficher tous les ports d'écoute à des fins de débogage avec netstat
par exemple:
netstat -at
Chose étrange, Netstat n'affichera pas mes conteneurs Docker avec des ports exposés, bien qu'ils écoutent et répondent au navigateur.
Comment puis-je faire netstat
afficher ces ports exposés?
PDATE: 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 arrête de répondre au navigateur par http (port 80). Si je le redémarre, il recommence à répondre.
Voici la sortie 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 ne sont signalés. Port 8000 de workflows-Django
pour une raison quelconque est ouvert sur l'interface IPv6. De plus, j'ai oublié de désactiver les postgres sur la machine hôte et ils ne se heurtent toujours pas au conteneur postgres workflows-db
.
Tout fonctionne sur mon ordinateur portable local, donc je suppose qu'il ne peut y avoir aucune 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 EXPOSE du docker. Si vous écrivez cette ligne dans votre dockerfile et exécutez le conteneur avec -p, le port sera visible dans netstat. Si vous utilisez -p mais n'écrivez pas EXPOSE, votre port ne sera pas répertorié par netstat.
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$
Quelques éléments de base dont vous avez besoin pour vous vérifier:
docker ps
docker ps
lister la redirection de port? Comme ci-dessus, vous devriez pouvoir voir quelque chose comme ça 0.0.0.0:3030->80/tcp
Notez également que le docker-proxy est celui qui s'exécute sur l'hôte. Toutes les commandes ci-dessus supposent que vous exécutez sous Linux. Cela a été testé avec Ubuntu 15.10
Si vous pensez toujours que la transmission vous manque, veuillez renvoyer votre système d'exploitation, votre version Docker, etc.
Merci,