若是你用過Docker你就會知道,共享卷和跨主機的數據訪問是個很是棘手的問題。雖然Docker的生態系統在逐漸走向成熟,但對大多數人來講,在不一樣環境中實現持久化存儲仍是很麻煩的。幸運的是,Rancher一直在研究這件事,而且想出了一個能獨特的、能解決大部分這個問題的方案。用共享存儲運行數據庫的方法仍沒有被普遍推薦,但對於許多其餘的狀況,跨主機共享卷卻是一個很好的作法。git
這個指南中的大部份內容是受Rancher的一個線上Meetup的啓發。另外,若是你想本身從頭開始搭建Convoy-NFS,這個網頁上有一些有關NFS配置的信息,你也許能做爲參考:https://github.com/rancher/ra...。github
若是你之前沒有據說過Rancher的Convoy項目,我如今能夠先簡單介紹一下。Rancher但願能夠經過Convoy項目讓持久化容量存儲變得簡單方便。Convoy是一個很是棒的磁盤插件,由於它爲用戶提供了多種不一樣的選擇。例如EBS卷和S3的支持,與VFS/NFS一塊兒,爲用戶提供了一些用於配置共享存儲的厲害而且靈活的選擇。docker
這裏有一個小祕訣,教你怎樣啓動一個能和Convoy-NFS服務鏈接起來的Docker化的NFS服務器。Docker-NFS基本上是一個窮人的EFS。若是你想運行它,你必須有足夠的信心,相信服務器不會被毀,或相信你的數據無足輕重,即便丟失了也無所謂。你能夠在這裏找到更多我過去使用的Docker NFS服務器的信息。數據庫
給點進階些的提議,我會建議你看看這個叫作彈性文件存儲或簡稱EFS的東西,它是 NFS的AWS實現。這個解決方案更簡單粗暴,它是一個隨時可用於生產的NFS服務器,你能夠把它視爲Convoy-NFS的後端。構建EFS是很簡單的,不過它超出了這篇文章的討論範圍。你能夠在這個連接中看看如何構建和配置EFS。ubuntu
警告:由於EFS是AWS的一個較新的服務,它只能在有限的幾個位置上使用。(不過更多的可以使用位置也很快會出現)。後端
下面就是對於Docker-NFS服務器來講,你的docker-compose.yml 可能的樣子:bash
docker-nfs: image: cpuguy83/nfs-server privileged: true volumes: - /exports command: - /exports
在採用這個容器化的NFS服務器的方法時你可能會碰到的一個疑難雜症是,你的主機要麼沒有安裝NFS內核模塊,要麼沒有打開伴隨的服務。服務器
在Ubuntu上很容易安裝內核模塊,SSH到主機上, 運行NFS Server容器以及如下命令:tcp
sudo apt-get install nfs-kernel-server
在CoreOS上,模塊是安裝了的,只是沒有打開。要啓用NFS,你須要SSH到對應主機上,運行NFS Server容器,並運行下面的命令:測試
sudo systemctl start rpc-mountd
配置EFS是很容易的。用上面提到過的連接,你能夠了解到建立一個能與Convoy鏈接的EFS卷的所有步驟。EFS共享卷既能夠簡單配置成IP訪問,也能夠深刻地配置成經過DNS域名訪問。
在Rancher的社區應用服務目錄裏有一個新的目錄入口,有了它,你能夠直接經過Convoy使用EFS卷,這能簡化某些配置。使用應用服務目錄入口仍須要你先建立EFS share,但配置Convoy來與其鏈接的過程會簡單不少。只須要從AWS裏複製出EFS ID,選擇其中你已建立共享的區域,而後指定要將EFS share安裝到本地的位置。「/efs」就是一個很好的在最開始測試東西的例子:
目前,Rancher還提供另一種名叫「Convoy-NFS」的應用服務目錄項,來將容器鏈接到NFS Server上:
安裝程序是很是簡單的,但也有幾件事情要注意。首先,堆棧必須命名爲「Convoy-NFS」,這是插件的名稱。其次,NFS Server應該和在其上設置NFS Server的主機名相匹配。若是你建立的是Docker-NFS容器,記得使用容器的IP(爲了寫這篇文章,我用了一個測試環境,於是只用了Rancher容器內部IP來部署NFS Server)。當你用EFS建立你的NFS share時,使用已配置的DNS的名稱。
最後一點要注意的是安裝選項和安裝點。這裏的端口須要與將NFS Server 和(2049 for docker-nfs)配置在一塊兒的端口相匹配,而且確保你打開了nfsver=4。另外,若是你要使用nfsvers=4選項,記得必定爲MountDirectory用「/」。不使用nfsvers=4選項的話就用「/exports」。
最終一步的配置和下面看上去差很少:
proto=tcp,port=2049,nfsvers=4
你能夠添加其餘選項來調整共享,但這些都是最低限度的構建所必需的組件。
給Rancher幾分鐘時間提供Convoy-NFS容器。一切完成後你就能夠建立和攻擊NFS捲了。最快的檢查是否一切正常的方法,是點擊Infrastructure -> Storage Pools選項。若是你在視圖中看見了主機,那你就能夠開始準備建立和分享捲了。
如今你能夠開始從Storage Pools視圖中手動建立一個卷,或乾脆建立一個使用Convoy-NFS driver和卷名的服務。
我將建立一個測試容器,它可跨越兩個主機共享相同的「test_volume」以及數據,以下圖所示(我在本地使用了rancher-compose來堆棧,若是你以爲使用GUI更容易的話敬請使用GUI)。
test: image: ubuntu volume_driver: convoy-nfs tty: true volumes: - test_volume:/data command: - bash
一個新的卷會在Storage Pools頁面上彈出來:
若是你想驗證是否一切運行正常,你能夠將容器的數量擴展到兩個或更多個。而後exec到一個容器中,在其中建立一個文件,看你可否從另外一個容器中讀取這個文件,並且最好是在一個不一樣的主機上。若是這些都沒問題,你應該已經成功了:
在第一個容器中,咱們能夠編寫出文件:
在第二個容器中,咱們能夠從新讀取它,檢測一下共享存儲是否運行正常:
隨着Convoy不斷的發展和壯大,咱們會看到更多的部署的選擇。如今,NFS是穩定的,能正常工做的。若是你已經在使用AWS了,EFS會讓一切都變得更加容易。我很是期待看到Convoy和Rancher中的共享卷會有什麼下一步的發展。