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