1 Docker Swarm極速部署(5分鐘極速部署)
一矢劲、介紹系統(tǒng)環(huán)境
1)服務(wù)器環(huán)境
節(jié)點(diǎn)名稱(chēng) | IP | 操作系統(tǒng) | 內(nèi)核版本 |
---|---|---|---|
master | 172.16.60.95 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node01 | 172.16.60.96 | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node0x | x.x.x.x | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node0x | x.x.x.x | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
node0x | x.x.x.x | CentOs7 | 4.16.1-1.el7.elrepo.x86_64 |
注意:部署這些編排工具的時(shí)候服務(wù)器數(shù)量不定颁虐,1臺(tái)服務(wù)器也行,所以讀者可以自由增減服務(wù)器卧须。
2)前提條件
-
Docker
版本1.18+ - 集群節(jié)點(diǎn)之間保證
TCP 2377
另绩、TCP/UDP 7946
和UDP 4789
端口通信
注意:Docker
版本最好大于1.12
儒陨,因?yàn)?code>1.12版本之后Docker Swarm
才正式歸入Docker
內(nèi)置命令內(nèi),另外笋籽,需要保證各個(gè)節(jié)點(diǎn)之間的可連通性蹦漠,如果是外網(wǎng)集群的話,注意要設(shè)置iptable
來(lái)限定某些IP
對(duì)于某些端口的可訪問(wèn)性车海。
二笛园、集群部署
1)master節(jié)點(diǎn)創(chuàng)建Swarm集群(要保存初始化后token,因?yàn)樵诠?jié)點(diǎn)加入時(shí)要使用token作為通訊的密鑰)
[root@master ~]# docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-3fzyAz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意:真的是一鍵部署集群J讨ァQ忻!州叠,上面命令執(zhí)行后棵红,該機(jī)器自動(dòng)加入到swarm集群
。這個(gè)會(huì)創(chuàng)建一個(gè)集群token
咧栗,獲取全球唯一的 token
逆甜,作為集群唯一標(biāo)識(shí)。后續(xù)將其他節(jié)點(diǎn)加入集群都會(huì)用到這個(gè)token
值致板。 其中交煞,--advertise-addr
參數(shù)表示其它swarm
中的worker
節(jié)點(diǎn)使用此ip地址
與manager
聯(lián)系。命令的輸出包含了其它節(jié)點(diǎn)如何加入集群的命令斟或。
使用docker info
或者 docker node ls
查看集群中的相關(guān)信息
docker info
.......
Swarm: active
NodeID: kfi2r4dw6895z5yvhlbyzfck6
Is Manager: true
ClusterID: y2zgs373cg0y6559t675yexcj
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
.......
2)添加節(jié)點(diǎn)到swarm集群中
需要在所有節(jié)點(diǎn)執(zhí)行素征,worker節(jié)點(diǎn)
只需一條命令就可以加入集群
docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
在master
上查看集群節(jié)點(diǎn)
的狀態(tài)
到此
Swarm集群
就創(chuàng)建好了,我們現(xiàn)在有一個(gè)多節(jié)點(diǎn)的Swarm集群
萝挤,我們來(lái)測(cè)試一下常用的命令吧~~~
3)docker node 命令
[root@master ~]# docker node --help
Usage: docker node COMMAND
Manage Swarm nodes
Options:
Commands:
demote Demote one or more nodes from manager in the swarm
inspect Display detailed information on one or more nodes
ls List nodes in the swarm
promote Promote one or more nodes to manager in the swarm
ps List tasks running on one or more nodes, defaults to current node
rm Remove one or more nodes from the swarm
update Update a node
# demote
將管理節(jié)點(diǎn)降級(jí)為普通節(jié)點(diǎn)
# inspect
查看節(jié)點(diǎn)的詳細(xì)信息
# ls
列出節(jié)點(diǎn)
# promote
將普通節(jié)點(diǎn)升級(jí)為管理節(jié)點(diǎn)
# ps
查看運(yùn)行的任務(wù)
# rm
從swarm集群中刪除節(jié)點(diǎn)
# update
改變集群節(jié)點(diǎn)狀態(tài)
[root@master ~]# docker node update --help
Usage: docker node update [OPTIONS] NODE
Update a node
Options:
--availability string Availability of the node ("active"|"pause"|"drain")
--label-add list Add or update a node label (key=value)
--label-rm list Remove a node label if exists
--role string Role of the node ("worker"|"manager")
# 主要使用availability string
# active
節(jié)點(diǎn)狀態(tài)正常
# pause
節(jié)點(diǎn)掛起御毅、暫停
# drain
排除節(jié)點(diǎn),比如將master節(jié)點(diǎn)排除平斩,不分配任務(wù)亚享,只作為管理節(jié)點(diǎn)
node update命令
三咽块、在Swarm中部署服務(wù)
集群部署好了绘面,我們接下來(lái)該測(cè)試一下我們的集群基本使用是否正常,下面我們開(kāi)始我們的測(cè)試侈沪。
1)創(chuàng)建Hello服務(wù)揭璃,查看服務(wù)信息
[root@master ~]# docker service create --replicas 1 --name hello busybox
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kosznwn4ombx hello replicated 0/1 busybox:latest
從REPLICAS
中能看出這個(gè) hello服務(wù)
并沒(méi)有啟動(dòng)起來(lái),0/1
表示 1
計(jì)劃啟動(dòng)的副本數(shù)亭罪,0
實(shí)際啟動(dòng)的數(shù)量瘦馍。所以啟動(dòng)失敗
2)添加參數(shù)
在hello服務(wù)
中busybox
只是一個(gè)基礎(chǔ)鏡像,并沒(méi)有一個(gè)持續(xù)運(yùn)行的任務(wù)应役,所以manager
會(huì)不斷重啟hello
這個(gè)服務(wù)情组,所以有好多shutdown
的記錄燥筷。但是我們可以為其添加一個(gè)任務(wù)使其持續(xù)運(yùn)行。
注意:為什么沒(méi)有任務(wù)Docker
容器就會(huì)終止呢院崇?這個(gè)問(wèn)題我們之后再回答
[root@master ~]# docker service update --args "ping www.baidu.com" hello
hello
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
# update:更新?tīng)顟B(tài)
# --args:增加參數(shù)
再次查看hello服務(wù)
狀態(tài):
過(guò)濾不正常的
hello服務(wù)
狀態(tài):
[root@master ~]# docker service ps -f "desired-state=running" hello
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
yxyivio4mzlg hello.1 busybox:latest master Running Running 4 minutes ago
# -f "desired-state=running" : 狀態(tài)為runngin的服務(wù)
3)為服務(wù)擴(kuò)容(縮融)scale
剛才設(shè)置的replicas=1
肆氓,可以增加副本數(shù)量
[root@master ~]# docker service scale hello=4
hello scaled to 4
overall progress: 4 out of 4 tasks
1/4: running
2/4: running
3/4: running
4/4: running
verify: Service converged
# scale : 指定服務(wù)的數(shù)量
4)工作節(jié)點(diǎn)排除manager
,manager
只作為管理節(jié)點(diǎn)
上圖中manager
也運(yùn)行了一個(gè)服務(wù)底瓣,將manager
排除在外谢揪,在正式的生產(chǎn)環(huán)境中我們都建議這么做,因?yàn)樵谌萜骶幣女?dāng)中捐凭,區(qū)分Worker
和Master
節(jié)點(diǎn)的主要原因是因?yàn)?code>Worker 只負(fù)責(zé)完成任務(wù)拨扶,啟動(dòng)服務(wù),而Master
則負(fù)責(zé)任務(wù)的調(diào)配茁肠,一旦Master
節(jié)點(diǎn)也運(yùn)行服務(wù)患民,導(dǎo)致Master
節(jié)點(diǎn)負(fù)載過(guò)重,則會(huì)使集群發(fā)生崩潰官套,所以工作節(jié)點(diǎn)排除manager
是很有必要的酒奶。
[root@manager ~]# docker node update --availability drain manager
# node update : 更改節(jié)點(diǎn)狀態(tài)
# --availability : 三種狀態(tài)
active: 正常
pause:掛起
drain:排除
排除manager
后,其上面運(yùn)行的服務(wù)會(huì)轉(zhuǎn)移到其他節(jié)點(diǎn)
四奶赔、滾動(dòng)更新服務(wù)
例如升級(jí)服務(wù)
的鏡像版本
[root@manager ~]# docker service create \
> --replicas 3 \
> --name redis \
> --update-delay 10s \
> redis:3.0.6
# 啟動(dòng)3個(gè)副本集的redis
# update-delay 10s :每個(gè)容器依次更新惋嚎,間隔10s
滾動(dòng)更新:
docker service update --image redis:3.0.7 redis
更新完成后新版本和歷史記錄都能查看
查看配置信息:
五、服務(wù)更新和回滾策略
1)設(shè)置策略
[root@manager ~]# docker service create \
--name my-web \
--replicas 10 \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio 0.2 \
nginx:1.12.1
# --update-parallelism 2 : 每次允許兩個(gè)服務(wù)一起更新
#--update-failure-action continue : 更新失敗后的動(dòng)作是繼續(xù)
# --rollback-parallelism 2 : 回滾時(shí)允許兩個(gè)一起
# --rollback-monitor 20s :回滾監(jiān)控時(shí)間20s
# --rollback-max-failure-ratio 0.2 : 回滾失敗率20%
如果執(zhí)行后查看狀態(tài)不是設(shè)置的站刑,可以在update
一下另伍,將服務(wù)狀態(tài)設(shè)置為自己想要的
docker service update --rollback-monitor 20s my-web
docker service update --rollback-max-failure-ratio 0.2 my-web
# 有兩個(gè)地方設(shè)置數(shù)值沒(méi)有成功,手動(dòng)設(shè)置
查看狀態(tài):
2)服務(wù)更新
[root@manager ~]# docker service update --image nginx:1.13.5 my-web
和上述策略一致绞旅,兩兩更新
更新完成:
3)手動(dòng)回滾(策略是失敗會(huì)回滾摆尝,現(xiàn)在沒(méi)有失敗)
剛才nginx版本已經(jīng)是1.13.5
了因悲,現(xiàn)在將其還原到1.12.1
[root@manager ~]# docker service update --rollback my-web
手動(dòng)回滾成功
2 docker swarm集群可視化管理
一堕汞、工具介紹
我們既然搭建好了我們的容器編排集群,那我們總不能日常的時(shí)候也在命令行進(jìn)行操作晃琳,所以我們需要使用到一些可視化的工具讯检,Docker
圖形化管理提供了很多工具,有Portainer
卫旱、Docker UI
人灼、Shipyard
等等,本文主要介紹Portainer
顾翼。
Portainer
是一個(gè)開(kāi)源投放、輕量級(jí)Docker
管理用戶界面,基于Docker API
适贸,提供狀態(tài)顯示面板灸芳、應(yīng)用模板快速部署涝桅、容器鏡像網(wǎng)絡(luò)數(shù)據(jù)卷的基本操作(包括上傳下載鏡像,創(chuàng)建容器等操作)烙样、事件日志顯示苹支、容器控制臺(tái)操作、Swarm集群
和服務(wù)等集中管理和操作误阻、登錄用戶管理和控制等功能债蜜。功能十分全面,基本能滿足中小型單位對(duì)容器管理的全部需求究反。
二寻定、創(chuàng)建容器
1)下載官方鏡像
[root@ linuxidc /]# docker pull portainer/portainer
Using default tag: latest
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete
ba5495c717cb: Pull complete
Digest: sha256:8146a5aae1135a0ccee424488c6867b438be21d1e915903a858d12e8382b817b
Status: Downloaded newer image for portainer/portainer:latest
2)單機(jī)運(yùn)行
如果僅有一個(gè)docker宿主機(jī)
,則可使用單機(jī)版
運(yùn)行精耐,Portainer單機(jī)版
運(yùn)行十分簡(jiǎn)單狼速,只需要一條語(yǔ)句即可啟動(dòng)容器,來(lái)管理該機(jī)器上的docker
鏡像卦停、容器等數(shù)據(jù)向胡。
創(chuàng)建數(shù)據(jù)卷:
[root@linuxidc ~]# docker volume create portainer_data
portainer_data
注意:很多人會(huì)有疑問(wèn),為什么要?jiǎng)?chuàng)建數(shù)據(jù)卷惊完?這個(gè)我們也在之后進(jìn)行回答僵芹,這里埋下一坑。
運(yùn)行容器:
[root@linuxidc ~]# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
439cc8a6d44a84f5967534c50d3accc43fbeb578258a52c2683afeb230dd6e04
參數(shù)說(shuō)明:
-d:容器在后臺(tái)運(yùn)行小槐;
-p 9000:9000 :宿主機(jī)9000端口映射容器中的9000端口
-v /var/run/docker.sock:/var/run/docker.sock :把宿主機(jī)的Docker守護(hù)進(jìn)程(Docker daemon)默認(rèn)監(jiān)聽(tīng)的Unix域套接字掛載到容器中拇派;
-v portainer_data:/data :把宿主機(jī)portainer_data數(shù)據(jù)卷掛載到容器/data目錄;
查看容器進(jìn)程:
[root@linuxidc ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
439cc8a6d44a portainer/portainer "/portainer" 13 seconds ago Up 13 seconds 0.0.0.0:9000->9000/tcp amazing_clarke
訪問(wèn)服務(wù):
訪問(wèn)方式:http://IP:9000 凿跳,首次登錄需要注冊(cè)用戶件豌,給用戶admin
設(shè)置密碼,如下圖:
單機(jī)版本選擇
“Local"
控嗜,點(diǎn)擊Connect
即可連接到本地docker
茧彤,如下圖:注意:從上圖可以看出,有提示需要掛載本地
/var/run/docker.socker
與容器內(nèi)的/var/run/docker.socker
連接疆栏。因此曾掂,在啟動(dòng)時(shí)必須指定該掛載文件。
3)集群運(yùn)行
更多的情況下承边,我們會(huì)有一個(gè)docker集群
遭殉,可能有幾臺(tái)機(jī)器
石挂,也可能有幾十臺(tái)機(jī)器
博助,因此,進(jìn)行集群管理就十分重要了痹愚,Portainer
也支持集群管理富岳,Portainer
可以和Swarm
一起來(lái)進(jìn)行集群管理操作蛔糯。首先要搭建了一個(gè)Swarm
,本文不著重介紹Swarm集群
的安裝窖式。
啟動(dòng)集群參考官方文檔:https://portainer.io/install.html
$ docker service create \
--name portainer \
--publish 9000:9000 \
--replicas=1 \
--constraint 'node.role == manager' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=//opt/portainer,dst=/data \
portainer/portainer \
-H unix:///var/run/docker.sock
啟動(dòng)Portainer
之后蚁飒,首頁(yè)還是給admin
用戶設(shè)置密碼(這里和單機(jī)啟動(dòng)一樣)。
我們進(jìn)入之后可以看到這個(gè)一個(gè)界面萝喘。
我們可以看到我們現(xiàn)在的集群的節(jié)點(diǎn)配置情況
3 Docker Swarm+阿里云鏡像倉(cāng)庫(kù)實(shí)戰(zhàn)
我們現(xiàn)在已經(jīng)做好了集群以及集群的可視化管理淮逻,我們可以將自己的服務(wù)打包到DockerHub
倉(cāng)庫(kù)進(jìn)行發(fā)布,但有時(shí)候我們希望有個(gè)自己的私人倉(cāng)庫(kù)阁簸,能夠不對(duì)外暴露的話爬早,怎么辦呢?我們這里介紹一種方式启妹,基于Docker Swarm+阿里云鏡像倉(cāng)庫(kù)
的服務(wù)部署方式筛严。
一、自建阿里云鏡像倉(cāng)庫(kù)
根據(jù)鏈接進(jìn)入到鏡像倉(cāng)庫(kù)
新建鏡像倉(cāng)庫(kù)
我們選擇從命令行推鏡像
新建好“test”鏡像倉(cāng)庫(kù)饶米,看看具體的倉(cāng)庫(kù)情況
二桨啃、自建鏡像推到遠(yuǎn)程倉(cāng)庫(kù)
我們拉下來(lái)一個(gè)鏡像,記住鏡像的 ID
我們先在本地登錄倉(cāng)庫(kù)檬输,便于之后的操作
將本地的鏡像打上
TAG
照瘾,推到遠(yuǎn)程倉(cāng)庫(kù)我們切換到遠(yuǎn)程倉(cāng)庫(kù),
test鏡像倉(cāng)庫(kù)
已經(jīng)有了該鏡像丧慈,說(shuō)明我們推送成功了网杆。三、Docker Swarm拉取鏡像啟動(dòng)服務(wù)
1)Portainer
添加私有庫(kù)
2)Portainer
拉取遠(yuǎn)程倉(cāng)庫(kù)啟動(dòng)一個(gè)容器
啟動(dòng)容器
測(cè)試容器是否正常運(yùn)行
Postman
的信息伊滋,服務(wù)正常運(yùn)行碳却,說(shuō)明我們這個(gè)思路是正確的~
4 總結(jié)
單就目前的云市場(chǎng)來(lái)說(shuō),Kubernates
已經(jīng)占據(jù)80%
的市場(chǎng)份額笑旺,Docker Swarm
已逐漸被淘汰昼浦,像阿里云將會(huì)在不久之后終止對(duì)Swarm
的云編排的支持。雖然是這樣的請(qǐng)況筒主,但是對(duì)于我們個(gè)人開(kāi)發(fā)者來(lái)說(shuō)关噪,也許我們的服務(wù)器配置很低,但我們又想用云平臺(tái)來(lái)部署自己的服務(wù)乌妙,那我們大可以選擇Docker Swarm
使兔,簡(jiǎn)單又不需要極高的配置,還能讓我們嘗試云服務(wù)帶給我們的便捷性藤韵,何樂(lè)而不為呢虐沥?
號(hào)主介紹
前兩年在二線大廠工作,目前在創(chuàng)業(yè)公司搬磚。
接觸方向是爬蟲(chóng)和云原生架構(gòu)方面欲险,
有豐富的反爬攻克經(jīng)驗(yàn)以及云原生二次開(kāi)發(fā)經(jīng)驗(yàn)镐依。
其他諸如數(shù)據(jù)分析、黑客增長(zhǎng)也有所涉獵天试。
做過(guò)百余人的商業(yè)分享以及多次開(kāi)辦培訓(xùn)課程槐壳。
目前也是**CSDN博客專(zhuān)家 **