【问题标题】:golang net.LookupHost in docker container return 127.0.53.53docker容器中的golang net.LookupHost返回127.0.53.53
【发布时间】:2017-04-27 21:56:16
【问题描述】:

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

我正在尝试使用 net.LookupHost 获取服务器的 IP 地址,但我总是得到 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 设置有问题的方式,但我不知道为什么它与 dig and Drill 一起工作,而不是来自 go 代码。 !

还有什么是设置 docker 容器来解析主机名的正确方法?

容器在 Alpine linux 镜像上运行。

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

search fritz.box
nameserver 127.0.0.11
options ndots:0

【问题讨论】:

  • 你的 resolv.conf 是什么样的。当您要求提供裸主机名时,可能是解析器占用了您的域名?
  • 搜索 fritz.box 名称服务器 127.0.0.11 选项 ndots:0
  • 你安装了类似 pow 的东西吗?还是 docker 拦截。
  • @Doon 不,我没有安装 pow。只是裸露的高山图像。

标签: go docker containers


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    .box is a real TLD.不要用于内部系统。

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

    【讨论】:

    • 抱歉我的回复晚了。问题是这是由路由器 dhcp 服务器设置的,我必须找到一种方法来更改它,因为路由器接口中没有地方可以这样做。但是为什么它可以通过 dns 工具而不是 gethostbyname 工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多