Docker管理應用資料

廢物大師兄發表於2019-05-21

1.  Manage data in Docker

預設情況下,所有在容器內部建立的檔案被儲存在一個可寫的容器層。這就意味著:

  • 當容器不存在的時候,資料不能被持久化,而且在容器外部想要讀取這些資料十分困難。
  • 容器的可寫的層與執行容器的主機密切相關。你不能輕易地移動資料。
  • 要想把資料寫到容器的可寫層,需要一個儲存驅動來管理檔案系統。儲存驅動提供一個檔案系統供Linux核心呼叫。

Docker有兩種方式將容器中的檔案儲存到主機上,這樣的話即使容器停止了,檔案依然被持久化下來。這兩種方式分別是:volumesbind mounts。如果你是在Linux上執行Docker,那麼你還可以使用tmpfs mount

2.  選擇正確的掛載型別

無論你選擇哪種掛載型別,資料看起來是一樣的。它以目錄或者容器的檔案系統中的單個檔案的形式暴露出來。

下面這幅圖可以幫助我們更好的理解 volumesbind mountstmpfs mounts 三者的區別

  • Volumes 儲存在由Docker管理的主機檔案系統的一部分中(在Linux中是 /var/lib/docker/volumes/ )。非Docker程式不應該去修改這部分檔案系統。Volumes是在Docker上持久化資料最好的方式。
  • Bind mounts 資料可以被儲存在主機的任何地方。它們甚至可能是重要的系統檔案或目錄。Docker主機或Docker容器上的非Docker程式可以隨時修改它們。
  • tmpfs mounts 資料只會被儲存到主機的記憶體中,而且從來不會寫到檔案系統上。

3.  關於掛載型別

Volumes

Volumes由Docker建立並管理。你可以用docker volume create命令顯式地建立一個volume,或者在容器或服務建立的時候建立一個volume。

當你建立了一個volume以後,它被儲存到Docker主機上的一個目錄下。當你掛載這個volume到一個容器的時候,這個目錄就是掛載到容器中的目錄。這種方式跟bind mounts很像,除了volumes被Docker管理並與主機的核心功能隔離以外。

一個volume可以同時掛載到多個容器中。當沒有一個執行中的容器使用這個volume的時候,這個volume仍然是可用的,並且不會被自動刪除。你可以用docker volume prune命令刪除未使用的volumes。

當你掛載一個volume的時候,它可能是被命名的或者匿名的。匿名的volumes在它首次被掛載到一個容器中的時候不會被指定一個明確的名字,因此Docker給它們一個隨機的名字,以保證它在Docker主機中是唯一的。關於名字,命名的和匿名的volumes在使用上是一樣的。

Volumes也支援volume驅動,可以執行你儲存資料到遠端主機或雲上。

Bind mounts

volumes相比,bind mounts有一些功能限制。當你使用bind mount的時候,主機上的一個檔案或目錄被掛載到一個容器。這個檔案或目錄關聯主機上的絕對路徑。這個檔案或目錄不需要事先在Docker主機上存在,如果沒有則會自動在後臺建立。Bind mounts的效能非常好,但它依賴於主機的檔案系統上有一個特定的目錄結構可用。如果你正在開發一個新的Docker應用,建議用volumes。你不能直接用Docker命令來直接管理bind mounts

tmpfs mounts

一個tmpfs掛載不會持久化資料到磁碟,無論是在Docker主機上還是在容器中。容器可以在容器的生命週期中使用它來儲存非永續性狀態或敏感資訊。例如,在內部,群集服務使用tmpfs掛載來將祕鑰掛載到服務的容器中。

4.  volumes最佳實踐

Volumes是在Docker容器和服務中儲存資料的首選方式。使用volumes的一些場景:

  • 在多個執行的容器之間共享資料。如果你沒有顯式地建立一個volume,那麼在它首次被掛載到一個容器中的時候會被自動建立。當容器停止或被刪除以後,這個volume仍然存在。多個容器可以掛載同一個volume,可以是讀寫或只讀的。只有當你顯式地刪除volumes的時候它們才會被刪除。
  • Docker主機不保證有一個給定的目錄或檔案結構。Volumes解耦從容器執行時到Docker主機之間的配置。
  • 當你想要儲存你的容器的資料到一個遠端主機或雲上,而不是本地
  • 當你需要備份、恢復,或者將資料從一個Docker主機移動到另一個Docker主機的時候,volumes是最好的選擇。你可以停止正在使用這個volume的容器,然後備份這個volume的目錄(例如:/var/lib/docker/volumes/<volume-name>)

5.  bind mounts最佳實踐

一般而言,你應該儘可能地用volumesBind mounts適用於下列情形:

  • 在主機和容器之間共享配置。預設情況下,通過掛載/etc/resolv.conf到每個容器上,Docker提供DNS解析到容器。
  • 在Docker主機和容器之間開發環境共享原始碼和構建artifacts。例如,你可能掛載一個Maven的target/目錄到一個容器,並且每次你在Docker主機上構建Maven工程的時候,這個容器可以獲得構建後的artifacts。
  • 當保證Docker主機的檔案或目錄結構與容器所需的bind mounts一致時。

6.  tmpfs mounts最佳實踐

當你不想要資料持久化到主機或容器的時候,tmps mounts是最好的選擇。這可能是出於安全原因,或者是為了在應用程式需要編寫大量非永續性狀態資料時保護容器的效能。

7.  文件

https://docs.docker.com/storage/

https://docs.docker.com/storage/volumes/

 

相關文章