【问题标题】:How to access a port on the host machine when running docker container on MacOS with --network=host?使用--network = host在MacOS上运行docker容器时如何访问主机上的端口?
【发布时间】:2020-04-24 18:30:55
【问题描述】:

我设置了几个相互交互的容器。主应用程序容器在--network = host 上运行,因为它查询在主机网络上暴露的不同端口上运行的多个 mySQL 容器。

我正在尝试访问主机上的应用程序,但出现错误:

curl: (7) 连接0.0.0.0 36081端口失败:连接被拒绝

我正在开发安装在 MacOS 上的 Docker。

我已经阅读了几个表明 MacOS 上的 docker 在 VM 上运行的问题。但是从主机访问应用程序的解决方法是什么?有什么方法可以获取该虚拟机的 IP?

【问题讨论】:

    标签: macos docker


    【解决方案1】:

    您不能在 Mac 上使用 --network=host 通过主机端口进行连接,但使用 -p 选项绑定到主机端口有效。

    https://docs.docker.com/docker-for-mac/networking/#/there-is-no-docker0-bridge-on-osx

    我想从 MAC 连接到一个容器

    端口转发工作 对于本地主机; --publish、-p 或 -P 都有效。从 Linux 公开的端口 转发给主机。

    我们目前的建议是发布一个端口,或者从 另一个容器。即使在 Linux 上,如果 容器位于覆盖网络上,而不是桥接网络上,因为它们是 未路由。

    对于您的用例,

    您需要创建一个 docker 网络并将数据库和应用程序容器都附加到该网络。然后容器将能够通过它们的名称相互交谈。您还可以发布应用程序容器端口,以便您可以从主机访问它。

    https://docs.docker.com/network/bridge/

    您可以使用 docker-compose,而不是手动创建网络、将容器附加到网络等。

    https://docs.docker.com/compose/

    【讨论】:

    • 这是真的,但是我正在使用映射到不同端口的多个 mySQL 容器,例如 ``mySQL1 -p 1200:3306 ``mySQL2 -p 1201:3306 在我的应用程序代码中,我连接到他们使用 0.0.0.0:1200 和 0.0.0.0:1201 这就是为什么我需要 network=host。容器之间的连接成功,我可以在应用程序容器内访问应用程序端口,但不能在外部访问。
    • 不确定你在问什么。您是否无法从您的 Mac 连接到应用程序或无法从您的应用程序连接到 MySQL?
    • --net host 禁用所有-p 选项(MacOS 或其他)。 0.0.0.0 是一个特殊的 IPv4 地址,意思是“无处不在”,您通常不应该对它进行出站连接;你的意思是 127.0.0.1?
    • @ShashankV 我无法从 Mac 连接到应用程序。其他一切都很好。
    • 啊,我明白了。您需要创建一个桥接网络并将数据库和应用程序容器都连接到网络。然后您的容器将按名称访问另一个容器。对于需要从宿主机访问的应用容器,可以绑定宿主机端口和容器端口。最好的方法是使用 docker-compose 代替手动完成所有这些操作,它将为您管理网络创建等。我已经用详细信息更新了答案。 docs.docker.com/network/bridgedocs.docker.com/compose
    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 2016-04-30
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多