Докер и 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.
Ответы
Ответ 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
Если вы все еще чувствуете, что вам не хватает переадресации, отправьте обратно свою операционную систему, версию докеров и т.д.
Спасибо,