При использовании Docker соединения ESTABLISHED не отображаются в netstat
У меня есть контейнер докеров, работающий на RHEL 7 с Docker 1.7.0. Программа, работающая в этом контейнере, прослушивает TCP-соединения на порту 5000.
В моем Dockerfile я помещаю предложение EXPOSE 5000, и я запускаю контейнер со следующей командой:
docker run \
--name myProgram \
--detach \
--publish 5000:5000 \
--volume /home/docker/apps/myProgram/logs:/var/log/myProgram/ \
--volume /home/docker/apps/myProgram/conf:/usr/local/snnotificationreceiver/conf/ \
--restart always \
10.167.152.15:5000/myProgram:1.0.0
Когда я выполняю netstat на хосте, я вижу сокет LISTEN:
[[email protected] bin]# netstat -naop | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 33595/docker-proxy off (0.00/0/0)
Я могу подключиться к приложению, подключившись к IP-адресу хоста на порту 5000, и данные, которые я отправляю приложению, приходят. Я знаю это, потому что я вижу это в своих журналах приложений, приложение также отправляет данные через сокет. Однако я не вижу никаких подключений ESTABLISHED, использующих netstat на хосте docker:
[[email protected] bin]# netstat -naop | grep ESTABLISHED
Я вижу соединение ESTABLISHED на стороне клиента, которое не использует докер:
[[email protected] ~]# netstat -naop | grep 5000
tcp 0 0 10.167.43.73:39218 10.167.152.138:5000 ESTABLISHED 21429/telnet off (0.00/0/0)
Я не нашел никакой команды докеров, эквивалентной или аналогичной netstat
Это нормально? Как я могу увидеть соединения ESTABLISHED с контейнером или докером-прокси?
Спасибо
Ответы
Ответ 1
Вы можете:
docker exec <containerid> netstat -tan | grep ESTABLISHED
или если у вас нет netstat в вашем изображении докеры:
docker inspect -f '{{.State.Pid}}' <containerid> # note the PID
sudo nsenter -t <pid> -n netstat | grep ESTABLISHED
nsenter является частью пакета util-linux.
(плагиат @larsks)
Ответ 2
Вы можете использовать этот фрагмент, чтобы получить все УСТАНОВЛЕННЫЕ для всех докеров в одном ряду (если вы получили nsenter
)
docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
do
echo $dockid $dockname
sudo nsenter -t $dockpid -n netstat -pan | grep ESTABLISHED
done
обратите внимание на УСТАНОВЛЕННОЕ в grep
.
вы можете переключиться на прослушивающее соединение с netstat -pnl
как TCP, так и UDP
docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
do
echo $dockid $dockname
sudo nsenter -t $dockpid -n netstat -pnl
done
или только TCP LISTEN
docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
do
echo $dockid $dockname
sudo nsenter -t $dockpid -n netstat -pnlt
done