2016-03-21 98 views
8

我正在尝试为我的项目设置开发环境。在Docker中使用主机网络和其他网络撰写

我有一个容器应该放在他自己的网络(“服务”在我的情况),和一个容器(apigateway)应该访问该网络,同时暴露一个HTTP端口到主机的网络。

理想的情况下我的搬运工撰写的文件应该是这样的:

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

泊坞窗,撰写不允许在同一时间使用network_mode和网络。

我还有其他的选择吗?

目前我使用的是这样的:

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

然后apigateway容器上0.0.0.0:13010监听。它可以工作,但速度很慢,如果主机的互联网连接断开,它会冻结。

另外,我正计划在码头工人未来使用流浪者,它是否允许以一种干净的方式解决?

+0

你能直接使用一个IP地址ms1吗?请参阅https:// stackoverflow。com/questions/27937185/assign-static-ip-to-docker-container如何用docker做到这一点1.10.1 –

+0

我试图做同样的事情,但要解决一个不同的问题(也许)。在我的情况下,我创建了两个服务之间共享的网络,但由于某种原因,其中一个服务未连接到互联网(我认为原因不是主机网络的一部分)。但是,问题在于它无法解析URL,因为无法访问DNS。我做了一个使用IP地址的quickfix,但会彻底查看它以将请求转发给正确的DNS。 – omrsin

回答

0

我想试试这个:

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>" 
+0

当我尝试使用上述命令创建主机网络时,出现此错误:来自守护进程的错误响应:只允许“主机”网络的一个实例“ – disrvptor

+0

因此,您可以使用已存在的一个实例。我更新了答案,但我没有能力对其进行测试。 – Plup

0

在搬运工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 
0

expose在泊坞窗,撰写does not publish the port on the host。由于您可能不再需要服务链接(相反,您应该依赖Docker网络,因为您已经这样做),但该选项的总体价值有限,似乎在您的方案中对您没有任何价值。

嫌疑你来使用它的错误,并意识到它似乎没有任何效果本身后,偶然发现了一个事实,即使用主机的网络驱动器将“使工作”。这与expose财产无关,请介意你。只是主机网络驱动程序允许包含的进程直接绑定到主机网络接口。得益于此,您可以从外部访问API网关进程。你可以删除expose属性,它仍然可以工作。

如果这就是为什么你选择了主机网络驱动程序的唯一原因,那么你已经爱上受害者X-Y problem

(TL; DR) 你不应该需要使用主机的网络驱动程序在正常情况下,默认桥接网络驱动程序工作得很好。你要找的是ports属性,而不是expose。这在后台设置了适当的端口转发。

相关问题