介紹
Docker Swarm是用于部署Docker主機集群的Docker本地解決方案。您可以使用它來快速部署在本地計算機或受支持的云平臺上運行的Docker主機集群。
在Docker 1.12之前,設置和部署Docker主機集群需要使用外部鍵值存儲(如etcd或Consul)來進行服務發現。但是,使用Docker 1.12,不再需要外部發現服務,因為Docker提供了一個內置的鍵值存儲,可以開箱即用。
在本教程中,您將了解如何使用Docker 1.12上的Swarm功能部署一組Docker機器。集群中的每個Docker節點將運行Ubuntu 16.04。雖然您可以運行由數十,數百或數千個Docker主機組成的群集,但我們將在本教程中設置的群集將由一個管理器節點和兩個工作節點組成,共有三個群集成員。完成本教程后,您可以輕松地向集群中添加更多節點。
先決條件
對于本教程,您需要:
安裝了Docker的本地機器。您的本地計算機可以運行任何Linux發行版,甚至Windows或macOS。對于Windows和macOS,使用官方安裝程序安裝Docker。 如果您的本地計算機上運行了Ubuntu 16.04,但未安裝Docker ,請參閱如何在Ubuntu 16.04上安裝和使用Docker以獲取相關說明。
DigitalOcean API令牌。如果沒有,使用本指南生成它。生成令牌時,請確保它具有讀寫范圍。這是默認值,因此如果您在生成它時不更改任何選項,它將具有讀寫能力。為了更容易在命令行中使用,請務必將令牌分配給該文章中給出的變量。
Docker Machine安裝在本地計算機上,您將使用它來創建三臺主機。 在Windows和macOS上,Docker安裝包括Docker Machine。
第1步 – 配置群集節點
我們需要為集群創建幾個Docker主機。 作為刷新程序,以下命令提供單個Docker化主機,其中$DOTOKEN是一個環境變量,其計算結果為您的DigitalOcean API令牌:
1
|
docker -machine create - -driver digitalocean - -digitalocean -image ubuntu-16-04-x64 - -digitalocean -access -token $DOTOKEN machine -name |
想象一下,必須設置一個由至少三個節點組成的集群,一次配置一個主機。
我們可以使用此命令并結合一些簡單的Bash腳本自動化配置任何數量的Docker主機的過程。在本地機器上執行此命令以創建三個名為node-1 , node-2和node-3 Docker主機:
1
2
3
|
for i in 1 2 3; do docker-machine create --driver digitalocean \ --digitalocean-image ubuntu-16-04-x64 \ --digitalocean-access-token $DOTOKEN node-$i; done |
命令成功完成后,您可以通過訪問您的DigitalOcean儀表板或輸入以下命令來驗證是否已創建所有計算機:
1
|
docker-machine ls |
輸出應類似于以下內容,它應該作為查找節點的IP地址的快速參考:
1
2
3
4
5
|
Output NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS node-1 - digitalocean Running tcp://104.236.239.4:2376 v1.12.2 node-2 - digitalocean Running tcp://104.131.165.210:2376 v1.12.2 node-3 - digitalocean Running tcp://104.236.76.250:2376 v1.12.2 |
此時,所有三個Docker化主機已創建,并且您擁有每個主機的IP地址。他們也都運行Docker 1.12.x,但是還不是Docker集群的一部分。在接下來的步驟中,我們將配置防火墻規則,使節點成為集群成員,選擇其中一個節點并將其作為Docker Swarm管理器,并將其余部分配置為Docker Swarm工作線程。
第2步 – 配置防火墻規則以允許Docker群交通
集群必須至少有一個節點作為管理器,但對于生產設置,建議使用三個管理器。對于此設置,讓我們選擇第一個節點,并將其設置為Swarm管理器。其他兩個節點將是工作節點。
必須在將成為群集一部分的節點上打開某些網絡端口,以使群集正常工作。這需要配置防火墻以允許通過這些端口的流量。因為有三個不同的防火墻應用程序可用于完成該任務,您需要在每個防火墻應用程序的節點上執行的命令已在單獨的文章中記錄。按照本指南并為每個主機配置防火墻。打開管理器上的適當端口,然后重復以打開兩個客戶機節點上的端口。
完成此步驟后,可以初始化集群管理器。
第3步 – 初始化集群管理器
我們已經決定node-1將是我們的集群管理器,所以從本地機器登錄到節點:
1
|
docker-machine ssh node-1 |
命令提示符將更改以反映您現在已登錄到該特定節點的事實。要將節點配置為Swarm管理器,請鍵入以下命令:
1
|
docker swarm init - -advertise -addr node_ip_address |
node_ip_address是節點的IP地址。 您可以從docker docker-machine ls的輸出或從DigitalOcean儀表板獲取它。
您將看到類似于以下內容的輸出:
1
2
3
4
5
6
7
|
Output Swarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ - -token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \ 104.236.239.4:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
輸出中是節點的ID,在此示例中為a35hhzdzf4g95w0op85tqlow1 ,以及有關如何將其他節點添加到集群的指示信息。
所以現在你有一個經理配置的Docker Swarm。讓我們將剩余的節點添加為工人。
第4步 – 將節點添加到集群
要完成此步驟,您可能想要打開另一個終端,現在離開您用于單獨登錄到Swarm管理器的終端選項卡或窗口。
首先,從本地機器連接到node-2 :
1
|
docker -machine ssh node-2 |
然后執行此命令,其中your_swarm_token是在上一步創建集群時接收的令牌, manager_node_ip_address是Swarm管理器的IP:
1
2
3
|
docker swarm join \ - -token your_swarm_token \ manager_node_ip_address:2377 |
命令成功執行后,您將看到此響應:
1
2
|
Output This node joined a swarm as a worker. |
注銷node-2 ,然后使用node-3重復此過程以將其添加到集群。
您現在已將兩個工作節點添加到集群。如果防火墻規則配置正確,則現在具有正常運行的Docker Swarm,所有節點都已同步。
第5步 – 管理群集
在管理器和工作節點分配給集群后,所有Docker Swarm管理命令必須在管理器節點上執行。因此返回到您用于添加管理器的終端,并鍵入此命令以查看集群的所有成員:
1
|
docker node ls |
輸出應類似于:
1
2
3
4
5
|
Output ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active 6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader |
這個輸出表明我們正在處理一個3節點的Docker Swarm及其節點 – 一個經理和兩個工人。要查看可以在管理器節點上運行的其他管理命令,請鍵入:
1
|
docker node - -help |
有關集群的詳細信息,您可以在manager或workers上使用以下命令(它是一個通用的Docker命令):
1
|
docker info |
輸出應該是這種類型,并且應該指示集群的狀態( 活動或待決 ),集群中的節點數以及特定節點是管理者還是工作者。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
Output ... Network: bridge host null overlay Swarm: active NodeID: a35hhzdzf4g95w0op85tqlow1 Is Manager: true ClusterID: f45u0lh7ag4qsl4o56yfbls31 Managers: 1 Nodes: 3 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Heartbeat Tick: 1 Election Tick: 3 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Node Address: 104.236.239.4 Runtimes: runc Default Runtime: runc Security Options: apparmor seccomp Kernel Version: 4.4.0-38 -generic Operating System: Ubuntu 16.04.1 LTS OSType: linux ... |
如果在工作線程節點上重復相同的命令, Is Manager行應顯示為false 。
提示 :您可以隨時從群集中添加或刪除節點。 此外,工作節點可以升級為管理器,并且管理器可以轉換為工作器。
現在讓我們在集群上運行一個服務。
第6步 – 在Docker Swarm中運行服務
現在你有一個Docker Swarm并運行,讓我們運行一個測試容器,看看管理器如何處理它。在運行Docker Engine 1.12或更高版本的計算機上,容器使用docker docker service命令部署為服務。 和docker node命令一樣, docker service命令只能在管理器節點上執行。
所以讓我們使用官方的Nginx容器圖像部署一個web服務器服務:
1
|
docker service create -p 80:80 - -name webserver nginx |
在此命令中,我們將Nginx容器中的端口80映射到集群上的端口80 ,以便我們可以從任何位置訪問默認的Nginx頁面。
要查看集群上運行的服務,請鍵入:
1
|
docker service ls |
輸出應采取此形式。 REPLICAS列顯示有多少服務實例正在運行:
1
2
3
|
Output ID NAME REPLICAS IMAGE COMMAND 0ymctkanhtc1 webserver 1/1 nginx |
您可以通過使用docker service ps后跟服務名稱來確定服務正在運行的節點。
1
|
docker service ps webserver |
輸出應類似于以下內容:
1
2
3
|
Output ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago |
在此示例中, webserver服務在node-1上運行。 由于這是一個在默認端口上運行的Web服務器,您可以通過將瀏覽器指向http:// node-1_ip_address來訪問它。試一試。你會看到Nginx的默認頁面。
借助網狀網絡的魔力,可以在集群的任何其他節點上訪問在節點上運行的服務。例如,此Nginx服務也可以通過將瀏覽器指向集群中任何節點的IP地址來訪問,而不僅僅是它正在運行的節點的IP地址。試一試。
Docker Swarm的另一個功能是縮放服務的能力,即啟動服務的其他實例。假設我們想將我們之前啟動的webserver服務擴展為五個實例。為此,我們只需鍵入以下命令,系統將創建四個實例:
1
|
docker service scale webserver=5 |
并且docker docker service ps的輸出將顯示在哪些節點上啟動的新實例:
1
2
3
4
5
6
7
|
Output ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago 1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago 2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago |
這表明四個新實例中的兩個在node-3上啟動,一個在node-1上啟動,另一個在node-2上啟動。
最后,如果服務關閉,如果原始節點不再可用,它會在同一節點或不同節點上自動重新啟動。
結論
你已經看到了使用Docker Engine 1.12和新的Swarm模式設置Docker Swarm有多么容易。您還了解了如何在集群上執行幾個管理任務。但還有更多。要查看可用的Docker Swarm命令,請在Swarm管理器上執行以下命令。
1
|
docker swarm - -help |
以上所述是小編給大家介紹的在Ubuntu 16.04上用Docker Swarm和DigitalOcean創建一個Docker容器集群的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.howtoing.com/how-to-create-a-cluster-of-docker-containers-with-docker-swarm-and-digitalocean-on-ubuntu-16-04/