池州專業(yè)網(wǎng)站建設(shè)谷歌搜索引擎鏡像
1、前言
上一篇中我們利用Docker Swarm搭建了基礎(chǔ)的集群環(huán)境。那么今天我們就來驗(yàn)證以下該集群的可用性。上一篇的示例中,我創(chuàng)建了3個(gè)實(shí)例副本,并且通過訪問http://192.168.74.132:8080得到我們的頁面。
2、驗(yàn)證高可用
1)我們可以通過以下命令查看當(dāng)前應(yīng)用的節(jié)點(diǎn)信息:
docker service ps swarm_demo
可以看出在IP為132,133,134上各啟動(dòng)了一個(gè)容器來運(yùn)行。
2)此時(shí),我們將134上的節(jié)點(diǎn)容器關(guān)掉:
# 查看容器信息,拿到容器ID
docker ps# 停止該容器
docker stop <容器ID>
3)停止完后,我們再到master節(jié)點(diǎn)上查看節(jié)點(diǎn)信息:
可以看到134節(jié)點(diǎn)上出現(xiàn)運(yùn)行的容器宕機(jī)了,但是由于我們將節(jié)點(diǎn)的副本數(shù)量設(shè)置為3,所以Swarm集群自動(dòng)的又重新啟動(dòng)了一個(gè)容器。通過當(dāng)前狀態(tài)可以看到啟動(dòng)的時(shí)間。
4)如果我們把134的docker容器整個(gè)停止掉:
5)我們再來查看master節(jié)點(diǎn)節(jié)點(diǎn)信息:
我們會(huì)發(fā)現(xiàn)3個(gè)節(jié)點(diǎn)副本中,有2個(gè)啟動(dòng)在了132的節(jié)點(diǎn)上。
而我們依然可以訪問我們的應(yīng)用:
3、熱更新
Docker Swarm實(shí)現(xiàn)平滑升級(jí),也就是不停機(jī)更新。
1)更新Dockerfile文件,版本號(hào)version改為2:
FROM nginx
RUN echo '<h1> My first Swarm demo, version: 2</h1>' > /usr/share/nginx/html/index.html
2)重新編譯鏡像:
docker build -t pengyaohuang/swarm_nginx_demo:2 .
3)上傳Docker Hub:
docker login
docker push pengyaohuang/swarm_nginx_demo:2
4)更新之前Swarm部署的服務(wù):
docker service update --image pengyaohuang/swarm_nginx_demo:2 swarm_demo
5)訪問應(yīng)用:
4、數(shù)據(jù)持久化
與單機(jī)環(huán)境一樣,Docker Swarm集群中的容器也是無狀態(tài)的服務(wù)。如果在Swarm集群行了MySQL 等有狀態(tài)的服務(wù),若沒有將數(shù)據(jù)掛載到宿主機(jī)中,那么一旦容器被銷毀,則意味著據(jù)會(huì)丟失。
Docker Swarm集群提供了兩種方式解決數(shù)據(jù)持久化問題:
- volume模式:默認(rèn)模式,將工作節(jié)點(diǎn)宿主機(jī)的目錄同步到容器內(nèi)。
- NFS模式:通過網(wǎng)絡(luò)文件系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)持久化。
4.1、volume掛載
這里的數(shù)據(jù)卷方式與docker容器下的數(shù)據(jù)卷完全一樣??梢允褂靡韵旅顠燧d數(shù)據(jù)卷:
docker service create -p 8080:80 --replicas 3 --name swarm_demo \--mount type=volume,src=myvolume,dst=/usr/share/nginx/html/ \pengyaohuang/swarm_nginx_demo:1
這里使用--mount進(jìn)行掛載數(shù)據(jù)卷。這里將容器/usr/share/nginx/html/目錄掛載到宿主機(jī)定義的myvolume目錄下。
查看數(shù)據(jù)卷信息,可以使用:
docker volume ls
通過volume模式掛載的數(shù)據(jù)卷,可以實(shí)現(xiàn)容器與宿主機(jī)間的數(shù)據(jù)持久化,但是無法實(shí)現(xiàn)群中各個(gè)節(jié)點(diǎn)的數(shù)據(jù)共享。
4.2、NFS
為了解決volume無法在各個(gè)節(jié)點(diǎn)中共享數(shù)據(jù)的問題,Swarm 集群中更常用的一種方式是,使用NFS(網(wǎng)絡(luò)文件系統(tǒng)來實(shí)現(xiàn)數(shù)據(jù)的共享與持久化。
NFS(網(wǎng)絡(luò)文件系統(tǒng))允許計(jì)算機(jī)之間通過TCP/IP 網(wǎng)絡(luò)共享資源。在NFS應(yīng)用中,NFS客戶端可以透明地讀寫遠(yuǎn)端NFS 服務(wù)器上的文件,就像訪問本地文件一樣。
系統(tǒng)結(jié)構(gòu)圖如下:
其中,NFS可被看成是 NFS 的服務(wù)器端,而 Docker 節(jié)點(diǎn)(master 節(jié)點(diǎn)、node1 節(jié)點(diǎn)、node2 節(jié)點(diǎn))則可以被看成是NFS的客戶端。因此,整個(gè)系統(tǒng)是 Client-Server 結(jié)構(gòu)。
為了方便進(jìn)行測試,可以將 master 節(jié)點(diǎn)作為 NFS Server。但在實(shí)際的環(huán)境中,一般可以單獨(dú)搭建一個(gè)節(jié)點(diǎn)作為NFS Server。
1)安裝NFS:
yum install -y nfs-utils
systemctl start nfs
2)master節(jié)點(diǎn)中編輯/etc/exports文件:
# 輸入以下配置信息
/nfs *(rw,sync,no_root_squash)
參數(shù)說明:
- /nfs:NFS共享目錄
- *:所有網(wǎng)段可以訪問主機(jī)網(wǎng)段
- rw:可讀寫權(quán)限
- sync:數(shù)據(jù)傳輸采用同步方式,async表示異步
- no_root_squash:NFS共享目錄屬性
3)master節(jié)點(diǎn)上創(chuàng)建/nfs目錄:
mkdir /nfs
# 重啟nfs節(jié)點(diǎn)
systemctl restart nfs
4)Node1節(jié)點(diǎn)上啟動(dòng)NFS客戶端:
systemctl start rpcbind
5)在Node1節(jié)點(diǎn)上掛載NFS目錄:
# 創(chuàng)建node1節(jié)點(diǎn)的目錄
mkdir /nfs-node1
# 將master節(jié)點(diǎn)的目錄/nfs掛載到node1節(jié)點(diǎn)的nfs-node1上
mount -t nfs 192.168.74.132:/nfs /nfs-node1
6)測試,node1目錄上新建一個(gè)文件:
Node1節(jié)點(diǎn)上:
master節(jié)點(diǎn)上:
可以看到文件已經(jīng)進(jìn)行了同步。
7)Swarm集群中創(chuàng)建服務(wù):
docker service create --replicas 3 --name swarm_demo -p 8080:80 \--mount 'type=volume,src=mynfsvol,dst=/usr/share/nginx/html,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=192.168.74.132:/nfs,"volume-opt=o=addr=192.168.74.132,vers=4,soft,timeo=180,bg,tcp,rw"' \pengyaohuang/swarm_nginx_demo:1
參數(shù)說明:
- type=volume:數(shù)據(jù)存儲(chǔ)類型
- src=mynfsvol:數(shù)據(jù)卷名稱
- dst=/usr/share/nginx/html:掛載到容器中的目錄
- volume-opt=type=nfs:數(shù)據(jù)卷的類型
- volume-opt=device=192.168.74.132:/nfs:掛載的 NFS 目錄
- volume-opt=o=addr=192.168.74.132: NFS 服務(wù)器的地址。
即可完成掛載。