搭建docker swarm集群实现负载均衡
作者:互联网
Swarm简介:
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。
Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些
1
2
实验环境:
server1:172.25.66.1 manager
server2:172.25.66.2 node1
server3:172.25.66.3 node2
1
2
3
1.使用自签发证书搭建私有仓库
(1).制作证书
[root@foundation66 ~]# cd /tmp/docker/
[root@foundation66 docker]# mkdir certs
[root@foundation66 docker]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
1
2
3
在这里插入图片描述
[root@foundation66 docker]# cd certs/
[root@foundation66 certs]# ll
total 8
-rw-r--r--. 1 root root 2098 Mar 14 18:44 domain.crt
-rw-r--r--. 1 root root 3272 Mar 14 18:44 domain.key
1
2
3
4
5
(2)创建私有仓库
1.下载并导入registry镜像
registry.tar
1
[root@foundation66 Desktop]# ls
registry.tar
[root@foundation66 Desktop]# docker load -i registry.tar
[root@foundation66 Desktop]# docker images
1
2
3
4
在这里插入图片描述
2.创建私有仓库(容器)
[root@foundation66 ~]# cd /tmp/docker/
[root@foundation66 docker]# docker run -d \
> --restart=always \
> --name registry \
> -v `pwd`/certs:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
> -p 443:443 \
> registry
21de9d97895639d9a371b4dde56ae121c36716947985589e3a9b4546d6fb5735
1
2
3
4
5
6
7
8
9
10
11
[root@foundation66 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
21de9d978956 registry "/entrypoint.sh /etc…" 20 seconds ago Up 18 seconds 0.0.0.0:443->443/tcp, 5000/tcp registry
[root@foundation66 docker]# netstat -antlp |grep :443
tcp 0 0 192.168.43.230:44402 111.7.188.1:443 ESTABLISHED 3264/firefox
tcp6 0 0 :::443 :::* LISTEN 8963/docker-proxy
1
2
3
4
5
6
(3).拷贝证书
[root@foundation66 ~]# cd /etc/docker/certs.d/westos.org/
[root@foundation66 westos.org]# ls
ca.crt
[root@foundation66 westos.org]# cp /opt/docker/certs/westos.org.crt ca.crt cp: overwrite ‘ca.crt’? y
1
2
3
4
(4).传输证书
[root@foundation66 ~]# cd /etc/docker/
[root@foundation66 docker]# ls
certs.d daemon.json key.json
[root@foundation66 docker]# scp -r certs.d/ root@172.25.66.1:/etc/docker
[root@foundation66 docker]# scp -r certs.d/ root@172.25.66.2:/etc/docker
[root@foundation66 docker]# scp -r certs.d/ root@172.25.66.3:/etc/docker
1
2
3
4
5
6
[root@server1 ~]# cd /etc/docker
[root@server1 ~]# ls
certs.d
[root@server2 ~]# cd /etc/docker
[root@server2 ~]# ls
certs.d
[root@server3 ~]# cd /etc/docker/
[root@server3 docker]# ls
certs.d
1
2
3
4
5
6
7
8
9
(5).添加解析
#解析域名为制作证书时设定的Common Name
[root@foundation66 ~]# vim /etc/hosts
1
2
在这里插入图片描述
[root@server1 ~]# vim /etc/hosts
1
在这里插入图片描述
[root@server2 ~]# vim /etc/hosts
1
在这里插入图片描述
[root@server3 ~]# vim /etc/hosts
1
在这里插入图片描述
2.部署swarm集群
配置主结点:
(1).下载并安装docker
安装包:
docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm
1
2
点击此处即可下载
[root@server1 ~]# ls
docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm
[root@server1 ~]# yum install -y *
#用于补齐docker命令
[root@sever1 ~]# yum install -y bash-*
1
2
3
4
5
6
(2).启动docker
[root@server1 ~]# systemctl start docker
[root@sever1 ~]# netstat -antlp
1
2
在这里插入图片描述
(3).初始化swarm集群
#初始化(docker自带swarm)
[root@server1 ~]# docker swarm init
1
2
在这里插入图片描述
#查看集群
[root@server1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
gzdnvke2tyhnbjtgsnehc3eui * server1 Ready Active Leader 18.06.1-ce
1
2
3
4
注意:如果集群搭建错误,直接执行以下命令即可
#离开集群
[root@server1 ~]# docker swarm leave -f
Node left the swarm.
1
2
3
配置从结点:
[root@sever1 ~]# scp * root@172.25.66.2:
[root@sever1 ~]# scp * root@172.25.66.3:
1
2
在server2上:
(1).安装docker
[root@server2 ~]# ls
docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm
[root@server2 ~]# yum install -y *
1
2
3
4
(2)启动docker
[root@server2 ~]# systemctl start docker
1
(3).加入swarm集群
[root@server2 ~]# docker swarm join \
> --token SWMTKN-1-2gkr9v7abv3x73fpbymkyujtvl95s1cc3gt5vwscnwfjt8vkh7-92n591yapafolcjkxn1jkkx7x \
> 172.25.66.1:2377
This node joined a swarm as a worker.
1
2
3
4
在server3上:(操作同server2结点)
(1).安装docker
[root@server3 ~]# ls
docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.05.0.ce-1.el7.centos.noarch.rpm
[root@server3 ~]# yum install -y *
1
2
3
4
(2)启动docker
[root@server3 ~]# systemctl start docker
1
(3).加入warm集群
[root@server3 ~]# docker swarm join \
> --token SWMTKN-1-2gkr9v7abv3x73fpbymkyujtvl95s1cc3gt5vwscnwfjt8vkh7-92n591yapafolcjkxn1jkkx7x \
> 172.25.66.1:2377
This node joined a swarm as a worker.
1
2
3
4
测试集群:
[root@server1 ~]# docker node ls
1
在这里插入图片描述
3.部署Nginx集群服务
(1).拉取镜像
1.在物理机上传镜像到私有仓库
#1.tag表示重命名
[root@foundation66 ~]# docker tag nginx westos.org/nginx
#2.上传镜像
[root@foundation66 docker]# docker push westos.org/nginx
1
2
3
4
在这里插入图片描述
2.远端结点从私有仓库拉取镜像
在server1上:
#1.拉取镜像
[root@server1 docker]# docker pull westos.org/nginx
1
2
在这里插入图片描述
#2.查看镜像
[root@server1 docker]# docker images
1
2
在这里插入图片描述
#3.重命名;非必须操作,这只是为了方便使用
[root@server1 docker]# docker tag westos.org/nginx nginx
#4.查看镜像
[root@server1 docker]# docker images
1
2
3
4
在这里插入图片描述
在server2上:
#1.拉取镜像
[root@server2 docker]# docker pull westos.org/nginx
1
2
在这里插入图片描述
#2.查看镜像
[root@server2 docker]# docker images
1
2
在这里插入图片描述
#3.重命名
[root@server2 docker]# docker tag westos.org/nginx nginx
#4.查看镜像
[root@server2 docker]# docker images
1
2
3
4
在这里插入图片描述
在server3上:
#1.拉取镜像
[root@server3 docker]# docker pull westos.org/nginx
1
2
在这里插入图片描述
#2.查看镜像
[root@server3 docker]# docker images
1
2
在这里插入图片描述
#3.重命名
[root@server3 docker]# docker tag westos.org/nginx nginx
#4.查看镜像
[root@server3 docker]# docker images
1
2
3
4
在这里插入图片描述
(2).创建Nginx服务
#--name表示服务名称,--replicas表示副本任务数,--publish表示端口映射,将容器的80端口映射到物理机的80端口,nginx表示使用nginx镜像
[root@server1 ~]# docker service create --name web --publish 80:80 --replicas 3 nginx
1
2
#查看服务状态信息
[root@server1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
b05r6bo43rpp web replicated 3/3 nginx:latest *:80->80/tcp
1
2
3
4
[root@server1 ~]# docker service ps web
1
在这里插入图片描述
#查看docker网络
[root@server1 ~]# docker network ls
1
2
在这里插入图片描述
#查看网桥
[root@server1 ~]# brctl show
-bash: brctl: command not found
[root@server1 ~]# yum install -y bridge-utils
[root@server1 ~]# brctl show
1
2
3
4
5
在这里插入图片描述
#发现3个nginx服务(容器)均匀分配给3个结点
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ab9e4e6d4b9 nginx:latest "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp web.3.jq0d2ffb218ji5dgtmnz7rl41
[root@server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51a84dc38616 nginx:latest "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp web.2.auzoo6k3931ypmrs6610ez48t
[root@server3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
919b1a5cef58 nginx:latest "nginx -g 'daemon ..." 4 minutes ago Up 4 minutes 80/tcp web.1.xp42io2kp9tukewywur4eh5ig
1
2
3
4
5
6
7
8
9
10
测试:
无论输入3个节点的ip均可以看到nginx默认发布首页
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:如果nginx服务创建错误,执行以下命令即可删除,再重新创建即可
[root@sever1 ~]# docker service rm nginx
nginx
1
2
(3).更改发布页面
在server1上:
#1.编写文件
[root@server1 ~]# echo server1 > index.html
[root@server1 ~]# cat index.html
server1
#2.拷贝文件
[root@server1 ~]# docker ps
[root@server1 ~]# docker cp index.html 5ab9e4e6d4b9:/usr/share/nginx/html
1
2
3
4
5
6
7
在这里插入图片描述
在server2上:
[root@server2 ~]# echo server2 > index.html
[root@sever2 ~]# cat index.html
server2
[root@server2 ~]# docker ps
[root@server2 ~]# docker cp index.html 51a84dc38616:/usr/share/nginx/html
1
2
3
4
5
在这里插入图片描述
在server3上:
[root@server3 ~]# echo server3 > index.html
[root@server3 ~]# cat index.html
server3
[root@server3 ~]# docker ps
[root@server3 ~]# docker cp index.html 919b1a5cef58:/usr/share/nginx/html
1
2
3
4
5
在这里插入图片描述
测试负载均衡:
#利用for循环,访问10次。发现server1和server2和server3交替,说明负载均衡搭建成功
[root@foundation66 ~]# for i in {1..10}; do curl 172.25.66.1;done
1
2
在这里插入图片描述
(4).容器的拉伸
1.拉伸容器
docker应用容器:可以快速的缩容与扩容
1
#拉伸容器
[root@server1 ~]# docker service scale web=6
1
2
在这里插入图片描述
#查看服务
[root@server1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
b05r6bo43rpp web replicated 6/6 nginx:latest *:80->80/tcp
[root@server1 ~]# docker service ps web
1
2
3
4
5
在这里插入图片描述
此时3个结点上均匀分配2个nginx服务
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b03271159e75 nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp web.5.l1gcj9rp0orj8p0udelljz917
5ab9e4e6d4b9 nginx:latest "nginx -g 'daemon of…" 29 minutes ago Up 29 minutes 80/tcp web.3.jq0d2ffb218ji5dgtmnz7rl41
[root@server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16dffe4ba861 nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up About a minute 80/tcp web.4.llw1mwmi5g9yem59hmvfhjkc9
51a84dc38616 nginx:latest "nginx -g 'daemon ..." 29 minutes ago Up 29 minutes 80/tcp web.2.auzoo6k3931ypmrs6610ez48t
[root@server3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
597c866e90c8 nginx:latest "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp web.6.piqm4f5bhgxcg4h8fp54pshpq
919b1a5cef58 nginx:latest "nginx -g 'daemon ..." 29 minutes ago Up 29 minutes 80/tcp web.1.xp42io2kp9tukewywur4eh5ig
1
2
3
4
5
6
7
8
9
10
11
12
2.更改发布页面
[root@server1 ~]# echo server4 > index.html
[root@server1 ~]# cat index.html
server4
[root@server1 ~]# docker ps
[root@server1 ~]# docker cp index.html b03271159e75:/usr/share/nginx/html
1
2
3
4
5
在这里插入图片描述
[root@server2 ~]# echo server5 > index.html
[root@server2 ~]# cat index.html
server5
[root@server2 ~]# docker ps
[root@server2 ~]# docker cp index.html 16dffe4ba861:/usr/share/nginx/html
1
2
3
4
5
在这里插入图片描述
[root@server3 ~]# echo server6 > index.html
[root@server3 ~]# cat index.html
server6
[root@server3 ~]# docker ps
[root@server3 ~]# docker cp index.html 597c866e90c8:/usr/share/nginx/html
1
2
3
4
5
在这里插入图片描述
测试负载均衡:
[root@foundation66 ~]# for i in {1..10}; do curl 172.25.66.1;done
1
在这里插入图片描述
4.添加监控
(1).拉取镜像
1.从网上拉取镜像
[root@foundation66 Desktop]# docker pull docker.io/dockersamples/visualizer
1
在这里插入图片描述
#查看镜像
[root@foundation66 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockersamples/visualizer latest f6411ebd974c 2 months ago 166MB
1
2
3
4
2.物理机上传镜像到私有仓库
#1.更改名称
[root@foundation66 Desktop]# docker tag dockersamples/visualizer westos.org/visualizer
#2.上传镜像
[root@foundation66 Desktop]# docker push westos.org/visualizer
1
2
3
4
在这里插入图片描述
#3.查看镜像
[root@foundation66 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockersamples/visualizer latest f6411ebd974c 2 months ago 166MB
westos.org/visualizer latest f6411ebd974c 2 months ago 166MB
1
2
3
4
5
3.远端从私有仓库拉取镜像
#1.拉取镜像
[root@server1 ~]# docker pull westos.org/visualizer
1
2
在这里插入图片描述
[root@server1 ~]# docker images
1
在这里插入图片描述
#2.重命名
[root@server1 ~]# docker tag westos.org/visualizer visualizer
[root@server1 ~]# docker images
1
2
3
在这里插入图片描述
(2).创建visualizer服务
[root@server1 ~]# 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 \
> visualizer
1
2
3
4
5
6
在这里插入图片描述
[root@server1 ~]# docker ps
1
在这里插入图片描述
[root@server1 ~]# docker service ls
1
在这里插入图片描述
测试:
在网页上输入:172.25.66.1:8080
在这里插入图片描述
5.服务滚动升级
#删除之前创建的web服务(nginx)
[root@server1 ~]# docker service rm web
web
1
2
3
(1)创建docker网络
[root@server1 ~]# docker network create -d overlay my_net1
vbej4jtgaf87aofjmn0udjeff
[root@server1 ~]# docker network ls
1
2
3
在这里插入图片描述
(2)创建nginx服务
[root@server1 ~]# docker service create --name web --network my_net1 --publish 80:80 --replicas 9 nginx
1
在这里插入图片描述
[root@server1 ~]# docker service ls
1
在这里插入图片描述
查看监控:
在这里插入图片描述
在这里插入图片描述
(3)拉取镜像
1.在物理机上传镜像
#查看镜像
[root@foundation66 ~]# docker images
1
2
在这里插入图片描述
[root@foundation66 ~]# docker tag rhel7 westos.org/rhel7
[root@foundation66 ~]# docker images
1
2
在这里插入图片描述
[root@foundation66 ~]# docker push westos.org/rhel7
1
在这里插入图片描述
注意:如果你想要直接导出镜像执行以下命令即可
#导出镜像
[root@foundation66 ~]# docker save rhel7 > rhel7.tar
[root@foundation66 ~]# ls
rhel7.tar
1
2
3
4
2.在远端拉取镜像
在server1上:
[root@server1 ~]# docker pull westos.org/rhel7
1
在这里插入图片描述
[root@server1 ~]# docker tag westos.org/rhel7 rhel7
[root@server1 ~]# docker images
1
2
在这里插入图片描述
在server2上:
[root@server2 ~]# docker pull westos.org/rhel7
1
在这里插入图片描述
[root@server2 ~]# docker tag westos.org/rhel7 rhel7
[root@server2 ~]# docker images
1
2
在这里插入图片描述
在server3上:
[root@server3 ~]# docker pull westos.org/rhel7
1
在这里插入图片描述
[root@server3 ~]# docker tag westos.org/rhel7 rhel7
[root@server3 ~]# docker images
1
2
在这里插入图片描述
(4).更新服务
默认配置下,Swarm一次只更新一个副本,并且两个副本之间没有等待时间。
--update-parallelism #设置并行更新的副本数目
--update-delay #指定滚动更新的间隔时间
1
2
3
#更新服务,实质上就是将原来的nginx镜像更换为rhel7镜像;
[root@server1 ~]# docker service update --image rhel7 --update-delay 5s --update-parallelism 3 web
1
2
查看监控发现确实更新了镜像
注意:若想要批量删除容器与镜像只需执行以下命令即可
#删除所有容器
[root@server3 ~]# docker rm -f `docker ps -a -q`
#删除所有镜像
[root@server3 ~]# docker rmi `docker images -q`
标签:插入,负载,nginx,server1,swarm,docker,root,foundation66 来源: https://www.cnblogs.com/lcword/p/14377116.html