Подтвердить что ты не робот

Докер и netstat: netstat не показывает порты, выставленные контейнерами докеров

Я выставляю порты докеров моим коннекторам на хост-машине с чем-то вроде

docker run -p 80:80 ...

то я пытаюсь отобразить все порты прослушивания для целей отладки с помощью netstat например:

netstat -at

Странно то, что netstat не будет отображать мои контейнеры докеров с открытыми портами, хотя они слушают и отвечают на браузер.

Как сделать netstat отображение этих открытых портов?


UPDATE: Я запускаю это на Debian 8 Jessie. Вот что я делаю:

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

Здесь docker сообщает, что контейнерные порты пересылаются хосту. Более того, если я останавливаю контейнер workflows-nginx, он перестает отвечать на браузер по http (порт 80). Если я начну его снова, он снова начнет отвечать.

Вот результат 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

Как вы можете видеть, ни порт 80, ни порт 443 не сообщаются. Порт 8000 из workflows-django по какой-либо причине открывается на интерфейсе IPv6. Более того, я забыл отключить postgres на хост-машине, и все же они не сталкиваются с контейнером postgres workflows-db.

Все работает на моем локальном ноутбуке, поэтому я думаю, что не может быть путаницы с хостом.

Моя версия докера:

docker --version
Docker version 1.10.3, build 20f81dd

ОБНОВЛЕНИЕ 2: Это связано с параметром EXPOSE докера. Если вы напишете эту строку в файле docker и запустите контейнер с -p, порт будет виден в netstat. Если вы используете -p, но не пишите EXPOSE, ваш порт не будет указан netstat.

4b9b3361

Ответ 1

netstat должен отображать открытые порты. Вот пример

[email protected]:docker$ sudo netstat -at|grep 3030
[email protected]:docker$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[email protected]:docker$ docker run -d -p 3030:80 httpd:2.4
4310ac5fbdbc7314ab4d23e34099a710a3a8790dcf2c6d0a84202c1de5c9fd30
[email protected]: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
[email protected]:docker$ sudo netstat -at|grep 3030
tcp6       0      0 [::]:3030               [::]:*                  LISTEN
[email protected]:docker$ sudo netstat -tulpn|grep 3030
tcp6       0      0 :::3030                 :::*                    LISTEN      10294/docker-proxy
[email protected]:docker$ 

Некоторые основные вещи, которые вам необходимо проверить:

  • Вы используете netstat с повышенными привилегиями? Что-то может не хватать, если вы не root.
  • Является ли ваш контейнер докеров запущен на том же хосте, который вы ожидаете? Проверьте с помощью docker ps
  • Указывает ли docker ps переадресацию портов? Как и выше, вы должны увидеть что-то вроде этого 0.0.0.0:3030->80/tcp

Также обратите внимание, что прокси-сервер-докер - тот, который работает на хосте. Все вышеприведенные команды предполагают, что вы запускаете на linux. Это было протестировано с помощью ubuntu 15.10

Если вы все еще чувствуете, что вам не хватает переадресации, отправьте обратно свою операционную систему, версию докеров и т.д.

Спасибо,