相信Docker技術你們都有所瞭解,單個Docker能發揮的做用畢竟有限,也不便於管理,因此Docker得組集羣來使用才能發揮強大的技術優點。既然要組集羣那就涉及諸如Docker的資源調度、管理等等一系列問題。目前涉及Docker集羣的三個主要的技術無外乎Swarm、Kubernetes、Mesos三種。從本文開始做者將會一一實踐這幾種主要的Docker集羣技術,話很少說,如今開始。html
注意:做者的kubernetes相關實踐在此nginx
注: 本文首發於 My 公衆號 CodeSheep ,可 長按 或 掃描 下面的 當心心 來訂閱 ↓ ↓ ↓git
節點規劃以下:github
咱們須要4個節點(1個master + 3個slave),因爲沒有真實地4臺物理機,因此下文中是靠docker-machine
、virtualbox
以及boot2docker
來虛擬出4個獨立IP地址的帶docker環境的節點,你們注意!docker
環境安裝:編程
Tips: 之前Mac上通常是使用
boot2docker
這個專門爲OS X上運行 Docker 而開發的一個輕量級的虛擬主機管理工具來安裝docker,如今boot2docker
這種安裝方式官方已經deprecated 了(固然下文中仍是須要boot2docker.iso
的鏡像來幫助咱們在虛擬的節點上起docker環境),能夠直接下載docker的dmg安裝包雙擊進行安裝便可c#
咱們選擇docker CE版安裝便可,下載連接以下: https://store.docker.com/search?type=edition&offering=community瀏覽器
注意:選擇官方docker dmg包安裝完成之後,
docker-machine
已經自然地集成於其中了,該工具在下文中建立虛擬節點時須要,它是一個能夠在虛擬主機節點上安裝docker engine的工具服務器
因爲咱們搭建集羣須要具有多個不一樣IP地址的節點,然而咱們手上僅一臺電腦,因此須要藉助virtualbox來虛擬出多個不一樣IP地址的節點供咱們使用須要框架
去官方下載virtualbox的dmg安裝包,雙擊安裝便可: https://www.virtualbox.org/
我使用的是brew這個mac上的包管理器安裝的,很是方便,只需一行命令: brew install boot2docker
除此以外咱們還須要下載boot2docker.iso鏡像在後文中進行使用: https://github.com/boot2docker/boot2docker/releases/tag/v17.07.0-ce 咱們先把boot2docker.iso
下好後面備用
首先要將以前下載的boot2docker.iso
放到/Users/你的用戶名/.docker/machine/cache/
目錄下,而後執行以下命令:
docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso master docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave1 docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave2 docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave3
注意:上面若不指定boot2docker的路徑:
--virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso
,直接執行docker-machine create master
建立節點時,可能會報No default Boot2Docker ISO found locally, downloading the latest release...
這種錯誤!因此最好本身指定boot2docker.iso鏡像路徑
docker-machine命令建立虛擬機過程細節以下:
建立完4個節點之後,能夠用docker-machine ls
命令查看一下各個節點的狀況,能夠看到自動爲其分配了獨立的IP地址:
開啓4個獨立的terminal終端,分別執行:
docker-machine ssh master docker-machine ssh slave1 docker-machine ssh slave2 docker-machine ssh slave3
執行後的效果以下圖:
執行命令:
docker swarm init --advertise-addr 192.168.99.100
效果以下:
上述命令執行成功後,提示中會告知用戶在slave節點上執行命令 docker swarm join --token SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377
能夠加入到該集羣中,把命令都告訴你了,你說智不僅能!
分別去三個slave上,輸入上面提示中的命令:
docker swarm join --token SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377
執行效果以下:
注意:若是忘了docker swarm join 命令中的token命令的話,可使用命令
docker swarm join-token worker
來get之
好,到此爲止應該說docker swarm集羣的搭建工做已經完成了,那下面在這個集羣上作點實際的任務吧!
咱們計劃在該docker集羣上部署高可用的nginx容器任務來做爲演示: 在master節點上執行以下命令來建立名爲mynginx的service,讓其有2份nginx容器副本分配到集羣中去,起在8080端口: docker service create --replicas 2 -d -p 8080:80 --name mynginx registry.docker-cn.com/library/nginx
而後使用以下兩條命令查看效果:
docker service ls docker service ps mynginx
執行效果以下:
此處有兩點須要注意:
registry.docker-cn.com/library/nginx
做爲加速鏡像,否則可能在slave上pull鏡像的時候timeout等待若干分鐘之後,咱們再看效果,發現此時任務順利地分發到slave1和slave2上了:
分別用瀏覽器訪問: http://192.168.99.101:8080 和 http://192.168.99.102:8080 ,會獲得以下結果:
成功訪問到了slave節點中起起來的nginx服務!
此時分別去 slave1 和 slave2 上查看容器運行狀況,結果以下:
咱們想將nginx容器平滑地擴容到3份,在master上執行:
docker service scale mynginx=3
而後在master上查看service,發現新增的一個容器任務分配到slave3上了,固然此時slave3上正在preparing:
等若干分鐘後在master上再次查看service,發現slave3上的nginx容器任務成功啓動了:
去slave3節點上docker ps看一下,發現容器確實啓動了:
####進一步實驗:集羣中service高可用 目前有3個運行的nginx容器保證服務的可用性,若是其中一個容器意外關閉將會是什麼狀況?接下來就來模擬
咱們關閉slave1上此時正在運行着的nginx容器,看服務有什麼變化:
此時去master節點上查看信息發現,被關掉的nginx被分配到master上重啓了:
此時我又關閉master節點上啓動的nginx容器,發現剛關閉不久後,nginx容器又從新在master上恢復了:
接下來咱們來將slave3宕機(宕機和前文的關閉nginx容器不一樣,此處模仿的是物理宕機),咱們在控制檯中使用docker-machine stop來模擬宕機動做:
此時去master上查看service信息發現slave3宕機之後,nginx任務又重啓與slave1上來保持高可用:
最後來把狠的,咱們將slave1,slave2,slave3所有從集羣中斷開:
結果去master上查看service信息,發現3個容器副本所有遷移到master之上了:
此時在master上執行docker ps
查看容器信息以下:運行着3個nginx容器:
總而言之,不管怎麼操做集羣都能保持制定數量的容器副原本實現高可用!
docker-machine create 虛擬主機名
docker-machine ls
docker-machine stop 虛擬主機名
docker-machine rm 虛擬主機名
docker swarm init --advertise-addr master的IP地址
docker swarm join --token [token] [master的IP]:[master的端口]
docker swarm leave
docker swarm join-token worker
docker service create --replicas 2 -d -p 8080:80 --name 服務名 鏡像名
docker service ls docker service ps 你所建立的服務的ID
docker service rm 服務名
docker service scale 你的service name=你要的副本數目
做者更多的SpringBt實踐文章在此:
若是有興趣,也能夠抽點時間看看做者一些關於容器化、微服務化方面的文章:
做者更多 務實、能看懂、可復現的 原創文章盡在公衆號 CodeSheep,歡迎訂閱 ⬇️⬇️⬇️