【问题标题】:Use host networking and additional networks in docker compose在 docker compose 中使用主机网络和其他网络
【发布时间】:2016-07-08 14:57:07
【问题描述】:

我正在尝试为我的项目设置开发环境。

我有一个容器 (ms1) 应该放在他自己的网络中(在我的例子中是“服务”),还有一个容器(apigateway)应该访问该网络,同时将 http 端口暴露给主机的网络。

理想情况下,我的 docker compose 文件应如下所示:

version: '2'
services:
    ms1:
        expose:
            - "13010"
        networks:
            services:
                aliases:
                    - ms1
   apigateway:
        networks:
            services:
                aliases:
                    - api
        network_mode: "host"
networks:
    services:

docker-compose 不允许同时使用 network_mode 和 networks。

我还有其他选择吗?

目前我正在使用这个:

   apigateway:
        networks:
            services:
                aliases:
                    - api
        ports:
            - "127.0.0.1:10000:13010"

然后 apigateway 容器监听 0.0.0.0:13010。它可以工作,但速度很慢,如果主机的 Internet 连接中断,它就会死机。

另外,我计划将来在 docker 上使用 vagrant,它允许以干净的方式解决吗?

【问题讨论】:

  • 你可以只使用来自apigateway的ms1 IP地址吗?请参阅stackoverflow.com/questions/27937185/… 如何使用 docker 1.10.1
  • 我正在尝试做同样的事情,但要解决不同的问题(也许)。就我而言,我创建了一个在两个服务之间共享的网络,但由于某种原因,其中一个服务没有连接到互联网(我认为原因是它不是主机网络的一部分)。但是,问题在于它无法解析 URL,因为无法访问 DNS。我使用 IP 地址进行了快速修复,但会彻底查看它以将请求转发到正确的 DNS。

标签: networking docker vagrant docker-compose devops


【解决方案1】:

expose 在 docker-compose does not publish the port on the host 中。由于您可能不再需要服务链接(相反,您应该像现在一样依赖 Docker 网络),因此该选项的价值通常有限,并且在您的场景中似乎对您没有任何价值。

怀疑你是误用了它,在意识到它本身似乎没有任何效果之后,偶然发现使用主机网络驱动程序会“使这行得通”。请注意,这与 expose 属性无关。只是主机网络驱动程序让包含的进程直接绑定到主机网络接口。因此,您可以从外部访问 API 网关进程。您可以删除 expose 属性,它仍然可以工作。

如果这是您选择主机网络驱动程序的唯一原因,那么您已成为X-Y problem 的受害者:

(tl;dr) 在正常情况下,您永远不需要使用主机网络驱动程序,默认的网桥网络驱动程序可以正常工作。您要查找的是ports 属性,而不是expose。这会在后台设置适当的端口转发。

【讨论】:

    【解决方案2】:

    在 docker 1.13 中,您应该能够创建一个服务来桥接两个网络。我正在使用类似于修复 another problem 的东西,我认为这在这里也有帮助:

    docker service create \
    --name proxy \
    --network proxy \
    --publish mode=host,target=80,published=80 \
    --publish mode=host,target=443,published=443 \
    --constraint 'node.hostname == myproxynode' \
    --replicas 1 \
    letsnginx
    

    【讨论】:

      【解决方案3】:

      我会试试这个:

      1/ 查找主机网络 docker network ls

      2/ 使用这个 dockercompose 文件

           services:
                ms1:
                    ports:
                        - "13010"
                    networks:
                        - service
                apigateway:
                    networks:
                        - front
                        - service
      
            networks:
                front:
                service:
                    external:
                        name: "<ID of the network>"
      

      【讨论】:

      • 当我尝试使用上面的命令创建主机网络时,我收到此错误Error response from daemon: only one instance of "host" network is allowed
      • 所以你可以使用已经存在的那个。我更新了我的答案,但我无法测试它。
      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多