从容器内部刮取docker度量

从容器内部刮取docker度量,docker,networking,iptables,socat,Docker,Networking,Iptables,Socat,我正试图从一个容器里刮东西。我见过普罗米修斯的创造者这样做。我无法复制它 配置 我已经通过json配置公开了docker度量页面 { “指标地址”:“172.17.0.1:4999”, “实验性”:真的吗 } 我也尝试过使用0.0.0.0。在任何情况下,我都能够从主机本身卷曲而没有任何问题 $ curl 172.17.0.1:4999/metrics | more % Total % Received % Xferd Average Speed Time Time

我正试图从一个容器里刮东西。我见过普罗米修斯的创造者这样做。我无法复制它

配置 我已经通过json配置公开了docker度量页面

{
“指标地址”:“172.17.0.1:4999”,
“实验性”:真的吗
}
我也尝试过使用0.0.0.0。在任何情况下,我都能够从主机本身卷曲而没有任何问题

$ curl 172.17.0.1:4999/metrics | more

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0# HELP builder_builds_failed_total Number of failed image builds
# TYPE builder_builds_failed_total counter
builder_builds_failed_total{reason="build_canceled"} 0
builder_builds_failed_total{reason="build_target_not_reachable_error"} 0
...
从集装箱内部 但是,我无法从容器中获得相同的度量页面。我试着去想象,和视频里的一样。我还尝试了其他一些方法,比如从容器内部使用curl等等

图像基本上只做一件事

ENV IN="172.17.0.1:4999" \
    OUT="4999"

ENTRYPOINT socat -d -d TCP-L:$OUT,fork TCP:$IN
启动Socat容器 卷曲容器已发布的端口 连接刚刚挂起
socat
图像识别连接,但它会挂起1-2分钟并超时

2021/04/02 16:29:53 socat[8] N accepting connection from AF=2 172.17.0.1:57678 on AF=2 172.17.0.2:4999
2021/04/02 16:29:53 socat[8] N forked off child process 9
2021/04/02 16:29:53 socat[8] N listening on AF=2 0.0.0.0:4999
2021/04/02 16:29:53 socat[9] N opening connection to AF=2 172.17.0.1:4999
2021/04/02 16:32:04 socat[9] E connect(5, AF=2 172.17.0.1:4999, 16): Operation timed out
2021/04/02 16:32:04 socat[9] N exit(1)
2021/04/02 16:32:04 socat[8] N childdied(): handling signal 17
2021/04/02 16:32:04 socat[8] W waitpid(): child 9 exited with status 1
防火墙 我慢慢地想知道它是否可能是我的
iptables
规则中的某个东西。我在下面发布了
INPUT
DOCKER-USER
chain。这些是我唯一改变自己的

sudo iptables -L -n -v
Chain INPUT (policy DROP 32060 packets, 1810K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 716K 1484M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 599K 1069M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   16  3138 ACCEPT     all  --  eth0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
   12   624 DROP       all  --  eth0   *       0.0.0.0/0            0.0.0.0/0           
74921  139M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           


因此,事实证明,这些问题确实存在。在这种情况下,
输入
链的默认策略是
删除
。由于容器现在正试图到达主机系统本身,其通信量将通过输入链

所以我现在添加了两个简单的规则,允许
INPUT
链中来自
docker0
docker\u gwbridge
的所有流量

sudo iptables -A INPUT -i docker0 -j ACCEPT
sudo iptables -A INPUT -i docker_gwbridge -j ACCEPT
之后,我终于能够从容器内部查询docker度量

docker run --rm curlimages/curl -I -m 10 172.17.0.1:4999/metrics
HTTP/1.1 200 OK
Content-Type: text/plain; version=0.0.4; charset=utf-8
Date: Sat, 03 Apr 2021 10:53:12 GMT

您使用的是哪个操作系统?啊,对不起,这是ubuntu 20See。metrics服务器位于主机上,而不是容器内。您可以访问主机内部的指标的一种方法是使用主机ip,为此,您应该使指标侦听
0.0.0
,正如我提到的,我已经尝试了0.0.0。如果我使用hostip,那么我不需要代理它,那将是毫无意义的。然后我可以直接查询hostip:4999/metrics。此代理设置的原因与您在视频中看到的一样,是在全局模式下将其部署为服务。此外,metrics服务器正在docker_gwbridge上运行,所有容器都可以访问该服务器。Socat也没有说连接被拒绝,因为它发生在完全无效的地址上。同样,在视频中的图像中,它没有使用hostip。您甚至如何从容器内部将hostaddress与socat绑定?容器在某种程度上是它自己的主机,对吗?只有网络模式主机才能做到这一点。
sudo iptables -L -n -v
Chain INPUT (policy DROP 32060 packets, 1810K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 716K 1484M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
 599K 1069M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   16  3138 ACCEPT     all  --  eth0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
   12   624 DROP       all  --  eth0   *       0.0.0.0/0            0.0.0.0/0           
74921  139M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

sudo iptables -A INPUT -i docker0 -j ACCEPT
sudo iptables -A INPUT -i docker_gwbridge -j ACCEPT
docker run --rm curlimages/curl -I -m 10 172.17.0.1:4999/metrics
HTTP/1.1 200 OK
Content-Type: text/plain; version=0.0.4; charset=utf-8
Date: Sat, 03 Apr 2021 10:53:12 GMT