本文将介绍 Docker Swarm + HAProxy 来实现服务的高可用性
在 Mac 执行如下命令创建节点
$ docker-machine create manager1
$ docker-machine create work1
$ docker-machine create work2
$ docker-machine create work3
再开启另外的4个窗口,分别执行
$ docker-machine ssh manager1
$ docker-machine ssh work1
$ docker-machine ssh work2
$ docker-machine ssh work3
在 manager1 节点上执行
docker swarm init --advertise-addr 192.168.99.100`
命令成功后,会有提示,如何将 worker 加入集群,即 docker swarm … 这行命令。
提示:如果忘记此处的 token,可以使用 docker swarm join-token worker 命令查看。
在 work1, work2, work3 上分别执行,此行命令详见上一步中的提示
docker swarm join --token SWMTKN-1-1rt31l3671hig69vkfqha994rydnwr67gxt6o0suv71zzobpgn-b930rnc1pzewxv9h73plq58rd 192.168.99.100:2377
笔记:集群中加入worker的命令是
docker swarm join --token [token] [manager-ip]:[manager-port]
此处以 nginx 为例。首先,创建有 2 个副本的 nginx 服务,在 manger1 上执行
$ docker service create --replicas 2 \
-d \
-p 8080:80 \
--name any-nginx \
registry.docker-cn.com/library/nginx
提示:此处用到了镜像加速仓库
执行完毕之后,查看服务列表信息
$ docker service ls
查看服务信息
$ docker service ps vv
笔记:查看服务信息命令 docker service ps [服务ID]
从服务信息可以看到 nginx 已运行在 manager1 和 work1 上
分别访问 http://192.168.99.100:8080 和 http://192.168.99.101:8080 ,会得到如下结果:
分别在 manager1 和 work1 上查看容器运行情况,结果如下:
将 any-nginx 扩容为 3 份,在 manager1 上执行
$ docker service scale any-nginx=3
再次查看服务信息,可看到 any-nginx.3 在 work2 上运行
目前,有3个运行的容器保证服务的可用性,如果其中一个容器意外关闭,会发生什么情况呢?
将 work2 上正在运行的容器关闭,在 work2 上执行:
再次查看服务信息,可以看到 any-nginx.3 在 work2 上自动重启了
另外一个问题,如果 work2 宕机了,会发生什么情况?
在 Mac 上关闭 work2 节点:
$ docker-machine stop work2
不难看出 work2 节点关闭之后,work3 节点自动启动了 any-nginx.3,保证了整个集群运行的还是 3 个副本。
补充:若work1,work2,work3全部关闭,manager1 上将运行 3 个 any-nginx 容器。此处不演示。
总结:在内存允许的条件下,docker swarm 集群会稳定运行指定数量的容器,具有自我修复的能力,以此来保证服务的高可用性!
此处 HAProxy 将运行于本机,以下命令均在本机操作。
1、创建 HAProxy 配置文件 haproxy.cfg
$ vim haproxy.cfg
global
daemon
maxconn 25600
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend servers
backend servers
server server1 192.168.99.100:8080 maxconn 32 check
server server2 192.168.99.101:8080 maxconn 32 check
server server3 192.168.99.102:8080 maxconn 32 check
server server4 192.168.99.103:8080 maxconn 32 check
2、创建 Dockerfile 自定义镜像
$ vim Dockerfile
FROM haproxy
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
3、制作镜像
$ docker build -t any-haproxy .
4、启动 HAProxy
$ docker run -d -p 8080:80 any-haproxy
5、测试,访问 http://127.0.0.1:8080/