- API
- Web界面
在Docker Swarm中,如果要从集群外部访问创建的服务,则需要将服务的端口暴露并映射到节点(外部端口)。但是,如果您将端口80映射到API服务,则不能为Web界面服务映射相同的端口,因为该端口已经被占用。
如何解决这个问题?
就我所知,目前没有支持这种情况的方法。即使您想要在大型Swarm集群中放置所有服务和应用程序,也不可能实现,因为这种行为。
我是否遗漏了什么?有没有可以解决此问题的模式?
以下是一个快速示例,帮助您入门(基于this,仅供参考):
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
然后,您需要按照它的文档配置reverseProxy。
注意:我现在看到有新的AUTO配置可用-我还没有尝试过。
如果一切正常,最终结果如下:
服务域
或服务路径
将请求转发到适当的服务(我遇到了服务路径
的问题)[编辑2016/10/20]
忽略关于代理附加到相同覆盖网络的相同暴露端口的问题的所有内容。
我撤销了整个设置,重新开始——现在一切都按预期工作:我可以通过Docker Flow Proxy使用不同的域名访问多个(不同的)端口80服务。http://my-site.com # Web interface
http://my-site.com:8080 # API
或者使用一个代理,监听80端口,并根据路径将请求转发到正确的服务:
http://my-site.com # Web interface
http://my-site.com/api # API
[ 四年后回顾此问题,因为它仍然在得到投票,而且自提问以来发生了很多变化 ]
在Swarm模式或Linux中,您不能有多个服务同时监听同一端口。但是,您可以在该端口上运行某种第7层代理,根据应用程序级数据将路由定向到正确的容器。最常见的例子是各种http反向代理。
特别是对于Swarm Mode,traefik似乎是最受欢迎的反向代理。但是,还有其他基于HAProxy和Nginx的解决方案。
使用反向代理时,在Swarm模式下,您的任何一个容器都不会发布端口。相反,您将配置反向代理,其端口发布在类似80和443的端口上。然后,它将通过共享的Docker网络将请求通信到您的容器。为使此功能正常工作,每个容器都需要能够根据请求中的某些内容(例如主机名、路径、cookie等)分离要传输给它的流量。
如果需要公开暴露,则使用不同的端口:
docker service create -p 80:80 --name web nginx
然后执行
docker service create -p 8080:80 --name api myapi
在第二个示例中,公共端口8080映射到容器端口80。当然,如果它们不需要公共端口暴露,则可以通过使用容器名称和容器端口,在同一网络上的容器之间查看服务。
curl http://api:80
会找到名为api的容器,并使用DNS发现在同一网络上连接到端口80。