При использовании 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