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