Возникли проблемы с отправкой данных в базу данных statsd / graphite на докере из внешнего контейнера

У меня проблемы с отправкой данных в контейнер statsd. Я могу успешно отправлять данные из командной строки внутри самого контейнера. Мне нужно иметь возможность отправлять на него статистические данные с хост-машины или из другого контейнера Docker.

Я использую Kitematic, я вижу, что выбор «мостовой» сети отмечен на обоих контейнерах. Я нашел способ решить эту проблему с помощью мостовой сети.

Я также попытался передать Docker -P при запуске команды для создания контейнера, так как это должно было открыть порты. Я не заметил разницы в его поведении при отправке данных из другого контейнера.

Пример кода, который запускается для создания поддельной статистики с использованием порта 8125 на локальном хосте (взято с этой веб-страницы контейнера Docker https://hub.docker.com/r/graphiteapp/graphite-statsd)

Давайте подделаем статистику с помощью случайного счетчика, чтобы доказать, что все работает.

while true; do echo -n "example:$((RANDOM % 100))|c" | nc -w 1 -u     127.0.0.1 8125; done

Контейнер создается с помощью следующей команды:

docker run -d --name graphite --restart=always -p 80:80 -p 2003-2004:2003-2004 -p 2023-2024:2023-2024 -p 8125:8125/udp -p 8126:8126 graphiteapp/graphite-statsd

Я попытался убедиться, что оба находятся в одной «мостовой» сети. Я использую Docker Desktop в Windows 10 Enterprise. Я нашел несколько команд, связанных с iptables и сетью в Linux, но мне кажется, что я чего-то упускаю. Я мог бы также упомянуть, что statsd по умолчанию использует UDP-соединение на порту 8125.

Если я попытаюсь запустить пример команды из другого контейнера в сети моста, я не получу никакого результата. Я знаю, что данные (из другого контейнера) не передаются правильно, потому что я не вижу их в показателях, получаемых на панели управления statsd.

Я могу ping localhost:8125 и получить ответ из другого контейнера. Снаружи (окно Powershell на хост-машине) это не разрешится.

 PING localhost:8125 (127.0.0.1): 56 data bytes
 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.024 ms
 64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.052 ms
 64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.031 ms
 ^C
 --- localhost:8125 ping statistics ---
 3 packets transmitted, 3 packets received, 0% packet loss
 round-trip min/avg/max = 0.024/0.035/0.052 ms>

Если я запустил docker container ls, то получу следующее:

обновленный скриншот контейнера ls


person vpm    schedule 13.07.2019    source источник
comment
Хотя кажется, что это работает, вы не можете проверить связь с портами. Все, что вы делаете, это проверяете связь со своим хостом Windows.   -  person DazWilkin    schedule 13.07.2019
comment
Ваше описание того, что вы сделали, верно. Запуск контейнера на :8125:8126) с использованием --publish является правильным, и служба должна быть доступна на :8125 (и т. Д.) Портах вашего хоста. Что дает docker container ls? Контейнер запущен? Я так полагаю, потому что вы упомянули о возможности использовать его и статистику netcat. Я предполагаю, что ваш тест не работает с хоста.   -  person DazWilkin    schedule 13.07.2019
comment
В сторону: Docker вносит некоторую путаницу. Когда вы создаете (!) Образы контейнеров, вы можете включить EXPOSE XXXX в Dockerfile, но это только документально. Когда вы запускаете (!) Контейнеры, вы должны либо указать --publish=XXXX:YYYY, чтобы выставить :YYYY на порт хоста :XXXX, либо вы можете сделать, например, --net=host, чтобы поместить контейнер в сеть хоста (и тогда не нужно использовать публикацию).   -  person DazWilkin    schedule 13.07.2019
comment
Вам также было бы интересно добавить docker logs ... для контейнера.   -  person DazWilkin    schedule 13.07.2019
comment
Спасибо за ваш вклад. Я добавил скриншот команды Docker container ls. Я нашел способ сделать то, что пытался сделать, напишу решение.   -  person vpm    schedule 18.07.2019


Ответы (1)


Я обнаружил, что мне нужно получить конкретный IP-адрес для каждого контейнера, который можно найти, запустив docker inspect (name of network). В данном случае bridge.

Затем мне нужно было указать IP-адрес контейнера. Я заменил предложенный адрес этим IP-адресом, и это сработало.

контейнер доступен из другого в мостовой сети

person vpm    schedule 18.07.2019