web-dev-qa-db-fra.com

Docker et netstat: netstat n'affiche pas les ports, exposés par les conteneurs docker

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.

25
Boris Burkov

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:

  1. Utilisez-vous netstat avec des privilèges élevés? Quelque chose pourrait manquer lorsque vous n'êtes pas root
  2. Votre conteneur Docker fonctionne-t-il sur le même hôte que vous attendez? Vérifier avec docker ps
  3. Est-ce que 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,

2
Maniankara