swarm集群运行springboot服务

docker1.12 Swarm 模式简介

1.Docker Engine 1.12 集成了Swarm集群工具.

2.主要使用三个新的命令行工具创建一个swarm集群:

docker swarm 开启swarm模式; 加入Swarm集群; 配置集群参数

docker node 查询集群节点信息; 提升/移除一个管理节点; 管理swarm节点主机

docker service 创建管理 service

创建swarm集群

准备

两台centOS7(manager:10.10.135.154、worker:10.10.56.134)

安装docker1.12版本,具体操作参照官网:https://docs.docker.com/engine/installation/linux/centos/

创建swarm

manager节点初始化,为了高可用初始化后可以join多个manager节点

1
2
3
4
5
6
7
8
9
10
11
12
[root@10-10-135-154 ~]# docker swarm init
Swarm initialized: current node (258hygzd1lq4f4wup8vfbbx3k) is now a manager.

To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-28fiiskwvdaufiyx7tew8xo6fdqrvmd6ywmj3ylruxkwbhp2xn-98apqmndaixzr29gyc7y308ro \
10.10.135.154:2377

To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-28fiiskwvdaufiyx7tew8xo6fdqrvmd6ywmj3ylruxkwbhp2xn-awpm6ih1usvni2ul9nbbj7pnu \
10.10.135.154:2377

worker节点:加入到swarm

1
2
3
4
[root@10-10-56-134 ~]# docker swarm join \
> --token SWMTKN-1-28fiiskwvdaufiyx7tew8xo6fdqrvmd6ywmj3ylruxkwbhp2xn-98apqmndaixzr29gyc7y308ro \
> 10.10.135.154:2377
This node joined a swarm as a worker.

manager节点查看集群各个节点状态:

1
2
3
4
[root@10-10-135-154 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
08cymrzez1aqnb2t3n5wpkxai 10-10-56-134 Ready Active
258hygzd1lq4f4wup8vfbbx3k * 10-10-135-154 Ready Active Leader

创建service

创建管理service,相当于单机docker run

metebee/swarmdemo:0.0.1 是一个springboot搭建的rest服务

启动5个swarmdemo实例

1
2
[root@10-10-135-154 ~]# docker service create --name hello --publish 8080:8080 --replicas 5 metebee/swarmdemo:0.0.1 java -jar /usr/down/swarmtest-0.0.1-SNAPSHOT.jar
eul4ioby3d9ajmist4oiq8oe4

查看启动服务状态

1
2
3
[root@10-10-135-154 ~]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
eul4ioby3d9a hello 5/5 metebee/swarmdemo:0.0.1 java -jar /usr/down/swarmtest-0.0.1-SNAPSHOT.jar

查看各个实例状态

1
2
3
4
5
6
7
[root@10-10-135-154 ~]# docker service ps hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
bhmqg92wm28s6pima8q4z7nqb hello.1 metebee/swarmdemo:0.0.1 10-10-135-154 Running Running 7 minutes ago
dy5a3djz6wh8e1qn5wsrc0e1p hello.2 metebee/swarmdemo:0.0.1 10-10-56-134 Running Running 7 minutes ago
61001wv8sny3ge8xdcvzdpdqh hello.3 metebee/swarmdemo:0.0.1 10-10-56-134 Running Running 7 minutes ago
2kyr8n3hx0iicg4f0ytjfw5uy hello.4 metebee/swarmdemo:0.0.1 10-10-135-154 Running Running 7 minutes ago
25a70511y7g36wtr1bu4d7285 hello.5 metebee/swarmdemo:0.0.1 10-10-135-154 Running Running 7 minutes ago

可以看到worker(10-10-56-134)上启动了两个实例;manager(10-10-135-154)上启动了3个实例

实时查看各个实例状态:

1
watch docker service ps hello

注意DESIRED STATE列, 一个service副本的创建过程,会经历以下几个状态:

—accepted 任务已经被分配到某一个节点执行

—preparing 准备资源, 现在来说一般是从网络拉取image

—running 副本运行成功

—shutdown 呃, 报错,被停止了…

此时如果杀死一个实例,swarm会自动重启该实例

1
docker stop <ID>

测试

在master执行

1
curl http://127.0.0.1:8080/resttest/helloword

控制台响应:helloworld

此时请求会随机转发到这5个springboot实例上。

session问题

由于swarm这种转发不像nginx的ip_hash模式,所以可以选择使用redis集中管理session的方式解决session问题。

zhang dong wechat
关注我的微信来交流技术问题吧!