震驚 | 只需3分鐘!極速部署個人Docker云平臺

1 Docker Swarm極速部署(5分鐘極速部署)

一、介紹系統(tǒng)環(huán)境

1)服務(wù)器環(huán)境
節(jié)點名稱 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

注意:部署這些編排工具的時候服務(wù)器數(shù)量不定,1臺服務(wù)器也行,所以讀者可以自由增減服務(wù)器。

2)前提條件
  • Docker版本1.18+
  • 集群節(jié)點之間保證TCP 2377、TCP/UDP 7946UDP 4789端口通信

注意Docker版本最好大于1.12,因為1.12版本之后Docker Swarm才正式歸入Docker內(nèi)置命令內(nèi),另外,需要保證各個節(jié)點之間的可連通性,如果是外網(wǎng)集群的話,注意要設(shè)置iptable來限定某些IP對于某些端口的可訪問性。

二、集群部署

1)master節(jié)點創(chuàng)建Swarm集群(要保存初始化后token,因為在節(jié)點加入時要使用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. 

注意:真的是一鍵部署集群!?。?,上面命令執(zhí)行后,該機(jī)器自動加入到swarm集群。這個會創(chuàng)建一個集群token,獲取全球唯一的 token,作為集群唯一標(biāo)識。后續(xù)將其他節(jié)點加入集群都會用到這個token值。 其中,--advertise-addr參數(shù)表示其它swarm中的worker節(jié)點使用此ip地址manager聯(lián)系。命令的輸出包含了其它節(jié)點如何加入集群的命令。

使用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é)點到swarm集群中

需要在所有節(jié)點執(zhí)行,worker節(jié)點只需一條命令就可以加入集群

docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377

master上查看集群節(jié)點的狀態(tài)


到此Swarm集群就創(chuàng)建好了,我們現(xiàn)在有一個多節(jié)點的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
   將管理節(jié)點降級為普通節(jié)點
# inspect
    查看節(jié)點的詳細(xì)信息
# ls
   列出節(jié)點
# promote
   將普通節(jié)點升級為管理節(jié)點
# ps
   查看運行的任務(wù)
# rm
   從swarm集群中刪除節(jié)點
# update
   改變集群節(jié)點狀態(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é)點狀態(tài)正常
# pause
    節(jié)點掛起、暫停
# drain
    排除節(jié)點,比如將master節(jié)點排除,不分配任務(wù),只作為管理節(jié)點
    

node update命令

三、在Swarm中部署服務(wù)

集群部署好了,我們接下來該測試一下我們的集群基本使用是否正常,下面我們開始我們的測試。

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中能看出這個 hello服務(wù)并沒有啟動起來,0/1表示 1計劃啟動的副本數(shù),0實際啟動的數(shù)量。所以啟動失敗 

2)添加參數(shù)

hello服務(wù)busybox只是一個基礎(chǔ)鏡像,并沒有一個持續(xù)運行的任務(wù),所以manager會不斷重啟hello這個服務(wù),所以有好多shutdown的記錄。但是我們可以為其添加一個任務(wù)使其持續(xù)運行。
注意:為什么沒有任務(wù)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:更新狀態(tài)
 
# --args:增加參數(shù)

再次查看hello服務(wù)狀態(tài):


過濾不正常的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ù)量
image
4)工作節(jié)點排除manager,manager只作為管理節(jié)點

上圖中manager也運行了一個服務(wù),將manager排除在外,在正式的生產(chǎn)環(huán)境中我們都建議這么做,因為在容器編排當(dāng)中,區(qū)分WorkerMaster節(jié)點的主要原因是因為Worker 只負(fù)責(zé)完成任務(wù),啟動服務(wù),而Master則負(fù)責(zé)任務(wù)的調(diào)配,一旦Master節(jié)點也運行服務(wù),導(dǎo)致Master節(jié)點負(fù)載過重,則會使集群發(fā)生崩潰,所以工作節(jié)點排除manager是很有必要的。

[root@manager ~]# docker node update --availability drain manager
 
# node update : 更改節(jié)點狀態(tài)
 
# --availability : 三種狀態(tài)
     
   active: 正常
   pause:掛起
   drain:排除

排除manager后,其上面運行的服務(wù)會轉(zhuǎn)移到其他節(jié)點

image

四、滾動更新服務(wù)

例如升級服務(wù)的鏡像版本

[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

更新完成后新版本和歷史記錄都能查看


image

查看配置信息:


image

五、服務(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  : 每次允許兩個服務(wù)一起更新
 
#--update-failure-action continue : 更新失敗后的動作是繼續(xù)
 
# --rollback-parallelism 2  :  回滾時允許兩個一起
 
# --rollback-monitor 20s  :回滾監(jiān)控時間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
 
# 有兩個地方設(shè)置數(shù)值沒有成功,手動設(shè)置

查看狀態(tài):


image
2)服務(wù)更新
[root@manager ~]# docker service update --image nginx:1.13.5 my-web

和上述策略一致,兩兩更新



更新完成:


3)手動回滾(策略是失敗會回滾,現(xiàn)在沒有失敗)

剛才nginx版本已經(jīng)是1.13.5了,現(xiàn)在將其還原到1.12.1

[root@manager ~]# docker service update --rollback my-web

手動回滾成功

2 docker swarm集群可視化管理

一、工具介紹

我們既然搭建好了我們的容器編排集群,那我們總不能日常的時候也在命令行進(jìn)行操作,所以我們需要使用到一些可視化的工具,Docker圖形化管理提供了很多工具,有Portainer、Docker UI、Shipyard等等,本文主要介紹Portainer

Portainer是一個開源、輕量級Docker管理用戶界面,基于Docker API,提供狀態(tài)顯示面板、應(yīng)用模板快速部署、容器鏡像網(wǎng)絡(luò)數(shù)據(jù)卷的基本操作(包括上傳下載鏡像,創(chuàng)建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務(wù)等集中管理和操作、登錄用戶管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求。

二、創(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ī)運行

如果僅有一個docker宿主機(jī),則可使用單機(jī)版運行,Portainer單機(jī)版運行十分簡單,只需要一條語句即可啟動容器,來管理該機(jī)器上的docker鏡像、容器等數(shù)據(jù)。

創(chuàng)建數(shù)據(jù)卷:

[root@linuxidc ~]# docker volume create portainer_data
portainer_data

注意:很多人會有疑問,為什么要創(chuàng)建數(shù)據(jù)卷?這個我們也在之后進(jì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ù)說明:
-d:容器在后臺運行;
-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)聽的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ù):
訪問方式:http://IP:9000 ,首次登錄需要注冊用戶,給用戶admin設(shè)置密碼,如下圖:


單機(jī)版本選擇“Local",點擊Connect即可連接到本地docker,如下圖:

注意:從上圖可以看出,有提示需要掛載本地/var/run/docker.socker與容器內(nèi)的/var/run/docker.socker連接。因此,在啟動時必須指定該掛載文件。

3)集群運行

更多的情況下,我們會有一個docker集群,可能有幾臺機(jī)器,也可能有幾十臺機(jī)器,因此,進(jìn)行集群管理就十分重要了,Portainer也支持集群管理,Portainer可以和Swarm一起來進(jìn)行集群管理操作。首先要搭建了一個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用戶設(shè)置密碼(這里和單機(jī)啟動一樣)。


我們進(jìn)入之后可以看到這個一個界面。
image


我們可以看到我們現(xiàn)在的集群的節(jié)點配置情況
image
我們可以看到我們集群中各節(jié)點的容器分布情況

3 Docker Swarm+阿里云鏡像倉庫實戰(zhàn)

我們現(xiàn)在已經(jīng)做好了集群以及集群的可視化管理,我們可以將自己的服務(wù)打包到DockerHub倉庫進(jìn)行發(fā)布,但有時候我們希望有個自己的私人倉庫,能夠不對外暴露的話,怎么辦呢?我們這里介紹一種方式,基于Docker Swarm+阿里云鏡像倉庫的服務(wù)部署方式。

一、自建阿里云鏡像倉庫

根據(jù)鏈接進(jìn)入到鏡像倉庫



新建鏡像倉庫


image

我們選擇從命令行推鏡像

新建好“test”鏡像倉庫,看看具體的倉庫情況


二、自建鏡像推到遠(yuǎn)程倉庫

我們拉下來一個鏡像,記住鏡像的 ID


我們先在本地登錄倉庫,便于之后的操作
image

將本地的鏡像打上TAG,推到遠(yuǎn)程倉庫

我們切換到遠(yuǎn)程倉庫,test鏡像倉庫已經(jīng)有了該鏡像,說明我們推送成功了。

三、Docker Swarm拉取鏡像啟動服務(wù)

1)Portainer添加私有庫
image
2)Portainer拉取遠(yuǎn)程倉庫啟動一個容器

啟動容器


測試容器是否正常運行
image
根據(jù)Postman的信息,服務(wù)正常運行,說明我們這個思路是正確的~

4 總結(jié)

單就目前的云市場來說,Kubernates已經(jīng)占據(jù)80%的市場份額,Docker Swarm已逐漸被淘汰,像阿里云將會在不久之后終止對Swarm的云編排的支持。雖然是這樣的請況,但是對于我們個人開發(fā)者來說,也許我們的服務(wù)器配置很低,但我們又想用云平臺來部署自己的服務(wù),那我們大可以選擇Docker Swarm,簡單又不需要極高的配置,還能讓我們嘗試云服務(wù)帶給我們的便捷性,何樂而不為呢?


號主介紹

前兩年在二線大廠工作,目前在創(chuàng)業(yè)公司搬磚。

接觸方向是爬蟲云原生架構(gòu)方面,

豐富的反爬攻克經(jīng)驗以及云原生二次開發(fā)經(jīng)驗。

其他諸如數(shù)據(jù)分析、黑客增長也有所涉獵。

做過百余人的商業(yè)分享以及多次開辦培訓(xùn)課程。

目前也是**CSDN博客專家 **

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容