index.html中的Docker Swarm服务发现

时间:2018-02-03 02:11:46

标签: docker containers

我有两个明确的网络应用(serverclient),我使用docker-compose和/或docker stack部署在docker swarm中。它们都具有通过其服务名称相互通信的API,因为它们都连接到相同的覆盖网络。 client用于对server进行REST调用的配置文件片段如下:

"server": {
  "url":"http://server:8085",
  "endpoints": {
    "devices": "/devices",
    "temperature": "/temperature",
    "mock": "/mock"
  }
}

通过主机名查找服务器在节点方面没有问题,因为它直接在docker容器内运行。但是,两个快递应用程序都提供网页。 clientserver的css和js依赖关系几乎完全相同,我不想两次编写每个样式表。我宁愿通过server来处理来自index.htmlserver的{​​{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 /域或以编程方式首先下载这些文件?

1 个答案:

答案 0 :(得分:0)

如果您的外部用户&#39;浏览器需要访问clientserver上的文件,然后您需要将Swarm服务发布到Swarm节点的外部IP,然后将这些IP放在DNS中名称或外部LB,仅使用这些URL进行远程连接。

当您这样做时,您可能需要将两个服务绑定到同一个端口(443)。如果是这种情况,那么您还需要另一层代理,根据路径或DNS名称将流量路由到正确的容器。

http://proxy.dockerflow.com/https://traefik.io/都可以为此目的而工作。