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。node
三臺主機(centos7):
docker version:12版本以上。nginx
node01:172.16.1.30
node02:172.16.1.31
node03:172.16.1.32web
(1)首先修改主機名:docker
[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)設置免密登陸:
//一直默認回車,生成密鑰:apache
//將密鑰拷貝給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)vim
//查看節點是否加入到集羣中:
提示:這步操做只有manager纔有權限查看。centos
*####若是其餘節點須要加入到該集羣中,而且須要指定身份,當你忘掉初始化集羣時生成的命令時,能夠執行如下命進行查看命令:
注意:只有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
———————— 本文至此結束,感謝閱讀 ————————