在docker容器中的golang net.LookupHost返回127.0.53.53

我正在编写一个小应用程序,该应用程序应该在Docker容器中运行,并且应该通过其主机名与其​​他Docker容器交互。

我想获得服务器的IP地址使用net.LookupHost,但我总是得到127.0.53.53

奇怪的是,我可以使用dns工具来获取正确的IP地址,就像从同一个容器中挖掘一样。 它只能在go程序中不起作用。

以下是我的代码中获取IP地址的部分。

zk_server_ips, err := net.LookupHost("zookeeper") addrs, err := net.LookupIP("testserver") if err != nil { fmt.Fprintf(w, "Failed to lookup ip address for testserver") return } for _, addr := range addrs { if ipv4 := addr.To4(); ipv4 != nil { fmt.Fprintf(w, "IPv4: %s", ipv4) } 

我已经阅读了很多,127.0.53.53是ICANN告诉我dsn setup有什么问题的方式,但是我不知道为什么它使用dig和drill而不是go代码。 !

另外什么是正确的方式来设置docker容器parsing主机名?

这些容器在Alpine linux映像上运行。

下面是我在容器中的resolv.conf:

 search fritz.box nameserver 127.0.0.11 options ndots:0 

.box是一个真正的顶级域名。 不要将其用于内部系统。

如果您需要将主机名称提供给本地系统,请使用为此目的而保留的.local TLD。

使用Telegraf时遇到同样的问题。

不幸的是我不知道根本原因,但是我可以通过设置--dns-search=.来解决这个问题--dns-search=. 当使用docker run或通过设置dns_search: . 在Docker Compose v1 yaml文件中:

 telegraf: image: telegraf:1.2.1-alpine dns_search: . volumes: - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro 

有关--dns-search开关的详细信息,请参阅Docker DNS文档 。