При использовании Docker установленные соединения не отображаются в netstat

у меня есть контейнер docker, работающий на 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 socket:

[root@server bin]# netstat -naop | grep 5000
tcp6       0      0 :::5000                 :::*                    LISTEN      33595/docker-proxy   off (0.00/0/0)

Я могу подключиться к приложению, подключившись к IP-адресу хоста на порту 5000 и данные, которые я отправляю в приложение прибывает. Я знаю это, потому что я вижу это в своих журналах приложений, приложение также отправляет данные через сокет. Однако я не вижу никаких установленных соединений с использованием netstat на хосте docker:

[root@server bin]# netstat -naop | grep ESTABLISHED 

Я вижу установленное соединение на стороне клиента, которое не использует docker:

[root@client ~]# 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)

Я не нашел эквивалента команды docker или аналогичного netstat Это нормально? Как я могу увидеть установленные соединения с контейнером или с докер-прокси?

спасибо

2 ответов


Вы можете:

docker exec <containerid> netstat -tan | grep ESTABLISHED

или если у вас нет netstat в образе docker:

docker inspect -f '{{.State.Pid}}' <containerid> # note the PID
sudo nsenter -t <pid> -n netstat | grep ESTABLISHED

nsenter является частью пакета util-linux. (плагиат @larsks)


вы можете использовать этот фрагмент, чтобы получить все установленные для всех докеров в одной строке (если у вас есть nsenter)

docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
    do
    echo $dockid $name
    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 $name
    sudo nsenter -t $dockpid -n netstat -pnl
done

или только TCP слушайте

docker inspect --format '{{.State.Pid}} {{printf "%.13s" .ID}} {{.Name}}' \
$(docker ps --format '{{.ID}}') | while read dockpid dockid dockname
    do
    echo $dockid $name
    sudo nsenter -t $dockpid -n netstat -pnlt
done