docker群模式多个服务相同的端口

假设您的拓扑中有两个服务

  1. API
  2. Web界面

两者都假设在80端口上运行。

在Docker Swarm上创build服务时,如果要在群集外部访问它,则需要公开端口,并将该端口从服务映射到节点(外部端口)。 但是,如果您将端口80映射到可以说的API服务,那么您无法映射Web Interface服务的相同端口,因为它将被映射。

这怎么解决?

据我所见这个用例不被支持。 即使如果你想拥有一个大的群集,并通过在那里所有的服务和应用程序将不可能,因为这种行为。

我错过了什么?

任何模式来解决这个问题?

您可以查看Docker Flow:Proxy作为易于configuration的反向代理。

但是,正如其他评论家所指出的那样,我相信Docker 1.12群集模式在暴露相同端口的多个服务(如80或8080)方面存在根本问题。 它归结为(我想)网格路由魔术 – 这是一个四级的四个东西,基本上是TCP / IP – 换句话说,IP地址+端口。 因此,当多个服务在端口8080上列出时,情况就会变得混乱。网状路由器将愉快地将stream向端口8080的stream量传送到暴露相同端口的任何服务。

您可以使用群集模式中的覆盖networking来隔离彼此的事情,但是当您必须将服务连接到代理(覆盖networking)时,问题就出现了 – 在这一点上,事情似乎变得混乱起来(这就是我所处的位置现在有困难)。

我现在的解决scheme是让面向代理(覆盖)networking的服务需要暴露于净使用端口(这些服务不必被发布到群集中)然后实际上使用像Docker Flow Proxy这样的东西来处理所需端口上的传入stream量。

快速取样让你我开始(大致基于这个 :

docker network create --driver overlay proxy docker network create --driver overlay my-app # App1 exposed port 8081 docker service create --network proxy --network my-app --name app1 myApp1DockerImage docker service create --name proxy \ -p 80:80 \ -p 443:443 \ -p 8080:8080 \ --network proxy \ -e MODE=swarm \ vfarcic/docker-flow-proxy #App2 exposes port 8080 docker service create --network proxy --network my-app --name app2 myApp2DockerImage 

然后按照文档configurationreverseProxy。

注:我看到现在有新的AUTOconfiguration可用 – 我还没有尝试过这一点。

最终结果如果一切正常的话

  • 代理侦听端口80,443(和8080的configuration调用,所以保持closures公共networking!)
  • 代理转发到适当的服务,基于service domainservice path (我有问题的service path
  • 服务可以通过隔离的覆盖networking进行内部通信。
  • 服务不会不必要地向群发布端口

[编辑2016/10/20]

忽略上面所有关于与代理服务器相同的覆盖networking上相同的暴露端口的问题。

我撕下了我的洞设置,并再次开始 – 一切工作如期:我可以通过dockerstream代理使用不同的域,访问端口80上的多个(不同的)服务。

还使用提到的自动configuration – 一切都像一个魅力工作。

如果需要公开曝光,请使用不同的端口:

docker service create -p 80:80 --name web nginx

接着

docker service create -p 8080:80 --name api myapi

在第二个示例中,公共端口8080映射到容器端口80.当然,如果不需要公开端口,则可以使用容器名称和容器端口查看同一networking上容器之间的服务。

curl http://api:80

将find一个名为api的容器,并使用同一networking上的容器的DNS发现连接到端口80。

如果你需要公开API和Web界面,你有两个select。 为服务使用不同的端口

 http://my-site.com # Web interface http://my-site.com:8080 # API 

或者使用侦听端口80的代理并根据path转发请求以更正服务:

 http://my-site.com # Web interface http://my-site.com/api # API