DockOne技術分享(五十七):Docker容器對儲存的定義(Volume 與 Volume Plugin)
阿新 • • 發佈:2019-02-02
【編者的話】Docker技術自從誕生以來已經帶來了一場雲端計算的革命。其進展速度之快,接受程度之高讓人驚歎。國內已經有不少介紹Docker技術的文章,它的生態,網路,管理,構建,應用都有方方面面的資料。然而,要想在生產環境中部署Docker,開發運維人員必須還要明白docker容器是如何使用儲存(包括外部儲存),才能更好地為容器選擇合適的儲存方案。本次交流與大家分享Docker對儲存的定義的來龍去脈。
Docker技術自從誕生以來已經帶來了一場雲端計算的革命。其進展速度之快,接受程度之高讓人驚歎。國內已經有不少介紹Docker技術的文章,它的生態、網路、管理、構建、應用都有方方面面的資料。然而,要想在生產環境中部署Docker,開發運維人員必須還要明白Docker容器是如何使用儲存(包括外部儲存),才能更好地為容器選擇合適的儲存方案。本次交流與大家分享Docker對儲存的定義的來龍去脈。
我是一名老程式設計師了,今天給大家分享的是Docker容器和儲存系統系列的東西。分享之前要說的一點是:今天的分享是從一個技術人的角度出發的。
做產品和自用或者做專案服務是不一樣的。產品就是交付使用者後,對所發生的所有可能的情況基本都有比較明確的判斷,而作為技術人員,對將要遇到的問題和對問題考慮的角度都是不確定也不盡相同的。
- Docker的資料儲存組織形式是什麼?
- Docker目前的儲存生態圈各個公司的技術特點?
- Docker的出現對未來儲存後端要求會帶來哪些技術變革?
關於Docker儲存的介紹目前國內比較少,作為一名在儲存和雲端計算領域紮根多年的IT人,我希望能夠親自研究這些課題,拋磚引玉,分享討論。其中的觀點不一定都是正確的,但是希望能夠引起更多人的思考和共鳴。
Docker技術自從誕生以來已經帶來了一場雲端計算的革命。其進展速度之快,接受程度之高讓人驚歎。國內已經有不少介紹Docker技術的文章,它的生態,網路,管理,構建,應用都有方方面面的資料。然而,要想在生產環境中部署Docker,開發運維人員必須還要明白docker容器是如何使用儲存(包括外部儲存),才能更好地為容器選擇合適的儲存方案。本次交流與大家分享Docker對儲存的定義的來龍去脈。
一.Docker的整體資料儲存的方式
首先今天分享的是這個系列的第一節,即Docker的整體資料儲存的方式。要說明這個問題,我們可以先看看容器和VM的區別,看看他們對儲存有哪些不一樣的要求。容器和VM,幾乎所有人都會說容器就是一種比VM更輕更優的虛擬化技術。其實,我的理解不太一樣,我認為容器和VM最大的不同在於容器不是VM。這個,不是廢話麼。仔細分析一下,容器的重點其實不在虛擬化技術,它叫Container,並沒有Virtual這個詞。它的關注核心已經從冷冰冰的Machine,上升到了如何更好的去承載應用。這個是有本質區別的。VM關注的是如何讓Machine更加高效,VM發展的再厲害,它也是一種更高階的Machine。它看待後端儲存其實是和一個物理Machine看待後端儲存是一致的。而容器呢,它希望後端儲存對它來說是透明的,不用它關心的,它更加關心的是應用資料的組織形式。
下面這個表是我做的一些對比。
Docker並不推薦採用Root Image的儲存方式來儲存應用資料。因為應用資料對安全、可用性、共享、效能等方面的要求和Root Image的要求是完全不一樣的。Docker採用了Volume這樣一個獨立的資料訪問介面,應用通過Volume去訪問相關的資料,Volume的實現和CoW的分層檔案系統完全獨立。通過Volume Plugin機制可輕易驅動外部儲存。如Rancher Convoy或者Flocker這樣的儲存驅動去管理和訪問具體的儲存裝置。
二.為什麼需要Volume這樣的資料介面
為什麼我們需要Volume這樣的資料介面。我們要深刻理解的是Docker容器是承載應用的,是對應用環境的抽象而不是對OS執行環境的抽象。Docker容器天生設計就是為了應用的執行環境打包,啟動,遷移,彈性拓展,所以Docker容器一個最重要的特性就是disposable,是可以被丟棄處理,稍瞬即逝的。而應用訪問的重要資料可不是disposable的,這些重要資料需要持久化的儲存保持。Docker提出了Volume資料卷的概念就是來應對資料持久化的。如果把容器比喻成一個人,那麼這個人的重要資料(物質上的)就是他的財產(錢)。容器可以不存在了,但是資料必須還要存在。小瀋陽說,人生最大的痛苦就是人沒了,錢還在。容器會說,正相反,Docker最大的幸福就是,我不在了,資料還在。所以,定義好需要持久化的資料,採用Volume介面來儲存訪問是容器應用需要考慮的首要課題,必須引起高度的重視。我們可以想象一下容器和應用之間這樣一段對話。
容器:我稍瞬即逝,我稍瞬即逝,重要的事情說三遍,我稍瞬即逝。
應用:哦,這樣啊,那我的重要資料不能丟怎麼辦?
容器:請用Volume資料卷,請用Volume資料卷,重要的事情說三遍,請用Volume資料卷。
應用:&%#!,知道了,真囉嗦,你的前世一定是一臺復讀機,媽媽再也不用擔心你的學習了。
三.資料遷移
資料能夠持久化以後,應用容器遷移和資料共享就成為了可能。Volume介面可以說很大程度上講是容器遷移和資料共享的基礎元件。我們先談談遷移。假設一個人需要從一個城市搬到另外一個城市,如果讓他把所有的現金都打包帶到身上是不太現實的,也非常不安全。怎麼辦呢?很簡單,他去銀行開個賬戶,把錢存進去,到另外一個城市的分行取就可以了。容器遷移的道理是一樣的,因為資料都是儲存在Volume卷(銀行賬戶)裡的,所以容器在叢集的另外一個伺服器甚至雲端重新啟動的時候,只要掛載同樣的資料卷就可以了。當然,這些都需要資料卷後端有共享儲存,或者資料副本的支撐。容器應用遷移的核心其實是資料卷Volume遷移,(注:容器本身的遷移由映象庫Docker Registry主導) 這一部分涉及資料儲存,安全加密,網路傳輸,效能優化,快照備份等等的技術點,是容器管理的核心功能。Volume資料卷更是容器間共享資料的基礎,道理很簡單,資料是儲存在容器之外的,那麼容器間共享同樣一個數據卷就能共享資料。為此,Docker容器還專門推出了資料卷容器這種特殊的容器,只要一個數據卷容器來掛載Volume, 其他需要共享Volume的容器只需要很簡單的指明和這個資料卷容器共享Volume就可以了。有興趣的讀者可以自己查詢資料卷容器的資料。
為了更好的支援容器遷移和資料共享,Docker推出了Volume plugin介面機制,讓第三方的儲存廠商來支援Docker Volume並且在此基礎上進行功能拓展。下面這個表提供了Volume plugin的介面規範:
可以看到Volume plugin的介面規範是相當簡潔的。大部分的儲存和高階功能由和Volume plugin driver驅動的後端儲存提供。
Rancher Convoy:Convoy是Rancher Labs用go開發的支援Device Mapper、NFS、EBS、GlusterFS多種後端儲存的Docker Volume plugin driver. Convoy還提供了一個儲存拓展功能(如快照、備份恢復等)的介面框架。
Flocker:Flocker volume plugin driver主要用於多主機環境Docker資料卷的遷移,從而支援資料庫應用等stateful有狀態應用的主機間遷移。
四.Docker Volume框架
附送Docker Volume機制的圖,作為結束,如果對Docker Volume機制的實現感興趣的人多,下次可以搞個分享。Q&A
Q:Kubernetes中是否有Volume的處理模組,或者說Volume的重要性,以及前面提到的各種操作,在Kubernetes中是怎麼體現的?A:Kubernetes藉助Docker Volume實現一套自己的volume管理機制。Kubernetes的相關問題下一次再詳細說明。Q:請教下現在分散式儲存很多,Ceph、CFS等,哪個效能更好,更穩定,適合上生產?
A: Ceph、Glusterfs都有上生產環境成功的案例。 就運維成本來說Gluster更加簡單點。Ceph的運維成本較高。穩定性上Gluster因為設計更簡單,所以社群版本就已經穩定了。Q:Docker Volume 和Kubernetes volume/persistent volume比較, 有什麼異同?
A:Kubernetes藉助Docker Volume實現一套自己的Volume管理機制。Q:應用日誌管理收集是否適用Volume?有沒有什麼注意的地方?推薦的共享方式?不同應用是否-v到不同的地方?
A:容器如果需要持久的資料,使用Volume掛在到目標儲存上。注意日誌太多對系統資源的佔用。Q:想問下有沒有類似測試過,或者說你現在覺得效能比較好的一些方案?有沒有測試用例級資料?
A:儲存的效能是與實際的應用是相關聯的。我們開發適合容器的儲存。Q:一個儲存盤能共享掛載到多個容器嗎?
A:看後端儲存型別,如NFS、Glusterfs是支援儲存盤能共享掛載多個容器。Q:Rancher剛出,不知道它這個Convoy能單獨用麼,比如說安裝在Ubuntu?
A: Convoy與Rancher是獨立的,可以獨立安裝在Ubuntu。Q:請問有什麼靜態資源共享資料的方案,例如Web圖片?
A:OpenStack Swift、GlusterFS都可以。Q:Convoy或Flocker能支援rbd麼?
A:原生的Convoy目前不支援rbd。現在我們做Convoy支援rbd的功能。Q:不同主機上的容器能同時掛到一個共享儲存上嗎,最多能支援多少個?
A:共享儲存支援就可以,NFS、Glusterfs都可以支援。Q:Kubernetes和Docker Swarm兩個更看好誰,如果只能選一個的話?
A:看具體的應用場景,Kubernetes會越來越穩定。Swarm對容器的支援會越來越好。以上內容根據2016年4月28日晚微信群分享內容整理。分享人江鬆,有容雲聯合創始人兼研發副總裁。擁有16年的國內外企業級軟體基礎架構研發經驗,在企業級儲存,雲端計算解決方案方面有很深的技術造詣和行業理解。曾任美國AITech Ltd、愛爾蘭Raidtec Ltd高階系統架構師,存鋒科技Storwind創始人兼CEO。 DockOne每週都會組織定向的技術分享,歡迎感興趣的同學加微信:liyingjiesz,進群參與,您有想聽的話題或者想分享的話題都可以給我們留言。