我有两个明确的网络应用(server
和client
),我使用docker-compose
和/或docker stack
部署在docker swarm中。它们都具有通过其服务名称相互通信的API,因为它们都连接到相同的覆盖网络。 client
用于对server
进行REST调用的配置文件片段如下:
"server": {
"url":"http://server:8085",
"endpoints": {
"devices": "/devices",
"temperature": "/temperature",
"mock": "/mock"
}
}
通过主机名查找服务器在节点方面没有问题,因为它直接在docker容器内运行。但是,两个快递应用程序都提供网页。 client
和server
的css和js依赖关系几乎完全相同,我不想两次编写每个样式表。我宁愿通过server
来处理来自index.html
和server
的{{1}}个文件的单个副本。
client
中的index.html
我可以使用相对路径,因为主机是相同的,因此暗示。但是,server
index.html
我需要一个完全合格的网址。类似的东西:
client
显然,一旦我从<link rel="stylesheet" href="http://server:8085/style.css">
index.html
向浏览器提供服务,这将无效,因为浏览器将通过互联网查找client
,而不是在docker overlay网络中查找这些服务。
我考虑过在http://server
的节点应用中下载client
之前的文件,但这并不是最干净的解决方案。
有没有一种优雅的方法来实现这一点,而无需将index.html
绑定到静态IP /域或以编程方式首先下载这些文件?
答案 0 :(得分:0)
如果您的外部用户&#39;浏览器需要访问client
和server
上的文件,然后您需要将Swarm服务发布到Swarm节点的外部IP,然后将这些IP放在DNS中名称或外部LB,仅使用这些URL进行远程连接。
当您这样做时,您可能需要将两个服务绑定到同一个端口(443)。如果是这种情况,那么您还需要另一层代理,根据路径或DNS名称将流量路由到正确的容器。
http://proxy.dockerflow.com/和https://traefik.io/都可以为此目的而工作。