搭建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`

上一篇:Swarm去中心化存储为存储行业按下“加速键”?


下一篇:Docker Compose 和 Docker Swarm 和 Docker Service