从外部容器向docker上的statsd/graphite数据库发送数据时出现问题

从外部容器向docker上的statsd/graphite数据库发送数据时出现问题,docker,graphite,statsd,Docker,Graphite,Statsd,我在将数据发送到statsd容器时遇到问题。我可以在容器内部的命令行上成功发送数据。我需要能够从主机或其他Docker容器向其发送统计数据 在使用Kitematic时,我可以看到在两个容器上都检查了对“网桥”网络的选择。对于这个问题,我发现使用桥接网络是一个建议 我还尝试在运行构建容器的命令时将'-p'传递给Docker,因为这应该会暴露端口。我没有注意到它在从另一个容器发送数据时的行为方式有什么不同 使用localhost上的端口8125创建虚假统计信息的代码示例(取自此Docker容器网页)

我在将数据发送到statsd容器时遇到问题。我可以在容器内部的命令行上成功发送数据。我需要能够从主机或其他Docker容器向其发送统计数据

在使用Kitematic时,我可以看到在两个容器上都检查了对“网桥”网络的选择。对于这个问题,我发现使用桥接网络是一个建议

我还尝试在运行构建容器的命令时将'-p'传递给Docker,因为这应该会暴露端口。我没有注意到它在从另一个容器发送数据时的行为方式有什么不同

使用localhost上的端口8125创建虚假统计信息的代码示例(取自此Docker容器网页)

让我们用一个随机计数器来伪造一些数据,以证明一切正常

使用以下命令创建容器:

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
我已尝试确保两者都在同一个“网桥”网络上。我正在Windows 10 Enterprise上运行Docker Desktop。我发现了几个在Linux上处理iptables和网络的命令,但我觉得我遗漏了一些东西。我还可能提到,默认情况下,statsd在端口8125上使用UDP连接

如果尝试从网桥网络上的另一个容器运行示例命令,则不会得到任何结果。我知道数据(来自另一个容器)没有正确传递,因为我无法在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
,则会得到以下结果:


我发现我需要获取每个容器的特定IP地址,可以通过运行
docker inspect(网络名称)
找到该地址。在这种情况下,
bridge

然后我需要指定容器的IP地址。我用那个IP地址替换了建议的地址,它成功了


我发现我需要获取每个容器的特定IP地址,可以通过运行
docker inspect(网络名称)
找到该地址。在这种情况下,
bridge

然后我需要指定容器的IP地址。我用那个IP地址替换了建议的地址,它成功了


尽管它似乎在工作,但您无法ping端口。您所做的只是ping您的Windows主机。您对所做操作的描述是正确的。使用
--publish
:8125
(和
:8126
)上运行容器是正确的,服务应该在主机的
:8125
(等)端口上公开。您从docker容器ls中得到了什么?集装箱在运行吗?我这么想是因为你提到了能够使用它和netcat统计数据。我假设您的测试在主机上不起作用。旁白:Docker提供了一些混乱。构建(!)容器映像时,您可以在Dockerfile中包含
EXPOSE XXXX
,但这只是文档。运行(!)容器时,必须指定
--publish=XXXX:YYYY
以在主机的端口
:XXXX
上公开
:YYYY
,或者可以执行例如
--net=host
将容器放到主机的网络上(然后无需使用publish)。您还可以为容器添加
docker日志…
。谢谢您的输入。我添加了Docker容器ls命令的屏幕截图。我找到了一种方法来完成我想做的事情,我将编写一个解决方案。尽管它看起来很有效,但您无法ping端口。您所做的只是ping您的Windows主机。您对所做操作的描述是正确的。使用
--publish
:8125
(和
:8126
)上运行容器是正确的,服务应该在主机的
:8125
(等)端口上公开。您从docker容器ls中得到了什么?集装箱在运行吗?我这么想是因为你提到了能够使用它和netcat统计数据。我假设您的测试在主机上不起作用。旁白:Docker提供了一些混乱。构建(!)容器映像时,您可以在Dockerfile中包含
EXPOSE XXXX
,但这只是文档。运行(!)容器时,必须指定
--publish=XXXX:YYYY
以在主机的端口
:XXXX
上公开
:YYYY
,或者可以执行例如
--net=host
将容器放到主机的网络上(然后无需使用publish)。您还可以为容器添加
docker日志…
。谢谢您的输入。我添加了Docker容器ls命令的屏幕截图。我找到了一种方法来做我想做的事情,我会写一个解决方案。
 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>