问题描述
我有一个用例,似乎一半和一半像docker swarm一样适合,而有些则不适合。
我正在尝试设置这种情况;
我只有两个盒子可供使用。我希望traefik将请求的负载平衡到任何一个服务。我只希望服务与数据库的热实例进行通信。在一个节点死亡的情况下,treafik的另一个实例应无缝接管。在热数据库死亡的情况下,我想立即切换到从数据库以使其成为热数据库。所有这些都是docker容器。
这适合群居吗?起初,我以为我可以将两个具有所有全局服务的管理器节点组成一个集群,但是数据库配置将是唯一的。如果我添加了第三个节点或N个节点,则我不希望traefik自动扩展到第三个节点。另外,数据库将永远无法扩展,我只希望这两个数据库都具有唯一的配置。真的,我只需要由群提供的覆盖网络并按比例缩放1服务。
所以问题是,我是否可以让盒子作为集群中的一个节点参与,但是在集群外部以唯一的配置托管单个容器,而一切都共享相同的覆盖网络?
解决方法
Docker swarm不会限制您。您可以定义服务实例的数量,它们的位置和网络设置。示例场景:
version: '3.8'
services:
traefik:
hostname: 'traefik'
image: traefik
deploy:
mode: replicated
replicas: 2
placement:
max_replicas_per_node: 1
networks:
backend:
aliases:
- traefik
service1:
hostname: 'service1'
image: service1
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.hostname == host01]
networks:
backend:
aliases:
- service1
service2:
hostname: 'service2'
image: service2
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.hostname == host02]
networks:
backend:
aliases:
- service2
db_master:
hostname: 'db_master'
image: image_db
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.hostname == host01]
networks:
backend:
aliases:
- db_master
db_slave:
hostname: 'db_slave'
image: image_db
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.hostname == host02]
networks:
backend:
aliases:
- db_slave
networks:
backend:
name: backend
driver: overlay
attachable: true
使用参数attachable: true
,您可以将容器附加到覆盖网络
docker run -itd --network=backend busybox