Docker Swarm集群初探

Desktop

前言

相信Docker技術(shù)大家都有所了解,單個(gè)Docker能發(fā)揮的作用畢竟有限,也不便于管理,所以Docker得組集群來使用才能發(fā)揮強(qiáng)大的技術(shù)優(yōu)勢(shì)。既然要組集群那就涉及諸如Docker的資源調(diào)度、管理等等一系列問題。目前涉及Docker集群的三個(gè)主要的技術(shù)無外乎Swarm、Kubernetes、Mesos三種。從本文開始作者將會(huì)一一實(shí)踐這幾種主要的Docker集群技術(shù),話不多說,現(xiàn)在開始。

注意:作者的kubernetes相關(guān)實(shí)踐在此

注: 本文原載于 My Personal Blog:CodeSheep · 程序羊 !


環(huán)境準(zhǔn)備

  • Mac OS X 10.13.2
  • Docker 17.09.1-ce-mac42 (21090)
  • virtualbox(虛擬集群中節(jié)點(diǎn)時(shí)需要)
  • boot2docker v1.8.0(在虛擬節(jié)點(diǎn)中起docker環(huán)境時(shí)需要)

環(huán)境搭建

節(jié)點(diǎn)規(guī)劃如下:

集群節(jié)點(diǎn)規(guī)劃圖

我們需要4個(gè)節(jié)點(diǎn)(1個(gè)master + 3個(gè)slave),由于沒有真實(shí)地4臺(tái)物理機(jī),所以下文中是靠docker-machine、virtualbox以及boot2docker來虛擬出4個(gè)獨(dú)立IP地址的帶docker環(huán)境的節(jié)點(diǎn),大家注意!

環(huán)境安裝:

  • Docker環(huán)境安裝:

Tips: 以前Mac上一般是使用boot2docker這個(gè)專門為OS X上運(yùn)行 Docker 而開發(fā)的一個(gè)輕量級(jí)的虛擬主機(jī)管理工具來安裝docker,現(xiàn)在boot2docker這種安裝方式官方已經(jīng)deprecated 了(當(dāng)然下文中還是需要boot2docker.iso的鏡像來幫助我們?cè)谔摂M的節(jié)點(diǎn)上起docker環(huán)境),可以直接下載docker的dmg安裝包雙擊進(jìn)行安裝即可

我們選擇docker CE版安裝即可,下載鏈接如下:
https://store.docker.com/search?type=edition&offering=community

注意:選擇官方docker dmg包安裝完成以后,docker-machine已經(jīng)天然地集成于其中了,該工具在下文中創(chuàng)建虛擬節(jié)點(diǎn)時(shí)需要,它是一個(gè)可以在虛擬主機(jī)節(jié)點(diǎn)上安裝docker engine的工具

  • virtualbox安裝

由于我們搭建集群需要具備多個(gè)不同IP地址的節(jié)點(diǎn),然而我們手上僅一臺(tái)電腦,所以需要借助virtualbox來虛擬出多個(gè)不同IP地址的節(jié)點(diǎn)供我們使用需要

去官方下載virtualbox的dmg安裝包,雙擊安裝即可:
https://www.virtualbox.org/

  • boot2docker安裝
    Boot2Docker是一個(gè)專為Docker而設(shè)計(jì)的輕量級(jí)Linux發(fā)型包,解決Windows或者OS X用戶不能安裝Docker的問題。Boot2Docker完全運(yùn)行于內(nèi)存中,體積小,啟動(dòng)快。Boot2Docker需要運(yùn)行在VirtualBox中。

我使用的是brew這個(gè)mac上的包管理器安裝的,非常方便,只需一行命令:
brew install boot2docker

除此之外我們還需要下載boot2docker.iso鏡像在后文中進(jìn)行使用:
https://github.com/boot2docker/boot2docker/releases/tag/v17.07.0-ce
我們先把boot2docker.iso下好后面?zhèn)溆?/p>


Docker Swarm集群實(shí)驗(yàn)

先創(chuàng)建4個(gè)虛擬節(jié)點(diǎn)(1個(gè)master + 3個(gè)slave)

首先要將之前下載的boot2docker.iso放到/Users/你的用戶名/.docker/machine/cache/目錄下,然后執(zhí)行如下命令:

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,直接執(zhí)行docker-machine create master創(chuàng)建節(jié)點(diǎn)時(shí),可能會(huì)報(bào)No default Boot2Docker ISO found locally, downloading the latest release...這種錯(cuò)誤!所以最好自己指定boot2docker.iso鏡像路徑

docker-machine命令創(chuàng)建虛擬機(jī)過程細(xì)節(jié)如下:


docker-machine命令創(chuàng)建虛擬機(jī)過程

創(chuàng)建完4個(gè)節(jié)點(diǎn)以后,可以用docker-machine ls命令查看一下各個(gè)節(jié)點(diǎn)的情況,可以看到自動(dòng)為其分配了獨(dú)立的IP地址:

docker-machine ls查看虛擬節(jié)點(diǎn)創(chuàng)建情況

ssh接入虛擬節(jié)點(diǎn)

開啟4個(gè)獨(dú)立的terminal終端,分別執(zhí)行:

docker-machine ssh master
docker-machine ssh slave1
docker-machine ssh slave2
docker-machine ssh slave3

執(zhí)行后的效果如下圖:


3個(gè)slave1個(gè)master概覽.jpg

接下來在master上初始化一個(gè)docker swarm集群

執(zhí)行命令:

docker swarm init --advertise-addr 192.168.99.100

效果如下:


在master節(jié)點(diǎn)上初始化集群

上述命令執(zhí)行成功后,提示中會(huì)告知用戶在slave節(jié)點(diǎn)上執(zhí)行命令 docker swarm join --token SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377
可以加入到該集群中,把命令都告訴你了,你說智不只能!

將3個(gè)slave節(jié)點(diǎn)加入集群

分別去三個(gè)slave上,輸入上面提示中的命令:

docker swarm join --token SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377

執(zhí)行效果如下:


master上初始化集群以及3個(gè)slave加入集群

注意:如果忘了docker swarm join 命令中的token命令的話,可以使用命令docker swarm join-token worker來get之

好,到此為止應(yīng)該說docker swarm集群的搭建工作已經(jīng)完成了,那下面在這個(gè)集群上做點(diǎn)實(shí)際的任務(wù)吧!

開始在master節(jié)點(diǎn)上創(chuàng)建服務(wù)

我們計(jì)劃在該docker集群上部署高可用的nginx容器任務(wù)來作為演示:
在master節(jié)點(diǎn)上執(zhí)行如下命令來創(chuàng)建名為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

執(zhí)行效果如下:


在master節(jié)點(diǎn)上剛創(chuàng)建mynginx service

此處有兩點(diǎn)需要注意:

  1. 我們使用了registry.docker-cn.com/library/nginx作為加速鏡像,不然可能在slave上pull鏡像的時(shí)候timeout
  2. 注意此處創(chuàng)建了service之后并不是nginx容器立馬都在slave上起起來了,是需要等一段時(shí)間的(如,我等了近8分鐘),因?yàn)樵趕lave上還要去pull nginx鏡像,再啟動(dòng)nginx容器等,沒有那么快

等待若干分鐘以后,我們?cè)倏葱Чl(fā)現(xiàn)此時(shí)任務(wù)順利地分發(fā)到slave1和slave2上了:

經(jīng)過若干分鐘后在master上查看service的效果

分別用瀏覽器訪問:
http://192.168.99.101:8080 和 http://192.168.99.102:8080 ,會(huì)得到如下結(jié)果:


192.168.99.101(slave1)上nginx容器訪問結(jié)果
192.168.99.102(slave2)上nginx容器訪問結(jié)果

成功訪問到了slave節(jié)點(diǎn)中起起來的nginx服務(wù)!

此時(shí)分別去 slave1 和 slave2 上查看容器運(yùn)行情況,結(jié)果如下:


slave1 和 slave2 上查看容器運(yùn)行情況

進(jìn)一步實(shí)驗(yàn):擴(kuò)容service中的任務(wù)

我們想將nginx容器平滑地?cái)U(kuò)容到3份,在master上執(zhí)行:

docker service scale mynginx=3

然后在master上查看service,發(fā)現(xiàn)新增的一個(gè)容器任務(wù)分配到slave3上了,當(dāng)然此時(shí)slave3上正在preparing:


擴(kuò)容為3份后任務(wù)被分到slave3上).jpg

等若干分鐘后在master上再次查看service,發(fā)現(xiàn)slave3上的nginx容器任務(wù)成功啟動(dòng)了:

成功擴(kuò)容之后master節(jié)點(diǎn)上看集群信息

去slave3節(jié)點(diǎn)上docker ps看一下,發(fā)現(xiàn)容器確實(shí)啟動(dòng)了:


擴(kuò)容到slave3后slave3上的docker ps信息

進(jìn)一步實(shí)驗(yàn):集群中service高可用

目前有3個(gè)運(yùn)行的nginx容器保證服務(wù)的可用性,如果其中一個(gè)容器意外關(guān)閉將會(huì)是什么情況?接下來就來模擬

我們關(guān)閉slave1上此時(shí)正在運(yùn)行著的nginx容器,看服務(wù)有什么變化:


關(guān)掉slave1上的nginx容器

此時(shí)去master節(jié)點(diǎn)上查看信息發(fā)現(xiàn),被關(guān)掉的nginx被分配到master上重啟了:

關(guān)閉了slave1后,在master節(jié)點(diǎn)上恢復(fù)了nginx服務(wù)

此時(shí)我又關(guān)閉master節(jié)點(diǎn)上啟動(dòng)的nginx容器,發(fā)現(xiàn)剛關(guān)閉不久后,nginx容器又重新在master上恢復(fù)了:

再次關(guān)閉master上的ngix,結(jié)果在master上全部重啟.jpg

接下來我們來將slave3宕機(jī)(宕機(jī)和前文的關(guān)閉nginx容器不同,此處模仿的是物理宕機(jī)),我們?cè)诳刂婆_(tái)中使用docker-machine stop來模擬宕機(jī)動(dòng)作:


將slave3從集群中斷開

此時(shí)去master上查看service信息發(fā)現(xiàn)slave3宕機(jī)以后,nginx任務(wù)又重啟與slave1上來保持高可用:

將slave3宕機(jī)后nginx重啟在slave1上

最后來把狠的,我們將slave1,slave2,slave3全部從集群中斷開:


將所有節(jié)點(diǎn)全部宕機(jī).jpg

結(jié)果去master上查看service信息,發(fā)現(xiàn)3個(gè)容器副本全部遷移到master之上了:

3個(gè)slave全部宕機(jī)后任務(wù)全部重啟在master上

此時(shí)在master上執(zhí)行docker ps查看容器信息如下:運(yùn)行著3個(gè)nginx容器:

slave全部宕機(jī)后在master節(jié)點(diǎn)上看到的nginx容器進(jìn)程

總而言之,無論怎么操作集群都能保持制定數(shù)量的容器副本來實(shí)現(xiàn)高可用!


【干貨】總結(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 swarm join-token worker
  • 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ù)目

參考文獻(xiàn)


后記

由于能力有限,若有錯(cuò)誤或者不當(dāng)之處,還請(qǐng)大家批評(píng)指正,一起學(xué)習(xí)交流!



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容