Linux下Docker容器无法通过host.docker.internal连接主机问题
Docker容器无法通过host.docker.internal连接主机端口问题
我希望在Docker中部署Prometheus实例,并通过Prometheus Node Exporter获取主机指标。根据Docker文档,容器内可通过特殊DNS名称host.docker.internal连接主机,但Linux系统需手动通过extra_hosts配置该条目,我已配置但仍无法成功。
复现步骤
- 使用ncat在0.0.0.0:55555监听:
➜ ncat -vv -k -l -p 55555 Ncat: Version 7.80 ( https://nmap.org/ncat ) Ncat: Listening on :::55555 Ncat: Listening on 0.0.0.0:55555
- 在主机上验证可成功连接ncat:
➜ telnet localhost 55555 Trying ::1... Connected to localhost.
➜ ncat -vv -k -l -p 55555 Ncat: Version 7.80 ( https://nmap.org/ncat ) Ncat: Listening on :::55555 Ncat: Listening on 0.0.0.0:55555 Ncat: Connection from ::1. Ncat: Connection from ::1:48416.
- 通过Docker Compose启动容器,已在
extra_hosts中添加host.docker.internal:host-gateway:
➜ docker-compose down; docker-compose up -d; docker-compose logs -f
version: "3.9" services: prometheus: image: prom/prometheus:v2.42.0 user: "1000:1000" container_name: prometheus restart: unless-stopped ports: - "9090:9090" extra_hosts: host.docker.internal: "host-gateway" volumes: - "./config/prometheus.yml:/etc/prometheus/prometheus.yml" # Note that Prometheus requires the mounted `data/` directory # is created with fully open permissions, `chmod -R 777 data` - "./data/prometheus:/prometheus"
- 进入容器终端尝试连接主机ncat,报错:
➜ docker exec -it --user root prometheus /bin/sh
➜ telnet host.docker.internal 55555 telnet: can't connect to remote host (172.17.0.1): Connection refused
我已尝试多个相关解决方案,均无效。
调试信息
- 使用简单Alpine容器测试仍失败:
➜ docker run --add-host=host.docker.internal:host-gateway --rm -it alpine sh # inside the container: ➜ apk add curl ➜ curl http://host.docker.internal:55555 # curl: (7) Failed to connect to host.docker.internal port 55555 after 0 ms: Couldn't connect to server
- 确认ncat在TCP和TCP6的0.0.0.0监听:
➜ sudo netstat -tulpn | grep :55555 tcp 0 0 0.0.0.0:55555 0.0.0.0:* LISTEN 16150/ncat tcp6 0 0 :::55555 :::* LISTEN 16150/ncat
- 容器内可ping通host.docker.internal:
➜ ping host.docker.internal:55555 PING host.docker.internal:55555 (172.17.0.1): 56 data bytes 64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.049 ms 64 bytes from 172.17.0.1: seq=1 ttl=64 time=0.158 ms ^C --- host.docker.internal:55555 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.049/0.103/0.158 ms
- 容器内/etc/hosts已存在host.docker.internal条目:
➜ cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.1 host.docker.internal 172.17.0.2 84a18e1e361b
内容的提问来源于stack exchange,提问作者aSemy
相关产品推荐
相关产品推荐

