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.

18
demandé sur Boris Burkov 2016-04-06 17:59:56

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:

  1. utilisez-vous netstat avec des privilèges élevés? Il y a des choses risquent de manquer lorsque vous êtes non-root
  2. votre conteneur docker fonctionne-t-il sur le même hôte? Vérifiez avec docker ps
  3. docker ps liste des transferts de ports? Comme d'en haut, vous devriez être capable de voir quelque chose comme ça 0.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,

2
répondu Maniankara 2016-05-27 16:01:53