【问题标题】:Docker Mac alternative to --net=hostDocker Mac 替代 --net=host
【发布时间】:2023-03-09 05:40:01
【问题描述】:

根据此处的 docker 文档

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

主机网络驱动程序仅适用于 Linux 主机,不支持 Docker for Mac、Docker for Windows 或 Docker EE for Windows Server。

在 Mac 上人们使用哪些替代方案?

我的场景

  1. 我想运行一个承载微服务的 docker 容器
  2. 微服务依赖于我也通过 docker 运行的数据库
  3. 我以为在 Mac 上运行微服务时可以使用 --net=host
  4. 但是微服务端口没有暴露出来
  5. 我可以覆盖微服务上的数据库地址(默认为 localhost)。
  6. 但这涉及到强大的 --env 使用

什么是最简单/最优雅的解决方案?

【问题讨论】:

    标签: macos docker host


    【解决方案1】:

    最简单最优雅的解决方案是使用名为bridge network的docker。 您可以像这样创建自定义桥接网络(默认为桥接):

    docker network create my-network
    

    部署在此网络中的每个容器都可以使用容器名称相互通信。

    $ docker run --network=my-network --name my-app ...
    $ docker run --network=my-network --name my-database...
    

    在上面的示例中,您可以使用my-database:port 从应用程序内部连接到数据库。如果容器端口在 Dockerfile 中公开,则无需将其映射到主机上,并且可以将所有通信保持在自定义 docker 网桥网络中。

    在大多数情况下,应用程序的端口已映射(例如:-p 80:80),因此 localhost:80 映射到 container:80,您可以从本地主机访问应用程序。如果应用程序需要与 db 通信,则无需公开 db 的端口,也不必将其映射到 localhost,如上所述。 只需在您的自定义桥接网络中保持 app 和 db 内部的通信即可。

    【讨论】:

    • 这迫使我执行上面的第 6 步。我无法在本地主机上引用数据库,而是需要引用容器名称换数据库。我希望找到一个不需要的解决方案。这将允许我使用微服务默认值(即 localhost)。
    • 在 docker for mac 上,您可以使用 host.docker.internal 作为主机来访问本地主机,但这可能仍然不能解决您的真正问题。另外 --add-host 是一个选项,但将 localhost 映射到您的数据库容器名称似乎是个坏主意stackoverflow.com/questions/31324981/…
    • 或者像thise这样的解决方案(我不知道grok,所以如果它是一个不好的解决方案,请不要对我开枪)fullstack.network/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多