震驚 | 只需3分鐘!極速部署個人Docker云平臺
1?Docker?Swarm極速部署(5分鐘極速部署)
一、介紹系統環境
1)服務器環境
節點名稱IP操作系統內核版本
注意:部署這些編排工具的時候服務器數量不定,1臺服務器也行,所以讀者可以自由增減服務器。
2)前提條件
Docker版本1.18+
集群節點之間保證TCP 2377、TCP/UDP 7946和UDP 4789端口通信
注意:Docker版本最好大于1.12,因為1.12版本之后Docker Swarm才正式歸入Docker內置命令內,另外,需要保證各個節點之間的可連通性,如果是外網集群的話,注意要設置iptable來限定某些IP對于某些端口的可訪問性。
二、集群部署
1)master節點創建Swarm集群(要保存初始化后token,因為在節點加入時要使用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.
注意:真的是一鍵部署集群!!!,上面命令執行后,該機器自動加入到swarm集群。這個會創建一個集群token,獲取全球唯一的?token,作為集群唯一標識。后續將其他節點加入集群都會用到這個token值。 其中,--advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯系。命令的輸出包含了其它節點如何加入集群的命令。
使用docker info或者?docker node ls查看集群中的相關信息
docker?info ? ....... Swarm:?active ?NodeID:?kfi2r4dw6895z5yvhlbyzfck6 ?Is?Manager:?true ?ClusterID:?y2zgs373cg0y6559t675yexcj ?Managers:?1 ?Nodes:?1 ?Orchestration: ??Task?History?Retention?Limit:?5 .......
2)添加節點到swarm集群中
需要在所有節點執行,worker節點只需一條命令就可以加入集群
docker?swarm?join?--token?SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw?172.16.60.95:2377
在master上查看集群節點的狀態
到此Swarm集群就創建好了,我們現在有一個多節點的Swarm集群,我們來測試一下常用的命令吧~~~
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 ???將管理節點降級為普通節點 #?inspect ????查看節點的詳細信息 #?ls ???列出節點 #?promote ???將普通節點升級為管理節點 #?ps ???查看運行的任務 #?rm ???從swarm集群中刪除節點 #?update ???改變集群節點狀態 [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 ????節點狀態正常 #?pause ????節點掛起、暫停 #?drain ????排除節點,比如將master節點排除,不分配任務,只作為管理節點 ???? node?update命令
三、在Swarm中部署服務
集群部署好了,我們接下來該測試一下我們的集群基本使用是否正常,下面我們開始我們的測試。
1)創建Hello服務,查看服務信息
[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中能看出這個?hello服務并沒有啟動起來,0/1表示?1計劃啟動的副本數,0實際啟動的數量。所以啟動失敗
2)添加參數
在hello服務中busybox只是一個基礎鏡像,并沒有一個持續運行的任務,所以manager會不斷重啟hello這個服務,所以有好多shutdown的記錄。但是我們可以為其添加一個任務使其持續運行。
注意:為什么沒有任務Docker容器就會終止呢?這個問題我們之后再回答
[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:更新狀態 ? #?--args:增加參數
再次查看hello服務狀態:
過濾不正常的hello服務狀態:
[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"?:?狀態為runngin的服務
3)為服務擴容(縮融)scale
剛才設置的replicas=1,可以增加副本數量
[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?:?指定服務的數量
4)工作節點排除manager,manager只作為管理節點
上圖中manager也運行了一個服務,將manager排除在外,在正式的生產環境中我們都建議這么做,因為在容器編排當中,區分Worker?和Master節點的主要原因是因為Worker?只負責完成任務,啟動服務,而Master則負責任務的調配,一旦Master節點也運行服務,導致Master節點負載過重,則會使集群發生崩潰,所以工作節點排除manager是很有必要的。
[root@manager?~]#?docker?node?update?--availability?drain?manager ? #?node?update?:?更改節點狀態 ? #?--availability?:?三種狀態 ????? ???active:?正常 ???pause:掛起 ???drain:排除
排除manager后,其上面運行的服務會轉移到其他節點
四、滾動更新服務
例如升級服務的鏡像版本
[root@manager?~]#?docker?service?create?\ >?--replicas?3?\ >?--name?redis?\ >?--update-delay?10s?\ >?redis:3.0.6 ? ? #?啟動3個副本集的redis ? #?update-delay?10s?:每個容器依次更新,間隔10s
滾動更新:
docker?service?update?--image?redis:3.0.7?redis
更新完成后新版本和歷史記錄都能查看
查看配置信息:
五、服務更新和回滾策略
1)設置策略
[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??:?每次允許兩個服務一起更新 ? #--update-failure-action?continue?:?更新失敗后的動作是繼續 ? #?--rollback-parallelism?2??:??回滾時允許兩個一起 ? #?--rollback-monitor?20s??:回滾監控時間20s ? #?--rollback-max-failure-ratio?0.2?:?回滾失敗率20%
如果執行后查看狀態不是設置的,可以在update一下,將服務狀態設置為自己想要的
docker?service?update?--rollback-monitor?20s??my-web ? docker?service?update?--rollback-max-failure-ratio?0.2?my-web ? #?有兩個地方設置數值沒有成功,手動設置
查看狀態:
2)服務更新
[root@manager?~]#?docker?service?update?--image?nginx:1.13.5?my-web
和上述策略一致,兩兩更新
更新完成:
3)手動回滾(策略是失敗會回滾,現在沒有失敗)
剛才nginx版本已經是1.13.5了,現在將其還原到1.12.1
[root@manager?~]#?docker?service?update?--rollback?my-web
手動回滾成功
2?docker?swarm集群可視化管理
一、工具介紹
我們既然搭建好了我們的容器編排集群,那我們總不能日常的時候也在命令行進行操作,所以我們需要使用到一些可視化的工具,Docker圖形化管理提供了很多工具,有Portainer、Docker UI、Shipyard等等,本文主要介紹Portainer。
Portainer是一個開源、輕量級Docker管理用戶界面,基于Docker API,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操作(包括上傳下載鏡像,創建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務等集中管理和操作、登錄用戶管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求。
二、創建容器
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)單機運行
如果僅有一個docker宿主機,則可使用單機版運行,Portainer單機版運行十分簡單,只需要一條語句即可啟動容器,來管理該機器上的docker鏡像、容器等數據。
創建數據卷:
[root@linuxidc?~]#?docker?volume?create?portainer_data portainer_data
注意:很多人會有疑問,為什么要創建數據卷?這個我們也在之后進行回答,這里埋下一坑。
運行容器:
[root@linuxidc?~]#?docker?run?-d?-p?9000:9000?-v?/var/run/docker.sock:/var/run/docker.sock?-v?portainer_data:/data?portainer/portainer 439cc8a6d44a84f5967534c50d3accc43fbeb578258a52c2683afeb230dd6e04 參數說明: -d:容器在后臺運行; -p?9000:9000?:宿主機9000端口映射容器中的9000端口 -v?/var/run/docker.sock:/var/run/docker.sock?:把宿主機的Docker守護進程(Docker?daemon)默認監聽的Unix域套接字掛載到容器中; -v?portainer_data:/data?:把宿主機portainer_data數據卷掛載到容器/data目錄;
查看容器進程:
[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
訪問服務:
訪問方式:http://IP:9000?,首次登錄需要注冊用戶,給用戶admin設置密碼,如下圖:
單機版本選擇“Local",點擊Connect即可連接到本地docker,如下圖:
注意:從上圖可以看出,有提示需要掛載本地/var/run/docker.socker與容器內的/var/run/docker.socker連接。因此,在啟動時必須指定該掛載文件。
3)集群運行
更多的情況下,我們會有一個docker集群,可能有幾臺機器,也可能有幾十臺機器,因此,進行集群管理就十分重要了,Portainer也支持集群管理,Portainer可以和Swarm一起來進行集群管理操作。首先要搭建了一個Swarm,本文不著重介紹Swarm集群的安裝。
啟動集群參考官方文檔: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
啟動Portainer之后,首頁還是給admin用戶設置密碼(這里和單機啟動一樣)。
我們進入之后可以看到這個一個界面。
我們可以看到我們現在的集群的節點配置情況
我們可以看到我們集群中各節點的容器分布情況
3?Docker?Swarm+阿里云鏡像倉庫實戰
我們現在已經做好了集群以及集群的可視化管理,我們可以將自己的服務打包到DockerHub倉庫進行發布,但有時候我們希望有個自己的私人倉庫,能夠不對外暴露的話,怎么辦呢?我們這里介紹一種方式,基于Docker Swarm+阿里云鏡像倉庫的服務部署方式。
一、自建阿里云鏡像倉庫
根據鏈接進入到鏡像倉庫
新建鏡像倉庫
我們選擇從命令行推鏡像
新建好“test”鏡像倉庫,看看具體的倉庫情況
二、自建鏡像推到遠程倉庫
我們拉下來一個鏡像,記住鏡像的 ID
我們先在本地登錄倉庫,便于之后的操作
將本地的鏡像打上TAG,推到遠程倉庫
我們切換到遠程倉庫,test鏡像倉庫已經有了該鏡像,說明我們推送成功了。
三、Docker Swarm拉取鏡像啟動服務
1)Portainer添加私有庫
2)Portainer拉取遠程倉庫啟動一個容器
啟動容器
測試容器是否正常運行
根據Postman的信息,服務正常運行,說明我們這個思路是正確的~
4 總結
單就目前的云市場來說,Kubernates已經占據80%的市場份額,Docker Swarm已逐漸被淘汰,像阿里云將會在不久之后終止對Swarm的云編排的支持。雖然是這樣的請況,但是對于我們個人開發者來說,也許我們的服務器配置很低,但我們又想用云平臺來部署自己的服務,那我們大可以選擇Docker Swarm,簡單又不需要極高的配置,還能讓我們嘗試云服務帶給我們的便捷性,何樂而不為呢?
號主介紹
前兩年在二線大廠工作,目前在創業公司搬磚。
接觸方向是爬蟲和云原生架構方面,
有豐富的反爬攻克經驗以及云原生二次開發經驗。
其他諸如數據分析、黑客增長也有所涉獵。
做過百余人的商業分享以及多次開辦培訓課程。
目前也是**CSDN博客專家 **
Docker
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。