У меня проблемы с отправкой данных в контейнер 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
, то получу следующее:
:8125
(и:8126
) с использованием--publish
является правильным, и служба должна быть доступна на:8125
(и т. Д.) Портах вашего хоста. Что даетdocker container ls
? Контейнер запущен? Я так полагаю, потому что вы упомянули о возможности использовать его и статистику netcat. Я предполагаю, что ваш тест не работает с хоста. - person DazWilkin   schedule 13.07.2019EXPOSE XXXX
в Dockerfile, но это только документально. Когда вы запускаете (!) Контейнеры, вы должны либо указать--publish=XXXX:YYYY
, чтобы выставить:YYYY
на порт хоста:XXXX
, либо вы можете сделать, например,--net=host
, чтобы поместить контейнер в сеть хоста (и тогда не нужно использовать публикацию). - person DazWilkin   schedule 13.07.2019docker logs ...
для контейнера. - person DazWilkin   schedule 13.07.2019