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:2377

To 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/html

server2:
[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/html


server3
[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上
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qwqq233/article/details/90765637