新的Docker Swarm不再需要為應用容器設置獨立的HTTP代理。如上圖所示的原有架構現在被精簡為下圖所示的形式:
移動部件更少了——贊!
另外,我們還為後端服務內置了負載均衡機制。我們甚至能夠立足於集群內的任一節點訪問這些服務。Docker Swarm還集成有一種內置網狀路由機制,用於將各請求路由至適合的後端容器當中。
面對這些新功能,有些朋友可能認為Docker Swarm集群的設置過程會比原本更為復雜。事實上,整個流程反而更加簡單。
仍然半信半疑?下面一起來看。
沒錯,這次我們仍然使用Raspberry Pi集群。我使用的是Docker 1.12內部版本,並將其安裝在Raspberry Pi上。當Docker 1.12推出正式版後,我們會對內容做出針對性更新。
下面看看當前配置:
root@pi6 $ docker version Client: Version: 1.12.0-rc1 API version: 1.24 Go version: go1.6.2 Git commit: 1f136c1-unsupported Built: Wed Jun 15 15:35:51 2016 OS/Arch: linux/arm Server: Version: 1.12.0-rc1 API version: 1.24 Go version: go1.6.2 Git commit: 1f136c1-unsupported Built: Wed Jun 15 15:35:51 2016 OS/Arch: linux/arm
很好,Docker 1.12 RC1已經准備就緒。下面啟動各項必要服務。 首先看看我們能否在Docker CLI中找到隱藏的各項新功能。
root@pi6 $ docker Usage: docker [OPTIONS] COMMAND [arg...] docker [ --help | -v | --version ] A self-sufficient runtime for containers. ... service Manage Docker services ... stats Display a live stream of container(s) resource usage statistics ... swarm Manage Docker Swarm ... update Update configuration of one or more containers Run 'docker COMMAND --help' for more information on a command.
我直接去掉了其中與上代版本完全一致的部分,而只留了不同之處。 現在我們可以使用docker swarm命令了。
查詢其具體作用:
root@pi6 $ docker swarm Usage: docker swarm COMMAND Manage Docker Swarm Options: --help Print usage Commands: init Initialize a Swarm. join Join a Swarm as a node and/or manager. update update the Swarm. leave Leave a Swarm. inspect Inspect the Swarm Run 'docker swarm COMMAND --help' for more information on a command.
就是說其用於“初始化一套Swarm”。看起來正是我們需要的。首先啟動該命令。
root@pi6 $ docker swarm init Swarm initialized: current node (1njlvzi9rk2syv3xojw217o0g) is now a manager.
現在我們的Swarm管理節點已經開始運行,接下來為集群添加更多節點。
前往集群中的另一節點並執行:
root@pi1 $ docker swarm join pi6:2377 This node joined a Swarm as a worker.
使用上述命令,我們在剛剛創建的初始Swarm集群中聲明了應當加入該Swarm管理節點的各個新節點。Docker Swarm會在後台執行相關操作。
舉例來說,其會為不同集群節點設置經過加密的彼此通信通道。我們不再需要自行管理TLS證書。
每位曾經設置過Docker Swarm集群的朋友,都會意識到新的流程有多麼簡單。 不過到這兒還沒有結束。
Swarm管理節點中的一條“docker info”帶來了一些有趣的提示。我仍然刪去其中不必要的部分:
root@pi6 $ docker info ... Swarm: active NodeID: 1njlvzi9rk2syv3xojw217o0g IsManager: Yes Managers: 1 Nodes: 2 CACertHash: sha256:de4e2bff3b63700aad01df97bbe0397f131aabed5fabb7732283f044472323fc ... Kernel Version: 4.4.10-hypriotos-v7+ Operating System: Raspbian GNU/Linux 8 (jessie) OSType: linux Architecture: armv7l CPUs: 4 Total Memory: 925.4 MiB Name: pi6 ...
如大家所見,我們現在已經在“docker info”輸出結果中有了新的“Swarm”部分,其告訴我們當前節點屬於一套Swarm管理節點,且該集群由兩個集群節點構成。
在第二個節點上,其輸出結果與管理節點稍有不同:
Swarm: active NodeID: 3fmwt4taurwxczr2icboojz8g IsManager: No
到這裡,我們已經擁有了一套有趣但仍然空空如也的Swarm集群。
我們還需要了解Docker 1.12中的service這項全新抽象定義。大家可能在前面的輸出結果中注意到了docker service命令。所謂docker service,是指運行在容器當中且負責為外部世界提供運行在Swarm集群內的“service”的軟件片段。
這樣的一項服務可以由單一或者多套容器構成。在後一種情況下,我們可以確保服務擁有高可用性及/或負載均衡能力。
下面使用之前創建的“whoami”鏡像建立這樣一項服務。
root@pi6 $ docker service create --name whoami -p 80:8000 hypriot/rpi-whoami buy0q65lw7nshm76kvy5imxk3
在“docker swarm ls”命令的幫助下,我們可以檢查這項新服務的狀態。
root@pi6 $ docker service ls ID NAME SCALE IMAGE COMMAND buy0q65lw7ns whoami 1 hypriot/rpi-whoami
下面檢查我們是否能夠通過curl命令向eth0網絡接口發送l http命令,從而請求目錄頁面。
root@pi6 $ curl http://192.168.178.24 I'm 1b6df814c654
一切順利,鼓掌! 有些朋友可能注意到,“docker swarm ls”命令的標題行中存在“SCALE”部分,這似乎意味著我們可以對服務進行擴展。
root@pi6 $ docker service scale whoami=5 whoami scaled to 5
那就來實際驗證一下吧:
root@pi6 $ docker service ls ID NAME SCALE IMAGE COMMAND buy0q65lw7ns whoami 5 hypriot/rpi-whoami root@pi6 $ for i in {1..5}; do curl http://192.168.178.24; done
非常簡單。
但這種方式與原有Swarm其實差不多,只不過在使用感受上更便捷也更快速。請注意,我們使用的是Raspberry Pi而非強大的服務器,所以要對性能擁有較為保守的估計。
下面從單一Docker引擎的角度來看看目前的運行狀態:
root@pi6 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如大家所見,已經啟動的容器有5套,其中3套駐留於“pi6”中。 下面看看是否能夠找到其它容器:
root@pi1 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db411a119c0a hypriot/rpi-whoami:latest "/http" 6 minutes ago Up 6 minutes 8000/tcp whoami.2.2tf7yhmx9haol7e2b7xib2emj 0a4bf32fa9c4 hypriot/rpi-whoami:latest "/http" 6 minutes ago Up 6 minutes 8000/tcp whoami.3.2r6mm091c2ybr0f9jz4qaxw9k
那麼如果我們將這套Swarm集群駐留在“pi1”上,結果又會如何?
root@pi1 docker swarm leave Node left the default swarm.
下面看看另一節點上的運行情況:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
這裡的情況相當於“pi1”節點發生故障,此時“pi1”中運行的全部容器都會被自動遷移至另一集群節點。這項機制在實際生產當中無疑非常重要。
那麼下面我們回顧一下之前了解到的信息:
我們創建了一款小型動態微服務應用,完全由Docker構成。Docker Swarm現在被整合至Docker-Engine當中,而不再以獨立軟件形式存在。在多數情況下,這能夠為應用後端服務建立起獨立的代理機制。不再需要使用nginx、HAProxy或者Traefik。
盡管活動部件數量有所減少,但我們現在反而擁有了內置的高可用性與負載均衡功能。我非常期待未來Docker Swarm正式版本中會帶來哪些新的驚喜,又如何與Docker Compose進行協作。
原文來自:https://linux.cn/article-7607-1.html
轉載地址:http://www.linuxprobe.com/docker1-12-swarm.html
http://xxxxxx/Linuxjc/1155984.html TechArticle