Swarm介紹:
Swarm是Docker公司在2014年12月初發(fā)布的一套較為簡單的工具,用來管理Docker集群,它將一群Docker宿主機(jī)變成一個(gè)單一的虛擬的主機(jī)。
Swarm使用標(biāo)準(zhǔn)的Docker API接口作為其前端訪問入口,換言之,各種形式的Docker Client(dockerclient in Go, docker_py,docker等)均可以直接與Swarm通信。Swarm幾乎全部用Go語言來完成開發(fā),Swarm0.2版本增加了一個(gè)新的策略來調(diào)度集群中的容器,使得在可用的節(jié)點(diǎn)上傳播它們,以及支持更多的Docker命令以及集群驅(qū)動(dòng)。Swarm deamon只是一個(gè)調(diào)度器(Scheduler)加路由器(router),Swarm自己不運(yùn)行容器,它只是接受docker客戶端發(fā)送過來的請求,調(diào)度適合的節(jié)點(diǎn)來運(yùn)行容器,這意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點(diǎn)也會(huì)照常運(yùn)行,當(dāng)Swarm重新恢復(fù)運(yùn)行之后,它會(huì)收集重建集群信息。
docker客戶端發(fā)送過來的請求,調(diào)度適合的節(jié)點(diǎn)來運(yùn)行容器,這意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點(diǎn)也會(huì)照常運(yùn)行,當(dāng)Swarm重新恢復(fù)運(yùn)行之后,它會(huì)收集重建集群信息。
成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|企業(yè)網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋葡萄架等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身設(shè)計(jì)品質(zhì)網(wǎng)站。
Swarm集群的特性:
集群中可以都是manager,但不可以都是worker。
三臺(tái)主機(jī)(centos7):
docker version:12版本以上。
node01:172.16.1.30
node02:172.16.1.31
node03:172.16.1.32
(1)首先修改主機(jī)名:
[root@sqm-docker01 ~]# hostnamectl set-hostname node01
[root@sqm-docker01 ~]# hostnamectl set-hostname node02
[root@sqm-docker01 ~]# hostnamectl set-hostname node03
(2)三臺(tái)主機(jī)分別配置域名解析:
[root@node01 ~]# vim /etc/hosts
(3)設(shè)置免密登錄:
//一直默認(rèn)回車,生成密鑰:
//將密鑰拷貝給node02和node03:
[root@node01 ~]# ssh-copy-id node02
[root@node01 ~]# ssh-copy-id node03
//有了免密登錄,將host域名解析文件拷貝給其他兩個(gè)節(jié)點(diǎn):
[root@node01 ~]# scp /etc/hosts root@172.16.1.31:/etc/hosts
[root@node01 ~]# scp /etc/hosts root@172.16.1.32:/etc/hosts
指定當(dāng)前主機(jī)為集群的創(chuàng)建者(leader)
//查看節(jié)點(diǎn)是否加入到集群中:
提示:這步操作只有manager才有權(quán)限查看。
*####如果其他節(jié)點(diǎn)需要加入到該集群中,并且需要指定身份,當(dāng)你忘掉初始化集群時(shí)生成的命令時(shí),可以執(zhí)行以下命進(jìn)行查看命令:
注意:只有manager端才有權(quán)限進(jìn)行查看。
#查看以worker端加入這個(gè)集群
[root@sqm-docker01 ~]# docker swarm join-token worker
#查看以manager的身份加入這個(gè)集群
[root@sqm-docker01 ~]# docker swarm join-token manager
#拉取鏡像:
用的是本地的鏡像包,所以直接導(dǎo)入:[root@node01 ~]# docker load --input myvisualizer.tar
#運(yùn)行服務(wù):
[root@node01 ~]# docker run -d -p 8000:8080 -e HOST=172.16.1.30 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
##訪問web網(wǎng)頁界面:
URL:http://172.16.1.30:8000/
可以看到集群中的三個(gè)節(jié)點(diǎn)。
還記得在之前搭建overlay的博文中,在搭建overlay網(wǎng)絡(luò)時(shí)需要先部署consul(數(shù)據(jù)中心),但現(xiàn)在是在swarm集群的環(huán)境中,默認(rèn)自帶consul服務(wù)的功能,所以可以在直接創(chuàng)建overlay網(wǎng)絡(luò)。
##創(chuàng)建overlay網(wǎng)絡(luò):
[root@node01 ~]# docker network create -d overlay --attachable docker
注意:在創(chuàng)建overlay網(wǎng)絡(luò)時(shí),如果沒有加上--attachable,那么此網(wǎng)絡(luò)不可以應(yīng)用于容器上。
##在node01和node02之上分別運(yùn)行一個(gè)容器,測試是否能夠正常通信:
[root@node01 ~]# docker run -itd --name test1 --network docker busybox
[root@node02 ~]# docker run -itd --name test2 --network docker busybox
搭建私有倉庫的目的是為了能夠在一個(gè)集群中大家共用私有倉庫中的鏡像,能夠很方便的部署服務(wù),并且在公司中為了安全考慮,大多都是部署自己的私有倉庫。
//以官方的registry鏡像進(jìn)行部署:
[root@node01 ~]# docker run -d --name registry --restart=always -p 5000:5000 registry:latest
//修改docker配置文件:
[root@node01 ~]# vim /usr/lib/systemd/system/docker.service
修改內(nèi)容如下:
//重啟docker服務(wù):
[root@sqm-docker01 ~]# systemctl daemon-reload
[root@sqm-docker01 ~]# systemctl restart docker.service
//直接將配置文件拷貝給node02和node03
[root@sqm-docker01 ~]# scp /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system/docker.service
[root@sqm-docker01 ~]# scp /usr/lib/systemd/system/docker.service node03:/usr/lib/systemd/system/docker.service
拷貝過去后,需要在node02和node03重載進(jìn)程并且重啟docker服務(wù)。
####部署完私有倉庫,我們最好測試一下:
在node01上將apache鏡像上傳到私有倉庫中:
[root@node01 ~]# docker tag httpd:latest 172.16.1.30:5000/myhttpd
[root@node01 ~]# docker push 172.16.1.30:5000/myhttpd
在其他節(jié)點(diǎn)上進(jìn)行拉?。?br/>[root@node02 ~]# docker pull 172.16.1.30:5000/myhttpd
[root@node03 ~]# docker pull 172.16.1.30:5000/myhttpd
##發(fā)布任務(wù),并且創(chuàng)建副本數(shù)量為2
[root@node01 ~]# docker service create --replicas 2 --name web01 -p 80:80 172.16.1.30:5000/myhttpd:latest
--replicas:副本,可以基于該副本進(jìn)行復(fù)制。--replicas 1表示只需要一個(gè)容器。
//查看服務(wù):
[root@node01 ~]# docker service ls
//查看服務(wù)運(yùn)行在集群中的哪個(gè)節(jié)點(diǎn)之上:
它是會(huì)參考節(jié)點(diǎn)的各種性能配置以及工作量,來實(shí)現(xiàn)分配到給哪個(gè)節(jié)點(diǎn),以實(shí)現(xiàn)負(fù)載均衡。
除了通過命令行的方式進(jìn)行查看service的各種信息,還可以通過web網(wǎng)頁進(jìn)行查看:
發(fā)布第二個(gè)服務(wù):[root@node01 ~]# docker service create --replicas 4 --name web02 -p 80 172.16.1.30:5000/myhttpd #隨機(jī)生成端口
可以看到依然會(huì)均衡的分布在每個(gè)節(jié)點(diǎn)。
實(shí)現(xiàn)擴(kuò)容和縮容的原因很明確,縮容是當(dāng)某一個(gè)節(jié)點(diǎn)壓力過大,或者是服務(wù)器配置不足以承受所運(yùn)行的服務(wù),需要減少容器,以保證穩(wěn)定運(yùn)行,擴(kuò)容呢?是當(dāng) 某個(gè)節(jié)點(diǎn)的服務(wù)器處于閑置的狀態(tài)下,多給分配幾個(gè)服務(wù)運(yùn)行,也是不影響的。
1)擴(kuò)容:
[root@node01 ~]# docker service scale web01=6
在web網(wǎng)頁進(jìn)行查看:
2)縮容:
[root@node01 ~]# docker service scale web02=1
在web網(wǎng)頁上進(jìn)行查看:
在一個(gè)集群中,最好的狀態(tài)是指定manager節(jié)點(diǎn)不參加工作,讓node節(jié)點(diǎn)進(jìn)行工作,好比是在一個(gè)公司中,老板是不可能工作的是吧,一般會(huì)去讓員工進(jìn)行工作。
##指定manager節(jié)點(diǎn)不參加工作:
[root@node01 ~]# docker node update --availability drain node01
從上圖可以看到,manager已經(jīng)不參加工作,所以運(yùn)行的容器默認(rèn)已經(jīng)工作在node01和node02上。
如果有需求,需要將發(fā)布的所以服務(wù)運(yùn)行在同一臺(tái)服務(wù)器上,該怎么實(shí)現(xiàn)呢?
方法一:
1)定義標(biāo)簽:
[root@node01 ~]# docker node update --label-add disk=max node03 ##將標(biāo)簽定義到節(jié)點(diǎn)3上
2)發(fā)布服務(wù):
[root@node01 ~]# docker service create --name test --replicas 5 -p 80 --constraint 'node.labels.disk==max' 172.16.1.30:5000/myhttpd
查看是否指定成功:
方法二:
直接指定節(jié)點(diǎn)主機(jī)名。[root@node01 ~]# docker service create --replicas 5 --name testname --constraint 'node.hostname==node02' -p 80 172.16.1.30:5000/myhttpd
將以上服務(wù)(test)更新為2.0版本。
[root@node01 ~]# docker tag 172.16.1.30:5000/myhttpd:latest 172.16.1.30:5000/myhttpd:v2.0
[root@node01 ~]# docker push 172.16.1.30:5000/myhttpd:v2.0
[root@node01 ~]# docker service update --image 172.16.1.30:5000/myhttpd:v2.0 test
注意:當(dāng)服務(wù)的版本升級了,它原來的版本依然會(huì)進(jìn)行保留的。
并且在更新的過程中,默認(rèn)是一個(gè)一個(gè)的依次進(jìn)行更新的,當(dāng)一個(gè)更新完成后,再去更新下一個(gè)。
將以上服務(wù)進(jìn)行更新為3.0版本。
[root@node01 ~]# docker tag 172.16.1.30:5000/myhttpd:v2.0 172.16.1.30:5000/myhttpd:v3.0
[root@node01 ~]# docker push 172.16.1.30:5000/myhttpd:v3.0
[root@node01 ~]# docker service update --image 172.16.1.30:5000/myhttpd:v3.0 --update-parallelism 2 --update-delay 1m test
參數(shù)解釋:
--update-parallelism 2 :設(shè)置并行(同時(shí))更新的副本數(shù)。
--update-delay 1m(m(分鐘 s(秒) h (小時(shí))d(天) w(星期)):指定滾動(dòng)更新的時(shí)間間隔。
當(dāng)我們執(zhí)行回滾操作時(shí),默認(rèn)是回滾到上一次操作的版本,只能在前后兩個(gè)版本之間進(jìn)行回滾,不能連續(xù)回滾。
[root@node01 ~]# docker service update --rollback test
登陸web網(wǎng)頁更直觀的進(jìn)行查看:
回滾成功。。。
##測試再次回滾,它會(huì)回滾到哪個(gè)版本呢?
[root@node01 ~]# docker service update --rollback test
可以看到它會(huì)回滾到第一次回滾前的一個(gè)版本。證明是不可以連續(xù)回滾的。
//初始化集群:docker swarm init --advertise-addr 本機(jī)ip地址
//查看節(jié)點(diǎn)信息:docker node ls
//以worker端加入這個(gè)集群:docker swarm join-token worker
//以manager端加入這個(gè)集群:docker swarm join-token manager
//將節(jié)點(diǎn)升級為manager:docker node promote node2
//將節(jié)點(diǎn)降級為worker:docker node demote node2
//脫離集群:docker swarm leave
//刪除節(jié)點(diǎn)(只有脫離了集群,才能夠刪除):docker node rm node2
//強(qiáng)制刪除集群:docker swarm leave -f (必須強(qiáng)制刪除)
//查看服務(wù):docker service ls
//查看服務(wù)運(yùn)行在哪個(gè)節(jié)點(diǎn)上(隨機(jī)的):docker service ps 任務(wù)名
//發(fā)布一個(gè)任務(wù):
docker service create --replicas 2 --name test -p 80 httpd:latest
//刪除所有任務(wù)(容器):docker service rm ........(任務(wù)名)
或者:docker service ls | xargs docker service rm
//將任務(wù)進(jìn)行擴(kuò)容:docker service scale 服務(wù)名稱=2
//進(jìn)行縮容:docker service scale 服務(wù)名稱=1
//設(shè)置某個(gè)節(jié)點(diǎn)工作:docker node update --availability active 節(jié)點(diǎn)名
//設(shè)置某個(gè)節(jié)點(diǎn)暫時(shí)不工作(掛起):docker node update --availability pause 節(jié)點(diǎn)名
//設(shè)置某個(gè)節(jié)點(diǎn)不參加工作:docker node update --availability drain 節(jié)點(diǎn)名
//更新服務(wù):docker service update --image 172.16.1.30:5000/my_nginx:3.0(鏡像名) test2(服務(wù)名)
//自定義更新:
docker service update --image 172.16.1.30:5000/my_nginx:4.0 --update-parallelism 2 --update-delay 1m test2
//服務(wù)回滾:docker service update --rollback bdqn2
———————— 本文至此結(jié)束,感謝閱讀 ————————