微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将侦听同一端口的堆栈的多个实例部署到 Docker Swarm在反向代理后面?

如何解决如何将侦听同一端口的堆栈的多个实例部署到 Docker Swarm在反向代理后面?

我有一个docker-compose.yml 文件中定义的多容器 Web 应用程序。在我们的测试环境中,我希望在同一个 Docker Swarm 主机上运行这个堆栈的多个实例。除了一些次要的配置细节外,堆栈将是相同的(例如,每个堆栈可能使用不同的数据库和/或容器映像标签)。

具体来说,我希望它的工作方式如下:

  • https://awesomeco.com/dev-app/ 将指向开发堆栈
  • https://awesomeco.com/test-app/ 将指向测试堆栈
  • https://awesomeco.com/qa-app/ 将指向 QA 堆栈

所有 3 个堆栈都将使用相同的 docker-compose.yml 文件

我打算为每个堆栈使用唯一命名的 Docker 网络,以防止容器在堆栈内通信时发生命名冲突。但是,我不清楚如何在所有堆栈前放置 Nginx 反向代理以将流量路由到正确的堆栈,因为每个堆栈都将具有相同的服务名称集。

例如,如果每个堆栈都有一个名为 web-app 的服务,并且我的 Nginx 反向代理连接到所有堆栈网络,我如何将流量路由到 {{1} 的“正确”实例} 服务?

有谁知道如何最好地实现这一目标?而且,如果这是不可能的并且每个堆栈必须具有唯一命名的服务,堆栈容器之间的通信会不会突然变得更加困难?例如,服务名称目前是硬编码在单个服务的源代码中,例如web-app 可以通过 web-app数据库通信。这些名字都需要动态化吗?

解决方法

我尚未对此进行测试,但我认为答案是使用网络别名。这些可用于通过正在连接的网络中的另一个名称解析容器。

在 docker compose 文件中,它们将被定义如下:

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias3
      other-network:
        aliases:
          - alias2

因此,在我的特定用例中,web-app 服务的每个实例都需要在它与反向代理共享的网络中具有唯一的别名。这将允许反向代理区分 web-app 服务的不同实例。

更多链接:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。