Docker在节点上提供高可用性

时间:2018-01-11 15:59:37

标签: docker docker-swarm

我正在尝试使用docker swarm。使用VirtualBox,我在主机系统(Windows 7)上设置了三台ubuntu机器(每台机器运行Docker 17.12.0 CE)。

我在其中一个ubuntu实例(管理员)上创建了一个带有docker swarm init命令的docker swarm,并使用docker swarm join命令将另外两个作为worker连接起来。在管理器节点上,我已使用docker service create --name test -p 80:80 --replicas 3 myuser/webapp创建了一项服务。

我的webapp在群集中的所有节点上的容器中运行正常,我可以在浏览器中通过我的主机在分配给虚拟ubuntu机器的不同IP地址上访问它 - 例如我的worker2上有192.168.56.103/webapp。

但是,如果我关闭了worker2,我显然无法再找到它了。确保高可用性的最佳方法是什么,以便在任何节点关闭时,我的webapp仍然可以访问?

在现场环境中,问题是,如何避免单一的入口点"当用户通过他们的浏览器访问它时,我的应用程序(在群中运行)?

1 个答案:

答案 0 :(得分:0)

您需要实施负载均衡器,以便在此服务的所有实例之间分配流量,例如nginxtraefik并支持docker swarm。

Nginx的

http {
  upstream webapp {
    server 192.168.56.101;
    server 192.168.56.102;
    server 192.168.56.103;
  }

  server {
    listen 80;

    location /webapp {
      proxy_pass http://webapp;
    }
  }
}

Traefik

version: '3.3'

services:
  lb:
    image: traefik:latest
    ports:
      - 80:80
      - 8080:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: >
      --web --docker --docker.swarmmode
      --docker.domain=example.com --docker.watch
      --logLevel=DEBUG
    deploy:
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.role == manager
  webapp:
    image: 'myuser/webapp'
    deploy:
      replicas: 3
      labels:
        - "traefik.frontend.rule=PathPrefix:/webapp"
        - "traefik.backend=webapp"
        - "traefik.port=80"