集群的搭建"/>
Docker中的swarm集群的搭建
一,基本知识
Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in go, docker_py, docker等)均可以直接与Swarm通信。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息
结构图
swarm集群
使用的是docker自带的swarm mode,也就是docker集群的管理和编排。所谓的编排就是指多台集群的管理, 主机的配置,容器的调度等。swarm mode是docker engine中自带的一种模式,很容易使用,并且无须安装其他的软件。 在使用swarm mode的时候,几台主机上都要先安装好docker。
二、swarm集群的搭建
实验环境:(安装docker并开启)
docker1:172.25.26.1 swarm
docker2:172.25.26.2 node1
docker3:172.25.26.3 node2
1.在docker1上做初始化
[root@docker1 ~]# docker swarm init
Swarm initialized: current node (onmfjan5xiq2ek6vf6oalpvqp) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.26.1:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
##注意:在当前主机上启动swarm模式,要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥
2.docker1和docker2加入swarm集群中
[root@docker2 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.26.1:2377[root@docker3 ~]# docker swarm join --token SWMTKN-1-4sryx0i44mb46qyb1sbfjm62fask1rfqf3jbze2sp8uccpe8f5-dzz2ltd01e5kldf4puhu09s9s 172.25.26.1:2377
- 查看节点状态
[root@server1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
thrzujzc89hrz4nq6f7pk93h3 * server1 Ready Active Leader 18.06.1-ce
xlb9m5vs0altngy9hkt6m84ge server2 Ready Active 18.06.1-ce
k8afdq6vnql0nmrhb1r7vmbvx server3 Ready Active 18.06.1-ce
3.确保导入nginx镜像
[root@docker1 ~]# docker load -i nginx.tar
[root@docker2 ~]# docker load -i nginx.tar
[root@docker3 ~]# docker load -i nginx.tar
4.部署一个服务群集
[root@docker1 ~]# docker network ls ##查看swarm的类型
NETWORK ID NAME DRIVER SCOPE
9899107ae90e bridge bridge local
076f11525d73 docker_gwbridge bridge local
3281f4c216de host host local
i47byuadtg61 ingress overlay swarm
6b89c5ac48c1 none null local[root@docker1 ~]# docker network create -d overlay my_net1##新建一个服务集群的网络my_net1
a8gg980w0j9s5ilmsffms9sbw##在manager节点部署web服务,服务数量为3个 ,使用nginx镜像
[root@docker1 ~]# docker service create --name web --network my_net1 --publish 80:80 --replicas 3 nginx[root@server1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
bbh9agwedmll web replicated 3/3 nginx:latest *:80->80/tcp
5.编写测试页面
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d41c40ba5e6 nginx:latest "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp web.3.xc5eer0d93nhq5endond1unc9
[root@server1 ~]# vim index.html
server1
[root@server1 ~]# docker cp index.html 3d41c40ba5e6:/usr/share/nginx/htmlserver2:
[root@server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4e4b6a58045 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp web.1.akzq8bpds44cgu19dsithldhd
[root@server2 ~]# vim index.html
server2
[root@server2 ~]# docker cp index.html f4e4b6a58045:/usr/share/nginx/htmlserver3
[root@server3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd71d4101fb1 nginx:latest "nginx -g 'daemon of…" 6 minutes ago Up 5 minutes 80/tcp web.2.l8tt6o6d0dmbd5ortfhtymrl4
[root@server3 ~]# vim index.html
server3
[root@server3 ~]# docker cp index.html cd71d4101fb1:/usr/share/nginx/html
6.测试负载均衡
[root@server1 ~]# for i in {1..10}; do curl 172.25.26.1/index.html; done
server1
server2
server3
server1
server2
server3
server1
server2
server3
server1
[root@server1 ~]# for i in {1..10}; do curl 172.25.26.2/index.html; done
server3
server1
server2
server3
server1
server2
server3
server1
server2
server3
[root@server1 ~]# for i in {1..10}; do curl 172.25.26.3/index.html; done
server1
server3
server2
server1
server3
server2
server1
server3
server2
server1
[root@server1 ~]# docker service ps web ##查看服务进程
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
akzq8bpds44c web.1 nginx:latest server2 Running Running 10 minutes ago
l8tt6o6d0dmb web.2 nginx:latest server3 Running Running 10 minutes ago
xc5eer0d93nh web.3 nginx:latest server1 Running Running 10 minutes ago
7.添加 6 个nginx 服务
[root@server1 ~]# docker service scale web=6
web scaled to 6
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
##查看有6个nginx 进程是 Running ,并平均分配在三个server上
[root@server1 ~]# docker service ps web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
akzq8bpds44c web.1 nginx:latest server2 Running Running 10 minutes ago
l8tt6o6d0dmb web.2 nginx:latest server3 Running Running 10 minutes ago
xc5eer0d93nh web.3 nginx:latest server1 Running Running 10 minutes ago
iobzfevoki9v web.4 nginx:latest server1 Running Running 9 seconds ago
ll30w2zflqw5 web.5 nginx:latest server2 Running Running 9 seconds ago
rn8shi5ft0m4 web.6 nginx:latest server3 Running Running 10 seconds ago
添加监控
1.添加导入镜像并创建监控
[root@docker1 ~]# docker load -i visualizer.tar
[root@docker1 ~]# docker service create \--name=viz \--publish=8080:8080/tcp \--constraint=node.role==manager \--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \dockersamples/visualizer
2.查看监控和节点是否在线
[root@server1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ys3n8c96y25h viz replicated 1/1 dockersamples/visualizer:latest *:8080->8080/tcp
bbh9agwedmll web replicated 6/6 nginx:latest *:80->80/tcp
##注意:开启viz服务慢,需要不断刷新等待建立完成,出现1/1才成功
3.测试查看,
浏览器:输入172.25.26.1:8080,可以看到6个nginx的进程被平均分在了三台机子上
滚动更新
1.重新添加一个镜像
[root@docker1 ~]# docker load -i ubuntu.tar
[root@docker2 ~]# docker load -i ubuntu.tar
[root@docker3 ~]# docker load -i ubuntu.tar
[root@docker1 ~]# docker service update --image ubuntu --update-delay 5s --update-parallelism 5 web ##每隔五秒更新,每次更新一个机子docker ps -aq | wc -l ##可看到每个机子上开启了多少个(一般都是平均)
2.测试查看
浏览器的监控镜像从nginx变成了ubuntu
测试高可用
在有3个进程的基础上测试的
1.先变回原来的镜像
[root@server1 ~]# docker service update --image nginx --update-delay 5s --update-parallelism 5 web
2.停掉node1(server2)
[root@docker2 share]# systemctl stop docker
3.浏览器的监控显示server2故障,并且6个nginx进程被平均分到server1和server3上
更多推荐
Docker中的swarm集群的搭建
发布评论