若是Docker Swarm集羣中運行了mysql、nginx等服務,這些服務的數據若是沒有掛載到宿主機中,那麼容器一旦中止運行,那就意味着數據丟失。html
有什麼方法能夠解決swarm集羣中運行的服務可以數據持久化呢?咱們能夠經過volme、nfs等方法來實現swarm集羣應用數據持久化,其實也和docker數據持久化的形式是同樣的。node
能夠用兩種方式來實現:mysql
volume 默認模式:工做節點宿主機數據同步到容器內。nginx
volume NFS 共享存儲模式:管理節點宿主同步到工做節點宿主,工做節點宿主同步到容器。sql
1、經過volume實現數據持久化 docker
注意:這種方式各個節點的數據不能共享。 安全
卷是繞過聯合文件系統的一個或多個容器內的特定目錄。 卷被設計爲保持數據,與容器的生命週期無關。 所以,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
2、經過NFS實現數據持久化
NFS(Network File System)即網絡文件系統,它容許網絡中的計算機之間經過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用能夠透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件同樣。
爲了方便咱們進行測試,單獨準備一臺機器做爲NFS的服務器:node3。接下來,咱們就須要安裝NFS了。
一、全部節點安裝NFS
yum -y install nfs-utils
二、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
三、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/
四、基於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
參數說明:
五、驗證明驗環境
在Manager節點上,查看服務和數據卷目錄
docker service ls
docker volume ls
查看node1數據卷目錄
docker volume ls
查看node2數據卷目錄
docker volume ls
在任意一個節點上,進入數據卷共享目錄修改a.html