【问题标题】:Bind incoming docker connection to specific hostname inside docker container将传入的 docker 连接绑定到 docker 容器内的特定主机名
【发布时间】:2021-11-07 07:34:53
【问题描述】:

我正在尝试迁移一些基于 Webpack 的项目以在 docker 容器中运行,但在配置网络时遇到了一些问题。

  • 我们的 WebPack devServer 配置如下:
    {
        host: 'dev.ng.com',
        port: 4000,
        compress: true,
        disableHostCheck: true
    }

/etc/hosts 文件中我们有以下记录:

127.0.0.1    dev.ng.com

一切正常。

  • 当我在 docker 中运行它时,我收到了 EADDRNOTAVAIL 错误,直到我将以下几行添加到我的 docker-compose.yml
extra_hosts:
 - "dev.ng.com:127.0.0.1"

但现在我在 docker 应用程序中的应用程序无法从主机获得。

相关的docker-compose.yml部分如下:

  gui-client:
    image: "gui-client"
    ports:
      - "4000:4000"
    extra_hosts:
      - "dev.ng.com:127.0.0.1"

如果我将 Webpack 的 host: 'dev.ng.com' 更改为 host:'0.0.0.0',它可以正常工作,但我不想更改 Webpack 配置并按原样运行。

我对 docker 网络内部的了解受限于我猜想所有从主机到 docker 容器的入站连接都应该重定向到 dev.ng.com:4000,而现在它们重定向到 0.0.0.0:4000,可以实现吗?

【问题讨论】:

    标签: docker webpack networking docker-compose docker-networking


    【解决方案1】:

    是的,127.0.0.1 通常只能从本地主机访问。容器就像虚拟机一样工作。

    您需要将其配置为在任何地方进行监听。所以很有可能,"dev.ng.com:0.0.0.0" 就是你想要的。这些东西在正常情况下应该谨慎使用,因为大多数情况下我们不想将内部服务共享到互联网上。但在这里,它仅用于使您的配置独立于 docker 为您的容器应用程序提供的 ip/网络掩码。

    除此之外,您需要将主机的传入连接转发到您的容器。这可以通过一个

    - ports:
        "0.0.0.0:4000:4000"
    

    在你的 docker-compose.yml 中。

    您可能还希望使外部世界可以访问(主机的)端口 4000,这可以通过您的防火墙规则来完成。

    在专业配置中,通常会有一些前端(提供加密/安全/负载平衡),但如果您只想向老板展示您的工作,http://a.b.c.d:4000 就足够了。

    【讨论】:

    • 只是一个小问题,ports 配置有什么区别:"0.0.0.0:4000:4000""4000:4000" 在两种情况下都是一样的。
    • @Anatoly 第一个确保主机上打开的端口将在所有接口上打开。第二个没有。但可能 docker 将它打开到任何地方。
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多