【问题标题】:Docker for mac 1.12.0: how to connect to host from containerDocker for mac 1.12.0:如何从容器连接到主机
【发布时间】:2016-07-21 12:56:20
【问题描述】:

我已经在我的 os x 10.10 上更新了 docker,所以它现在使用的是 os x 本机虚拟化。但是,我发现从我的 nginx 容器中连接到我的主机很棘手。我试过这个:

/sbin/ip route|awk '/default/ { print $3 }'

得到了答案:

172.17.0.1

然后我在docker-compose.yml中使用了这个ip:

  extra_hosts:
    - "master:172.17.0.1" 

但我还是不断收到错误:

172.17.0.1 - - [21/Jul/2016:09:33:46 +0000] "GET /api HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" "-" 2016/07/21 09:33:46 [error] 7#7: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: soc-credit.ru, request: "GET /api HTTP/1.1", upstream: "http://172.17.0.5:8080/api", host: "localhost"

请注意这部分:client: 172.17.0.1。由于我已从主机发出请求,因此证明我在第一步中获得的 ip 是正确的。但是无论如何都没有建立连接。

我想强调的是,我在从容器内连接到主机时遇到问题,反之亦然。

我做错了什么?谢谢!

【问题讨论】:

  • 它并不是真正的“原生”——Mac 没有 Linux 内核,它只是更加无缝,使用 xhyve 而不是 VB 并使用 Unix 套接字进行通信,因此根据文档“不幸的是,由于由于 OSX 的限制,我们无法将流量路由到容器,也无法从容器路由回主机。”见herehere
  • 我想提问者很难从主机连接到容器。还是我弄错了?

标签: macos docker virtualization


【解决方案1】:

遇到了同样的问题,由于缺乏 Docker 和网络配置方面的经验,我很难让各种提议的解决方案发挥作用。然而,自从这次对 Docker for Mac 的更新以来: Docker Community Edition 17.06.0-ce-mac18, 2017-06-28 (stable) 我发现使用“实验”主机名docker.for.mac.localhost 允许我从容器内联系在 Mac 主机上运行的服务。对开发人员非常有用!

【讨论】:

  • 在连接 url 中用 docker.for.mac.localhost 替换 localhost 为我解决了这个问题。感谢您的简短解决方案
【解决方案2】:

我遇到了同样的问题,我发现了这个

https://docs.docker.com/docker-for-mac/networking/#/known-limitations-use-cases-and-workarounds

注意段落'我想从容器连接到主机上的服务'

我还没有尝试过,因为我正在寻找更具体的解决方案(无论如何,除了向我的 lo 地址添加别名)...

如果有人有东西请告知!

【讨论】:

  • 好吧,我实际上回到了 docker-machine,但是对于那些决定反对的人,我们找到了一个有争议的解决方案:$(ipconfig getifaddr en0)。我不想将其作为答案发布,因为它很难与 docker-compose 以及更多功能一起使用,在您更改网络后,您需要重新启动。
  • @Skeeve 因为我使用 docker-compose(在我的大部分服务中),所以我接受了文档的建议和 used sudo ifconfig lo0 alias 10.200.10.1/24。缺点(可能还有其他)是在开发中,如果重新启动,您需要再次设置别名。
  • 到目前为止我喜欢这个解决方案。您可以将其添加到 .bashrc 或 .zshrc 中,它会正常工作。我更关心 lo0 接口上可能存在的冲突。有可能吗?
  • 如果您尝试直接访问 IP 10.200.10.1 而它不是您的主机,则可能会发生冲突。使用 URL 访问远程地址不会有问题(我猜)。
【解决方案3】:

最新:DNS 名称 host.docker.internal 应该用于从容器解析主机。旧的别名(仍然有效)被弃用,取而代之的是这个。 (见https://datatracker.ietf.org/doc/html/draft-west-let-localhost-be-localhost-06)。 应使用 docker.for.mac.host.internal 而不是 Docker Community Edition 17.12.0-ce-mac46 2018-01-09 中的 docker.for.mac.localhost。 这允许您从 docker 容器中连接到在您的 Mac 上运行的服务。请参阅以下链接

understanding the docker.for.mac.localhost behavior

release notes

【讨论】:

    【解决方案4】:

    从docker 18.03开始官方建议连接特殊的DNS名称host.docker.internal,解析为主机使用的内部IP地址,这个是开发用的,参考https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 2018-01-09
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      相关资源
      最近更新 更多