存儲在容器中是如何工作的
將應用程序運行在容器中已經成為一種趨勢,但是容器的概念并不是才有的。容器的起源實際可以追溯到大型機,這項技術在最近逐漸成熟,并以驚人的速度獲得用戶的興趣和接受。
容器被設計成運行在操作系統之上的虛擬實例,它包含了應用程序在用戶空間(user space)所需的所有內容。同時,容器提供一定的隔離性,使得運行在同一個操作系統之上的容器看起來是獨立的,并且擁有整個操作系統。這種隔離還支持容器和外接交互。
目前有少數針對容器的備份軟件,有沒有一種方法能夠使用任何備份軟件來備份容器呢?
為了實現寫時復制(copy-on-write),容器會使用一種名為疊加(overlay)文件系統的特性。即需要對根鏡像進行修改時,容器會利用這一特性,將變更內容寫入到獨立區域并“覆蓋”原有內容。這種修改通常都是瞬時的,也就是說,通常情況下,當容器刪除時,這些修改也將不復存在。因此,容器默認是沒有永久存儲的。
為了解決存儲問題,像Docker這樣的工具,提供了兩個新的特性來獲得更加持久化的存儲:Docker卷和數據容器。
Docker卷允許將數據保存在容器的啟動卷之外。容器可以在啟動時,通過“-v”開關掛載多個獨立的數據卷。該參數會在Docker的配置目錄(/var/lib/docker)中創建一個實體,配置內容會保存在/var/lib /docker/volumes目錄中。每個子目錄由卷的UUID(universally unique identifier)命名,其中包含該卷的配置,如卷ID、路徑、讀寫權限等。卷的數據內容存儲在/var/lib/docker/vfs/dir目錄中,同樣由卷的UUID命名。
卷中的數據可以在主機上進行讀寫,并且有著標準的文件權限。然而,使用卷的方式,有其優點和缺點。優點是由于采用標準文件系統,對容器的數據的備份、復制、移動等操作,可以在主機操作系統上完成。缺點是卷的名字使用了UUID,并且和容器ID關聯,導致卷路徑很難和容器名稱關聯起來。目前,Docker提供了docker cp
命令,可以將文件在主機和容器之前復制。
通過掛載外部卷的方式,還可以將存儲放到NFS(Network File System)或者LUN(Logical Unit Number)上,這樣可以方便的對容器數據進行備份。
另一種方式是采用數據容器。數據容器像Docker內部的NFS服務器一樣,可以通過“--volumes-from”開關在容器啟動時設置關聯的數據容器。使用這種方式的優點是將應用數據獨立抽取出來,而不必關心它實際存放的位置。
當然,使用卷和數據容器,可能會遇到一些問題:
- 孤立的存儲:當前一般容器默認的設置是容器刪除之后保留容器使用過的存儲。這樣可能會導致一些卷已經沒有容器引用,但是要刪除它們成本又非常高,需要遍歷主機上所有容器的配置,確保沒有容器還在使用才能執行刪除。
- 數據安全:掛載的卷除了操作系統本身的文件權限控制,沒有其他安全措施。這些文件可能會被主機上的進程修改,同時容器中的進程訪問共享文件,也需要按照主機上的文件權限設置進行配置(如用戶和組信息)。
- 數據完整性:共享數據在數據完整性上無法保證,容器中的應用程序需要自己控制。同時數據備份需要容器或者主機上的應用程序來完成。 </ul>
最后,容器存儲上還有一個問題,就是不同主機上容器之間的存儲無法共享。即目前容器可以使用外部存儲,但是無法使用在其他主機上的數據容器。目前,ClusterHQ公司開發了flocker,試圖解決這一問題。也希望Docker官方能夠在存儲管理上提供分布式解決方案。
來自:http://www.infoq.com/cn/news/2015/10/user-space