存儲在容器中是如何工作的

jopen 9年前發布 | 5K 次閱讀 容器

將應用程序運行在容器中已經成為一種趨勢,但是容器的概念并不是才有的。容器的起源實際可以追溯到大型機,這項技術在最近逐漸成熟,并以驚人的速度獲得用戶的興趣和接受。

容器被設計成運行在操作系統之上的虛擬實例,它包含了應用程序在用戶空間(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

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!