八. 用Docker Swarm構(gòu)建主機(jī)集群

In most cases, you’ll want redundancy for your app so that if the server hosting it goes down, another server can take over; and you’ll want the ability to scale so that multiple servers can all run the app and share the workload between them. Docker has native support for that with Docker swarm mode, which lets you join multiple machines running Docker into a cluster that provides scale and redundancy.

  • 在一個(gè)集群里面,你可以指定運(yùn)行多少容器烹看,在你向swarm發(fā)送請(qǐng)求時(shí),基于資源可用情況国拇, Docker決定哪些主機(jī)會(huì)實(shí)際運(yùn)行這個(gè)容器。
  • 你可以往一個(gè)運(yùn)行的swam里面加入新容器惯殊,或者從中刪除容器酱吝。
  • Swarm支持Networking功能,這意味著里面的所有容器可以互相通訊土思。
  • 如果一臺(tái)主機(jī)掛掉务热,其上所有容器都也都會(huì)消失,為確保服務(wù)級(jí)別的正確性己儒,這個(gè)時(shí)候Docker會(huì)在其他主機(jī)上啟動(dòng)新的實(shí)例崎岂。
  • Docker swarm 遵從 manager-worker architecture ,manager 調(diào)度worker上的work闪湾。為提供高可靠性冲甘,你可以讓多個(gè)節(jié)點(diǎn)都設(shè)計(jì)為managers節(jié)點(diǎn),但是只有一個(gè)階段處于active狀態(tài)—the leader途样。為避免疲憊的選舉江醇,一般只部署奇數(shù)個(gè)主機(jī)作managers節(jié)點(diǎn)。

Docker Swarm 是一個(gè)為 IT 運(yùn)維團(tuán)隊(duì)提供集群和調(diào)度能力的編排工具何暇。用戶可以把集群中所有 Docker Engine 整合進(jìn)一個(gè)「虛擬 Engine」的資源池陶夜,通過執(zhí)行命令與單一的主 Swarm 進(jìn)行溝通,而不必分別和每個(gè) Docker Engine 溝通裆站。在靈活的調(diào)度策略下条辟,IT 團(tuán)隊(duì)可以更好地管理可用的主機(jī)資源黔夭,保證應(yīng)用容器的高效運(yùn)行。
圖片.png

例1 Docker Machine and a local VM

說明:本例中捂贿,眾多docker ps命令都應(yīng)當(dāng)更新為最新的docker container ps命令纠修,雖然docker的新版本保留了docker ps命令

1.1 安裝Docker-machine

見另外一個(gè)文檔“七. Docker Machine的安裝
”說明

1.2 使用Docker-machine+virtualbox(其上使用Boot2Docker)創(chuàng)建多個(gè)local machine(VM)

見另外一個(gè)文檔“七. Docker Machine的安裝
”說明

1.2.1 安裝Virtualbox

見另外一個(gè)文檔“七. Docker Machine的安裝
”說明

1.2.2 安裝Boot2Docker.iso

見另外一個(gè)文檔“七. Docker Machine的安裝
”說明

1.2.3 建立4個(gè)虛機(jī)(1個(gè)Master+3個(gè)Slave)

:~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso master
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso slave1
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso slave2
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso slave3
圖片.png

然后查看虛擬機(jī)狀態(tài):

~$ sudo docker-machine ls
圖片.png

1.2.3' 如果已經(jīng)創(chuàng)建虛擬機(jī)

現(xiàn)在只需要重啟即可,使用

~$ sudo docker-machine start master
~$ sudo docker-machine start slave1
~$ sudo docker-machine start slave2
~$ sudo docker-machine start slave3
圖片.png

再看看虛擬機(jī)狀態(tài):
圖片.png

1.2.3 SSH登陸到虛擬機(jī)上

圖片.png
1.2.3.1 在master上初始化一個(gè)docker swarm集群

在登陸的master虛機(jī)里面執(zhí)行:


圖片.png

注意厂僧,docker swarm init 命令有個(gè)監(jiān)聽ip,這是由于可能有多個(gè)地址(host或者vm上)

然后在3個(gè)slave虛機(jī)上執(zhí)行:

圖片.png

到目前為止了牛,集群已經(jīng)建立完畢

提示:要退出集群使用下面的命令
docker@slave2:~$ docker swarm leave
docker@master:~$ docker swarm leave --force

1.3 在該docker集群上部署高可用的nginx容器任務(wù)


圖片.png

然后測(cè)試通過兩個(gè)slave訪問niginx(實(shí)際上都過這4個(gè)虛機(jī)的任何一個(gè)都是可以的):


圖片.png

圖片.png

圖片.png

登陸到兩個(gè)slave上查看容器狀態(tài):


圖片.png

1.4 擴(kuò)容service中的任務(wù)實(shí)驗(yàn)

圖片.png
登陸到slave上看容器狀態(tài)(下圖docker ps是老的查看docker狀態(tài)的命令颜屠,最新的應(yīng)當(dāng)使用docker container ps)
圖片.png

查看集群節(jié)點(diǎn)
圖片.png

1.5 高可用性測(cè)試

圖片.png

接下來我們把master容器關(guān)閉,你會(huì)發(fā)現(xiàn)過了一會(huì)它又起來了(下面的docker ps可以用docker container ps代替鹰祸,后者是最新的命令):
圖片.png

讓slave2從集群中消失
圖片.png

上圖注意:較新的docker中可以用docker container ps查看容器狀態(tài)

圖片.png

你會(huì)看到宕機(jī)后在slave1上重啟了

圖片.png

如果我們把slave1-3全部弄宕機(jī):
圖片.png

圖片.png

較新的docker中可以用docker container ps查看容器狀態(tài)

遺留兩個(gè)實(shí)驗(yàn):

  1. 再次啟動(dòng)slave1甫窟,會(huì)不會(huì)容器再次在它環(huán)境里面自動(dòng)啟動(dòng)
  2. master掛掉后是否slave變成master

例2 多個(gè)master多個(gè)slave的單集群

2.1 創(chuàng)建多個(gè)主機(jī)實(shí)例

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso manager1 
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso manager2 
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso worker1 
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso worker2

部分結(jié)果展示如下:
圖片.png

2.2 查看虛機(jī)

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ls
圖片.png

2.3 登陸虛機(jī)

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
圖片.png

2.4 Docker Swarm 配置集群節(jié)點(diǎn)

2.4.1 創(chuàng)建第一個(gè)管理節(jié)點(diǎn)

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.100
圖片.png

2.4.2 加入第二個(gè)管理節(jié)點(diǎn)

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1 "docker swarm join-token manager"
 依據(jù)執(zhí)行結(jié)果里面的提示,登陸到manager2節(jié)點(diǎn)執(zhí)行找到的命令蛙婴,這里是:
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager2 "docker swarm join --token SWMTKN-1-5l55ipi2uyu141m5qmtlsdxggh7pp6lsq1rrw72sp6t1ggsj2f-06v7c9nv8pr2fuzgshc9korsa 192.168.99.100:2377"

圖片.png

2.4.3 加入工作節(jié)點(diǎn)

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh worker1
docker@worker1:~$ docker swarm join --token SWMTKN-1-5l55ipi2uyu141m5qmtlsdxggh7
pp6lsq1rrw72sp6t1ggsj2f-d5dqsszj6micdr8t2de3xpww7 192.168.99.100:2377
圖片.png

按照同樣的方式把worker2也加進(jìn)去
圖片.png

2.4.4 登陸到manager1查看節(jié)點(diǎn)信息

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker node ls
圖片.png

2.5 部署集群服務(wù)

2.5.1 部署4個(gè)容器

docker@manager1:~$ docker service create --replicas 4 -d -p 8080:80 --name nginx nginx:alpine
圖片.png

2.5.2 集群服務(wù)信息查看

docker@manager1:~$ docker service ls
docker@manager1:~$ docker service ps nginx
圖片.png

說明:上圖結(jié)果是因?yàn)槲抑貑⒘?個(gè)虛機(jī)
圖片.png

例3 使用Docker stack部署多集群

Docker service只能組建單個(gè)集群
注意:例2創(chuàng)建的4個(gè)虛機(jī)我們?nèi)匀恍枰?/p>

3.1 創(chuàng)建docker-compose.yml文件并部署

我這里創(chuàng)建的配置文件名為docker-compose-stack.yml文件內(nèi)容如下(可以使用touch或者vi創(chuàng)建)

version: "3"

services:
  nginx:
    image: 192.168.99.1:5000/nginx:latest
    ports:
      - 8088:80
    deploy:
      mode: replicated
      replicas: 4

  visualizer:
    image: 192.168.99.1:5000/dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

  portainer:
    image: 192.168.99.1:5000/portainer/portainer:latest
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

下面命令中-c表示--compose-file, 這里用到的docker-compose-stack.yml必須先copy到manager1主機(jī)上粗井,可以用下面的命令:

$ sudo docker-machine scp docker-compose-stack.yml manager1:~
圖片.png
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ vi docker-compose.yml
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-demo
圖片.png

總結(jié):
創(chuàng)建虛擬主機(jī)節(jié)點(diǎn)
docker-machine create 虛擬主機(jī)名
查看虛擬機(jī)節(jié)點(diǎn)信息
docker-machine ls
停止虛擬主機(jī)節(jié)點(diǎn)
docker-machine stop 虛擬主機(jī)名
刪除虛擬主機(jī)節(jié)點(diǎn)
docker-machine rm 虛擬主機(jī)名
初始化docker swarm集群
docker swarm init --advertise-addr master的IP地址
slave節(jié)點(diǎn)加入集群docker swarm join --token [token] [master的IP]:[master的端口]
slave節(jié)點(diǎn)主動(dòng)離開集群
docker swarm leave
在master上獲取加入集群的token

docker@master:~$ docker swarm join-token worker
docker@master:~$ docker swarm join-token manager
**master上創(chuàng)建service舉例:**

docker service create --replicas 2 -d -p 8080:80 --name 服務(wù)名 鏡像名
master上查看service信息
docker service ls
docker service ps 你所創(chuàng)建的服務(wù)的ID
在master上刪除service
docker service rm 服務(wù)名
在master上進(jìn)行服務(wù)擴(kuò)容
docker service scale 你的service name=你要的副本數(shù)目
查看swarm 的token
docker@master:~$ docker swarm join-token manager

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市街图,隨后出現(xiàn)的幾起案子浇衬,更是在濱河造成了極大的恐慌,老刑警劉巖餐济,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耘擂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡絮姆,警方通過查閱死者的電腦和手機(jī)醉冤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篙悯,“玉大人蚁阳,你說我怎么就攤上這事「胝眨” “怎么了螺捐?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)移宅。 經(jīng)常有香客問我归粉,道長(zhǎng),這世上最難降的妖魔是什么漏峰? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任糠悼,我火速辦了婚禮,結(jié)果婚禮上浅乔,老公的妹妹穿的比我還像新娘倔喂。我一直安慰自己铝条,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布席噩。 她就那樣靜靜地躺著班缰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悼枢。 梳的紋絲不亂的頭發(fā)上埠忘,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音馒索,去河邊找鬼莹妒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绰上,可吹牛的內(nèi)容都是我干的旨怠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜈块,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鉴腻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起百揭,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤爽哎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后信峻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倦青,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年盹舞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了产镐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踢步,死狀恐怖癣亚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情获印,我是刑警寧澤述雾,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站兼丰,受9級(jí)特大地震影響玻孟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳍征,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一黍翎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艳丛,春花似錦匣掸、人聲如沸趟紊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)霎匈。三九已至,卻和暖如春送爸,著一層夾襖步出監(jiān)牢的瞬間铛嘱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工碱璃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弄痹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓嵌器,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谐丢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爽航,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容