如果Docker Swarm集羣中運行了mysql、nginx等服務,這些服務的數據如果沒有掛載到宿主機中,那麼容器一旦停止運行,那就意味着數據丟失。
有什麼方法可以解決swarm集羣中運行的服務能夠數據持久化呢?我們可以通過volme、nfs等方法來實現swarm集羣應用數據持久化,其實也和docker數據持久化的形式是一樣的。
可以用兩種方式來實現:
volume 默認模式:工作節點宿主機數據同步到容器內。
volume NFS 共享存儲模式:管理節點宿主同步到工作節點宿主,工作節點宿主同步到容器。
一、通過volume實現數據持久化
注意:這種方式各個節點的數據不能共享。
卷是繞過聯合文件系統的一個或多個容器內的特定目錄。 卷被設計爲保持數據,與容器的生命週期無關。 因此,Docker在刪除容器時不會自動刪除卷,也不會“垃圾收集”不再由容器引用的卷。 也稱爲:數據卷。
使用的語法格式如下:
使用案例:
在Swarm上部署服務,同時指定相應的數據卷
docker service create -p 7788:80 --replicas 3 --name myswarmtest \ --mount type=volume,src=myvolumn,dst=/usr/share/nginx/html/ collenzhao/mynginx:v1
查看數據卷
docker volume ls
查看數據卷掛載的目錄
docker volume inspect myvolumn
二、通過NFS實現數據持久化
NFS(Network File System)即網絡文件系統,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。
爲了方便我們進行測試,單獨準備一臺機器作爲NFS的服務器:node3。接下來,我們就需要安裝NFS了。
1、所有節點安裝NFS
yum -y install nfs-utils
2、NFS服務器端的部署
開啓NFS服務
systemctl enable nfs systemctl start nfs
創建NFS目錄
mkdir /nfs
編輯NFS配置文件
vi /etc/exports 輸入以下內容: /nfs *(rw,sync,no_root_squash) 參數說明: /nfs : 共享的目錄 * : 可以訪問的主機網段,星號表示所有網段。 rw : 可讀寫權限,只讀權限ro sync : 同步,數據更安全,速度慢 async : 異步,速度快,效率高,安全性低 no_root_squash :NFS 服務共享的目錄的屬性, 如果用戶是root, 對這個目錄就有root的權限
重啓NFS
systemctl restart nfs
3、NFS客戶端的部署
啓動NFS客戶端
systemctl start rpcbind
測試掛載nfs共享目錄
mount -t nfs 192.168.15.140:/nfs /mynfs 其中:192.168.15.140爲node3(NFS服務器的地址)
在文件/mynfs/a.txt 輸入一些內容,在nfs服務器端查看是否能夠看到剛纔輸入的內容。也可以通過下面的語句卸載NFS目錄。
umount /mynfs/
4、基於NFS共享目錄,創建Swarm集羣服務
docker service create \ --replicas 3 \ --name my-nginx \ -p 7788:80 \ --mount 'type=volume,src=my-nfs-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-nocopy=true,volume-opt=type=nfs,volume-opt=device=192.168.15.140:/nfs,"volume-opt=o=addr=192.168.15.140,vers=4,soft,timeo=180,bg,tcp,rw"' \ collenzhao/mynginx:v1
參數說明:
5、驗證實驗環境
在Manager節點上,查看服務和數據卷目錄
docker service ls
docker volume ls
查看node1數據卷目錄
docker volume ls
查看node2數據卷目錄
docker volume ls
在任意一個節點上,進入數據卷共享目錄修改a.html