实验环境:
虚拟机: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/
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
[root@server1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
bmd6udsakfqh46gl775x8asm1 * server1 Ready Active Leader
n3wfl180za26lnwjxfdburp9g server3 Ready Active
vlm8worq7s15a5kdfq2fbw9u8 server2 Ready Active
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
[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的首页
删除服务
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
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 [email protected]
[root@foundation10 .ssh]# ssh-copy-id [email protected]
[root@foundation10 .ssh]# ssh-copy-id [email protected]
测试连接
ssh root@172.25.10.1
ssh root@172.25.10.2
ssh root@172.25.10.3
[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
docker-machine ssh server3 docker ps
docker-machine ssh server3 docker images
docker-machine env server3