按部署目标区分 docker swarm 服务

按部署目标区分 docker swarm 服务

我正在跨多个数据中心推出高可用性 docker swarm 设置,但我对配置区分有一些高级问题。

假设我有一个名为 的单个 Docker 服务,以及数据中心和worker之间的 HA 主-主 SQL 数据库。目前,将使用相同的配置,无论它是在 还是 上运行。dc-adc-bworkerdc-adc-b

有没有什么方法可以区分内部工作器配置或 Docker 映像,以便如果worker将其部署到dc-a,它就会运行config-a,如果部署到dc-b,它就会运行config-b

最终目标是始终以当前数据中心本地的数据库为目标。我知道可以使用不同的数据中心 DNS 条目来引导数据库连接到本地计算机,但如果我们可以根据工作器的部署位置使用完全独立的配置/映像,那么灵活性会更高。

使用 docker swarm 可以实现这个吗?

答案1

最接近的做法是在服务定义中使用模板,但这样无法使用节点或引擎标签。您可以从中获得{{.Node.Hostname}}映射到主机名的内容。该字符串可用于环境变量定义或卷挂载。

您要么需要让入口点解析该值,以便根据主机名变量知道指向何处,要么让卷安装中的主机名目录加载特定于该主机名的数据。随着您添加更多主机,环境变量会更简单、更灵活,但假设您的主机名包含可以指向您正在运行的数据中心的内容。

有关使用带有服务定义的模板的更多详细信息,请参阅服务创建文档:https://docs.docker.com/engine/reference/commandline/service_create/#create-services-using-templates


如果是我,我可能会选择更简单的配置,即两个具有类似配置的独立服务,可能只有一个环境变量不同。然后使用节点标签约束仅在一个数据中心或另一个数据中心的节点上运行每个服务。您可以使用 yaml 锚点/别名在服务之间进行复制,例如:

version: '3.4'

services:
  app-east: &app-service
    image: app-image:${app_tag:-latest}
    deploy:
      replicas: 2
      placement:
        constraints:
        - 'node.labels.region==east'
    environment:
      DB: 'db-east'
      other_var: 'common value'
  app-west:
    <<: *app-service
    deploy:
      placement:
        constraints:
        - 'node.labels.region==west'
    environment:
      DB: 'db-west'

说实话,我从未使用过那么多层的 yaml 锚点和别名,而且只更改了一个数组条目,因此您可能会发现,您需要更细致地使用它们。也就是说,上述操作的最终结果应该是 4 个容器,2 个在东,另外 2 个在西,两者之间的区别在于一个 DB 环境变量。

相关内容