Docker1.12 + Swarm 構建動態微服務應用

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + Swarm 構建動態微服務應用

新的Docker Swarm再也不須要爲應用容器設置獨立的HTTP代理。如上圖所示的原有架構如今被精簡爲下圖所示的形式:node

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + Swarm 構建動態微服務應用

移動部件更少了——贊!linux

另外,咱們還爲後端服務內置了負載均衡機制。咱們甚至可以立足於集羣內的任一節點訪問這些服務。Docker Swarm還集成有一種內置網狀路由機制,用於將各請求路由至適合的後端容器當中。nginx

面對這些新功能,有些朋友可能認爲Docker Swarm集羣的設置過程會比本來更爲複雜。事實上,整個流程反而更加簡單。docker

仍然半信半疑?下面一塊兒來看。後端

沒錯,此次咱們仍然使用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中找到隱藏的各項新功能。架構

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + Swarm 構建動態微服務應用

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命令了。負載均衡

查詢其具體做用:curl

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管理節點已經開始運行,接下來爲集羣添加更多節點。

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + 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集羣。

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + 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

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + Swarm 構建動態微服務應用

很是簡單。

但這種方式與原有Swarm其實差很少,只不過在使用感覺上更便捷也更快速。請注意,咱們使用的是Raspberry Pi而非強大的服務器,因此要對性能擁有較爲保守的估計。

下面從單一Docker引擎的角度來看看目前的運行狀態:

root@pi6 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + Swarm 構建動態微服務應用

如你們所見,已經啓動的容器有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

Docker1.12 + Swarm 構建動態微服務應用Docker1.12 + Swarm 構建動態微服務應用

這裏的狀況至關於「pi1」節點發生故障,此時「pi1」中運行的所有容器都會被自動遷移至另外一集羣節點。這項機制在實際生產當中無疑很是重要。

那麼下面咱們回顧一下以前瞭解到的信息:

咱們建立了一款小型動態微服務應用,徹底由Docker構成。Docker Swarm如今被整合至Docker-Engine當中,而再也不以獨立軟件形式存在。在多數狀況下,這可以爲應用後端服務創建起獨立的代理機制。再也不須要使用nginx、HAProxy或者Traefik。

儘管活動部件數量有所減小,但咱們如今反而擁有了內置的高可用性與負載均衡功能。我很是期待將來Docker Swarm正式版本中會帶來哪些新的驚喜,又如何與Docker Compose進行協做。

免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/

相關文章
相關標籤/搜索