新的Docker Swarm再也不須要爲應用容器設置獨立的HTTP代理。如上圖所示的原有架構如今被精簡爲下圖所示的形式:node
移動部件更少了——贊!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中找到隱藏的各項新功能。架構
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管理節點已經開始運行,接下來爲集羣添加更多節點。
前往集羣中的另外一節點並執行:
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進行協做。
免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/