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

  • 2019 年 11 月 5 日
  • 筆記

作者: Lateautumn4lin

來源:雲爬蟲技術研究筆記

什麼!三分鐘搞定個人雲平台!

對,你們想的沒錯,就是三分鐘

那需要準備什麼呢?

只需要

至少1台伺服器

不管是什麼雲產商的,只要能用就行,配置也沒要求哦!

阿里雲帳號

負責來做雲鏡像倉庫

真的只要這樣就可以了!

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集群的安裝。

啟動集群參考官方文檔:portainer.io/install.ht

$ 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,簡單又不需要極高的配置,還能讓我們嘗試雲服務帶給我們的便捷性,何樂而不為呢?

Tags: