Docker 容器内访问宿主机的问题

213 天前
 ztfot

想使用node_exporter监控,但端口不想暴露在公网(开启 ufw),如果想让prometheus容器访问宿主机localhost:9100 应该怎么做

2254 次点击
所在节点    Docker
16 条回复
Navee
213 天前
node-exporter 的话
要么暴露公网+防火墙规则限制
要么暴露公网+basic auth
ixiaohei
213 天前
你说的公网是指互联网么?
shelken
213 天前
进去你的 prometheus 容器看看 host.docker.internal 实际的请求 ip ,然后 ufw 对这个 ip 开放
wheat0r
213 天前
能确定在不开防火墙情况下 host.docker.internal:9100 可以访问吗?
Etuloser
213 天前
host.docker.internal 是可以的 你是不是配置错了

容器内部要想使用宿主机的服务器,可以使用 host.docker.internal:host-gateway 映射的方式来解决:
1. 命令行启动
--add-host=host.docker.internal:host-gateway
2. compose file (注意,在 build 时不支持)
extra_hosts:
- "host.docker.internal:host-gateway"
3. 在容器内可以通过 host.docker.internal 来访问宿主机的 127.0.0.1
LoliconInside
213 天前
Prometheus 和 Node Exporter 都开--net-host
Prometheus 和 Node Exporter 配置中指定都监听 127.0.0.1
Prometheus 通过 127.0.0.1 访问 NodeExporter
lovelylain
213 天前
不要映射到 127.0.0.1 ,映射到 docker0 的 ip 地址。
fmd12345
213 天前
直接访问 172.18.0.1:9100 不行吗?你的 network_mode 都是 host 了,理论上就是 0.0.0.0 的监听吧?那 172.18.0.1 不就是宿主机 ip 了吗?反正看你的 prometheus-bridge 也是固定的
ztfot
213 天前
问题依然还在
![]( https://media.kivvi.me:443/media/202405201108150.png)
关闭防火墙后就可以使用???
![]( https://media.kivvi.me:443/media/202405201116866.png)
有没有更好的解决方案? 或者我哪里配置错了?

prometheus 配置:
```
docker run -d -p 127.0.0.1:9090:9090 \
-v /storage/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
--add-host=host.docker.internal:host-gateway \
--restart=always \
--name=prometheus \
--net=prometheus-bridge \
--ip 172.18.0.2 \
prom/prometheus
```

node_exporter 配置:
```
version: '3.8'

services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
```

网桥信息:
```
root@it7:~# docker inspect prometheus-bridge
[
{
"Name": "prometheus-bridge",
"Id": "9db3ba11ccefb523a85ef3713777c780c49f0bf64f6065dd7bbd0d77d45da612",
"Created": "2024-05-17T15:56:49.735352162+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/24",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"028e10760ce3a47680d4b9b0c7bce38ecfb7e8588be860d5523ab93dcbc8b5ae": {
"Name": "prometheus",
"EndpointID": "c5675e399cf1e0fe1e843a9995e31836ab21de23db25c8bfdd54ba9197d28405",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/24",
"IPv6Address": ""
},
"29b6830a07165ac45fb176e48a14b4b31e4f1925c9b580c4528c836a5978dd3c": {
"Name": "xxx",
"EndpointID": "52acddb87f3515af70c39d38784dbef7dd0506ce94881410cddfdbdea04bb6f5",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/24",
"IPv6Address": ""
},
"70edf1712821c9efd62dbb57f15f78329923409ac874157bc07b547535062478": {
"Name": "xxx",
"EndpointID": "dd32442417a928a22477c587dc9cecebb6162ee1b93b748310e57109f341ebca",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/24",
"IPv6Address": ""
},
"eddd3efc96103784a7a5e961b988d56503131eefdd934657532441edf75b15d7": {
"Name": "xxx",
"EndpointID": "255eb88cb2e8706383f4aabc4d7be8de7cc9916929ddb71480b541d4c4399a5e",
"MacAddress": "02:42:ac:12:00:05",
"IPv4Address": "172.18.0.5/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
```

docker 版本:
```
root@it7:~# docker version
Client: Docker Engine - Community
Version: 26.1.3
API version: 1.45
Go version: go1.21.10
Git commit: b72abbb
Built: Thu May 16 08:33:29 2024
OS/Arch: linux/amd64
Context: default

Server: Docker Engine - Community
Engine:
Version: 26.1.3
API version: 1.45 (minimum version 1.24)
Go version: go1.21.10
Git commit: 8e96db1
Built: Thu May 16 08:33:29 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.31
GitCommit: e377cd56a71523140ca6ae87e30244719194a521
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
root@it7:~#
```


@Etuloser
@fmd12345
@LoliconInside 普罗米修斯已经设置网桥很多东西都连在上面,设 host 会冲突
ztfot
213 天前
![]( )
![]( )
fmd12345
213 天前
懂了,你 ufw 允许一下内网 ip 呢? ufw allow from xx.xx.xx.xx to any port 22
cm98
213 天前
了解下 pushgateway ?
wheeler
213 天前
unix domain socket 转一下?
ztfot
213 天前
@fmd12345 ufw 9100 ALLOW 172.18.0.2 就允许了这一个 IP , 之前没想到,算是曲线救国了 :)
z1WhpL268TWE173O
201 天前
@Etuloser #5 请问下, 这个--add-host=host.docker.internal:host-gateway
中的 host-gateway 是宿主机的 ip, 还是这个容器网络的网关 ip? 还是说直接就是 --add-host=host.docker.internal:host-gateway
z1WhpL268TWE173O
201 天前
https://github.com/qoomon/docker-host 推荐下这个,可以转发所有或指定的 docker 的流量, 我也面对你这个问题, 折腾了很久.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1042150

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX