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