实验环境:
虚拟机:rhel7.3
物理机:镜像私有仓库
虚拟机节点安排:
server1 172.25.10.1 swarm manager
server2 172.25.10.2 swarm agent
server3 172.25.10.3 swarm agent
真机:设置好Docker私有仓库
详情请看搭建Docker私有仓库
添加认证

仓库添加认证策略
cd /tmp/docker
[root@foundation10 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:2
[root@foundation10 docker]# docker ps
将创建的钥匙发送至3个节点
[root@foundation10 ~]# cd /etc/docker/
[root@foundation10 docker]# scp -r certs.d/ 172.25.10.1/2/3:/etc/docker/

一、swarm集群搭建

1、安装docker
server1、2、3:

获取docker安装包
get docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm 
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
安装docker
yum install -y docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm 
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
安装bash-*组件,使docker命令能够补齐
yum install bash-*
打开docker服务
[root@server2 ~]# systemctl start docker

2、添加swarm集群

server1:
初始化

[root@server1 ~]# docker swarm init 

将红色框部分复制
这里写图片描述

server2、server3:
加入server1的swarm集群

swarm join 命令用于将 Docker Node 添加至 Swarm 管理的 Docker 集群中。从这点
也可以看出 swarm join 命令的执行位于 Docker Node,因此在 Docker Node 上运行该命令
[root@server2 ~]# docker swarm join \
>     --token SWMTKN-1-379st6v1qifnog192ewq4jx8h9gdiaf1ukp0xulfzjast1e3qx-a06lb4le711fvxv2ymstk5i5w \
>     172.25.10.1:2377

这里写图片描述
server1查看节点

[root@server1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
bmd6udsakfqh46gl775x8asm1 *  server1   Ready   Active        Leader
n3wfl180za26lnwjxfdburp9g    server3   Ready   Active        
vlm8worq7s15a5kdfq2fbw9u8    server2   Ready   Active      

这里写图片描述
到此,swarm集群搭建完毕

二、swarm集群服务

1、3个节点需要添加仓库的地址解析
server1/2/3:

[root@server1 ~]# vim /etc/hosts
172.25.254.10 westos.org

2、本地仓库上传nginx镜像
真机:

镜像改名
docker tag nginx westos.org/nginx
上传镜像
docker push westos.org/nginx

节点从仓库拉取镜像
server1/2/3:

docker pull westos.org/nginx

3、添加nginx服务
server1:

创建3个nginx服务
[root@server1 ~]# docker service create --name nginx --publish 80:80 --replicas 3 nginx
查看nginx服务状态,此时nginx服务都分别在每个节点都运行
[root@server1 ~]# docker service ps nginx 

这里写图片描述
3个不能够很好的体现负载均衡,我们添加到6个nginx服务

[root@server1 ~]# docker service scale nginx=6
nginx scaled to 6
再次查看状态
[root@server1 ~]# docker service ps nginx 

这里写图片描述
4、visualizer监控服务
通过命令查看不直观,我们通过部署visualizer监控服务在网页查看
上传镜像
真机:

镜像改名
docker tag visualizer westos.org/visualizer
上传仓库
docker push westos.org/visualizer

拉取镜像
server1:

docker pull westos.org/visualizer

接着创建服务

创建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 westos.org/visualizer
查看swarm集群已添加的服务
[root@server1 ~]# docker service ls

这里写图片描述
网页查看
浏览器访问172.25.10.1:8080
这里写图片描述
测试:将nginx服务减少到3个,在网页查看

[root@server1 ~]# docker service scale nginx=3

这里写图片描述
5、nginx轮询
server1/2/3:
3个节点中需要添加分别包括自己在内的3个地址解析

vim /etc/hosts
172.25.10.1 server1
172.25.10.2 server2
172.25.10.3 server3

nginx轮询设置
server1/2/3:
这里拿server1举例

添加首页
[root@server1 ~]# echo server1/2/3 > index.html
在这里需要把用 docker ps 查看nginx镜像 我画红线的部分复制,执行下一个命令时使用
[root@server1 ~]# docker ps
把首页放到Nginx的默认发布目录下(方便查看实验结果)
[root@server1 ~]# docker container cp 红线部分:/usr/share/nginx/html 

这里写图片描述
轮询查看:
真机:
这里写图片描述
接着在server3中停掉docker服务,然后在真机中查看轮询,只有server1和2

server3:
systemctl stop docker
真机:
for i in {1..10};do curl 172.25.10.1;done

再在server3中打开docker服务,真机查看恢复轮询,这里由于首页会失效
这里写图片描述
6、服务更新替换
让新的服务替换原来的nginx
真机上传rhel7:v1的镜像,server1拉取镜像
rhel7:v1在Dockerfile应用示例中可查看

真机
docker tag rhel7:v1 westos.org/rhel7:v1
docker push westos.org/rhel7:v1
server1:
docker pull westos.org/rhel7:v1

服务更新

nginx服务增加到30个
[root@server1 ~]# docker service scale nginx=30
把nginx更新为rhel7:v1
[root@server1 ~]# docker service update --image westos.org/rhel7:v1 --update-parallelism 3 --update-delay 10s nginx  ##每次更新3个,每10秒更新一次

监控页面查看:

这里写图片描述
我这里的实验现象可能是由于visualizer内部机制,在更新时依次将3台nginx放到server1下,直到30台更新完毕,原本应该是每台机子下各有10台nginx,但镜像由nginx更新为rhel7:v1是对的
这里写图片描述
由于我的rhel7:v1内有Web服务
访问172.25.10.1有apache的首页
这里写图片描述

三、关闭swarm集群

删除服务
server1:

[root@server1 ~]# docker service rm nginx
[root@server1 ~]# docker service rm viz
查看
[root@server1 ~]# docker service ls

离开swarm集群,关闭docker
server2、3:

[root@server2 ~]# docker swarm leave
[root@server2 ~]# systemctl stop docker

server1:

强制离开
[root@server1 ~]# docker swarm leave --force   
[root@server1 ~]# systemctl stop docker

四、docker-machine

1、在系统二进制目录下安装docker-machine

[root@foundation10 Desktop]# cd /usr/local/bin/
[root@foundation10 bin]# chmod +x docker-machine-Linux-x86_64-1.15.0 
[root@foundation10 bin]# ln -s docker-machine-Linux-x86_64-1.15.0 docker-machine
[root@foundation10 bin]# ll
lrwxrwxrwx  1 root root       34 Aug 22 18:21 docker-machine -> docker-machine-Linux-x86_64-1.15.0
查看当前docker-machine版本
[root@foundation10 bin]# docker-machine -v  

2、地址解析
物理机中添加其他3个节点的解析

[root@foundation10 bin]# vim /etc/hosts
172.25.10.1 server1
172.25.10.2 server2
172.25.10.3 server3

3、做免密连接

[root@foundation10 ~]# ssh-keygen
复制钥匙发送至3个节点
[root@foundation10 ~]# cd .ssh/
[root@foundation10 .ssh]# ssh-copy-id root@172.25.10.1
[root@foundation10 .ssh]# ssh-copy-id root@172.25.10.2
[root@foundation10 .ssh]# ssh-copy-id root@172.25.10.3
测试连接
ssh root@172.25.10.1
ssh root@172.25.10.2
ssh root@172.25.10.3

这里写图片描述
这里写图片描述
4、一键启动docker

[root@foundation10 .ssh]# docker-machine create --driver generic --generic-ip-address=172.25.10.1 server1
docker-machine create --driver generic --generic-ip-address=172.25.10.2 server2
docker-machine create --driver generic --generic-ip-address=172.25.10.3 server3

这里写图片描述
这里写图片描述
5、在物理机执行server3的docker操作

docker-machine ssh server3 docker ps
docker-machine ssh server3 docker images
docker-machine env server3

这里写图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐