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。ht
ml
$ docker service create \
——name portainer \
——publish 9000:9000 \
——replicas=1 \
——constraint ‘node。role == manager’ \
——mount type=bind,alt="震驚 | 只需3分鐘!極速部署個人Docker雲平臺" data-isLoading="0" src="/static/img/blank.gif" data-src=//var/run/docker。sock,dst=/var/run/docker。sock \
——mount type=bind,alt="震驚 | 只需3分鐘!極速部署個人Docker雲平臺" data-isLoading="0" src="/static/img/blank.gif" data-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部落格專家 **