目录
实验前准备:
创建swarm集群
在server1上建立私有仓库
再创建集群节点
容器伸缩(内部也是负载均衡的)
添加swarm监控
节点可以动态迁移:【高可用】
制造故障
负载均衡:
滚动更新
用文件形式来实现
前言-docker swarm简介
在 Docker 1.12 版本发布之后,swarm合并到了 Docker 中,成为 Docker 的一个子命令。Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具,它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。
本章节将要讲解docker compose、docker machine、docker swarm中的docker swarm ,这三个项目都是docker的原生支持,号称docker三剑客,掌握后基本可以帮助您管理docker集群。
Docker Swarm 优点
Docker swarm节点分为manager管理节点和worker工作节点。
Task任务是swarm中的最小调度单位,可以理解为一个单一的容器。
Services服务是指一组任务的集合,服务定义了任务的属性。
大致的工作原理图如下:
docker swarm相比kubernetes、mesos项目,还是显得单薄,更加适合小规模docker集群。
实验前准备:
server1
docker-compose down docker ps docker volume ls
server2:
docker network ls docker network prune docker network ls docker ps -a docker container prune #自动回收没有被占用的资源 cd /etc/sysctl.d/ scp docker.conf server3:/etc/sysctl.d/ #把桥接传输给3
server3:
cd /etc/sysctl.d/ sysctl --system
server1:
docker swarm init #初始化
server2、3上:
docker swarm join --token SWMTKN-1-5oj0og8a06zoskl0ykizjx2mmotg1jhlqbjar094m3zxpwzkb9-7tgzo41714tz5wgt5cl9g5zqv 172.25.70.1:2377
server1:
docker node ls
#可以看到1是leader其他是工作节点
docker node promote server2
#把server2提升成管理员
docker node promote server2
#可以看到目前2属于热被状态,1下线后,2接管
docker node demote server1
#server1降级
docker node ls
#降级之后的server1操作不了
server2:
docker node ls
#2可以操作
server1:
docker swarm leave
#让1脱离集群
server2
docker node rm server1
docker node ls
server1:
cd
cd harbor/
docker-compose up -d
#激活harbor仓库,并打入后台
docker-compose ps
#可以看到harbor仓库
server2:
scp -r certs.d/ server3:/etc/docker/
scp daemon.json server3:/etc/docker/
server3:
vim /etc/hosts #加解析
cd /etc/docker/
ls
systemctl daemon-reload
systemctl reload docker
docker info
systemctl restart docker
docker pull nginx:latest
#拉取镜像【属于集群节点,在私有仓库拉取,很快.】
注意:从私有仓库拉取镜像很快是因为私有仓库有要拉取的镜像,
没有的话会从外网下载,比较慢【本次拉取的镜像私有仓库有】
docker images
*开启虚拟机4,再创建一个集群节点。现在1是仓库,2、3、4是工作节点,其中2是leader
server3:
cd /etc/yum.repos.d/
scp docker-ce.repo server4:/etc/yum.repos.d/
#把docker仓库传给4
yum install docker-ce #安装docker
systemctl start docker #开启docker
systemctl enable docker #设置开机自启
server3
cd /etc/sysctl.d/
scp docker.conf server4:/etc/sysctl.d/
cd /etc/docker/
scp -r certs.d/ daemon.json server4:/etc/docker/
#把证书和配置文件传给4【所有解群节点要全部指向私有仓库】
server4:
vim /etc/hosts #加解析
systemctl restart docker
docker pull busybox
#拉取【要在网页中项目--配置管理中取消内容信任】
server2
docker service create --name webcluster -p 80:80 --replicas 3 nginx
#创建webcluster【本次速度很快因为内网私有仓库】,
--replicas设置启动的示例数为3
【补:--network:指定服务使用的网络模型】
docker service ls #查看集群
docker service ps webcluster
#可以看到webcluster有三个容器,分别在2、3上
server4
docker swarm join --token SWMTKN-1-5oj0og8a06zoskl0ykizjx2mmotg1jhlqbjar094m3zxpwzkb9-
7tgzo41714tz5wgt5cl9g5zqv 172.25.70.2:2377
#把4添加到集群里【2是leader所以ip是2的ip】
server2
docker node ls
docker service scale webcluster=6
docker service ps webcluster
#可以看到给2、3、4上都分配了【动态均衡】
docker service scale webcluster=12
docker service ps webcluster
docker service scale webcluster=3
docker service ps webcluster
注意:在集群中创建service会有一个健康监测
server1:
docker pull dockersamples/visualizer
#拉取镜像
docker tag dockersamples/visualizer:latest reg.westos.org/library/visualizer:latest
#改名
docker push reg.westos.org/library/visualizer:latest
#上传到私有仓库
server2:
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
docker service ls
docker service ps viz
#可以看到在master端运行(端口是8080)
网页中:http://172.25.70.2:8080/
server3:
docker ps
docker stop 13e4ac2129bc
#停掉3上的webcluster
docker ps
#可以看打又活过来了,会自动拉起,确保之前定义的副本数=3
systemctl stop docker.service
#关闭3上的服务,让节点挂掉
网页上:刷新可以看到3上的副本调度到4上,【高可用】
systemctl start docker.service #恢复节点
server2:
docker service ls
docker service rm webcluster
#删掉镜像
网页上:刷新,可以看到监控没了
server1
docker pull ikubernetes/myapp:v1
docker pull ikubernetes/myapp:v2
docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2
docker push reg.westos.org/library/myapp:v1
docker push reg.westos.org/library/myapp:v2
server2:
docker service create --name webcluster -p 80:80 --replicas 3 myapp:v1
#镜像换成myapp
docker service ls
docker service ps webcluster
#可以看到webcluster分别部署在2、3、4上【自动均衡的】
外部集群中查看(不再集群内部)
for i in {1..10}; do curl 172.25.70.2; done
#可以看到都是v1
for i in {1..10}; do curl 172.25.70.2/hostname.html; done
#会显示不同的主机名,是均衡的,显示的是容器id
for i in {1..10}; do curl 172.25.70.3/hostname.html; done
#访问3也是负载均衡,服务在整个集群中访问任意节点都是负载均衡
网页刷新,又可以看到监控了
server2
docker service scale webcluster=10
网页刷新,可以看到有十个
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webcluster
#--image 更新镜像;
--update-delay定义更新延迟(每隔5秒)
--update-parallelism设置每次更新多少个(2个)
网页刷新可以看到都是v2
真机中:
for i in {1..10}; do curl 172.25.70.2; done
#全部更新完毕,都是v2的镜像
for i in {1..10}; do curl 172.25.70.2/hostname.html; done
#依然是负载均衡的
docker service rm webcluster #删掉镜像
vim webcluster.yml #创建部署文件
docker stack deploy web -c webcluster.yml
#stack在部署的时候自动为服务创建了网络;
-c指定文件;web是指定的名称
docker network ls
#可以看到自动创建的虚拟网络
docker service ls
#可以看到有三个副本数
网页:可以看到三个节点都有一个副本
server2:
vim webcluster.yml
#修改副本数为6个
docker stack deploy web -c webcluster.yml #更新
网页:可以看到三个节点都有2个副本
vim webcluster.yml #修改镜像为v2
docker stack deploy web -c webcluster.yml #更新
真机中:
for i in {1..10}; do curl 172.25.70.2; done
#有v1,也有v2因为有5秒间隔
for i in {1..10}; do curl 172.25.70.2; done #现在全部更新完毕
server2
docker service rm viz
#删掉viz(监控)
vim webcluster.yml
#在文件中部署监控
docker stack deploy web -c webcluster.yml #更新
网页中有监控了