docker儲存配置與管理

在睡觉24發表於2024-04-26

一、Docker儲存概念

1、容器本地儲存與Docke儲存驅動

容器本地儲存:每個容器都被自動分配了內部儲存,即容器本地儲存。採用的是聯合檔案系統。透過存
儲驅動進行管理。
容器本地儲存空間:分層結構構成,由一個可寫容器層和若干只讀的映象層組成。
聯合檔案系統:Docker的一種底層技術,由儲存驅動(Storage Driver)實現。相應的儲存驅動有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
儲存驅動:控制映象和容器在 docker 主機上的儲存和管理方式。
每個Docker主機只能選擇一種儲存驅動,不能為每個容器選擇不同的儲存驅動。

(1)檢視主機支援的儲存驅動

語法:docker info

點選檢視程式碼
 Storage Driver: overlay2 # 儲存驅動是overlay2
 Backing Filesystem: xfs # 底層檔案系統是xfs
 Supports d_type: true # 支援d_type
 Native Overlay Diff: true
 userxattr: false

(2)Linux發行版支援的儲存驅動

您的作業系統和核心可能不支援每個儲存驅動程式。
通常,以下配置適用於最新版本的Linux發行版:
image

(3)可支援的檔案系統

關於Docker,備份檔案系統是/var/lib/doker/所在的檔案系統。某些儲存驅動程式僅適用於特定的備份檔案系統。
image

(4)更改現有的儲存驅動

注意:

主機只能選擇一個儲存驅動。
系統版本和儲存驅動的相容問題。
更改儲存驅動會使得現有的容器和映象不可訪問(原因:每種儲存驅動儲存映象層的
位置是不同的)
但恢復儲存驅動,可以再次訪問之前的映象和容器

2、容器和非持久化資料

非持久化資料:不需要儲存的資料。容器本地儲存中的資料屬於非持久化資料。
容器建立時會建立非持久化儲存,非持久化儲存自動建立,從屬於容器,生命週期與容器相同。刪除容器也會刪除全部非持久化資料。
非持久化資料存在問題:

  1. 這類資料從屬於容器,生命週期與容器相同,會隨著容器的刪除而被刪除.(易丟失)
  2. 當該容器不再執行時,資料不會持久儲存,如果另一個程序需要,則可能很難從該
    容器中獲取資料。(難獲取)
  3. 容器的可寫層與執行容器的Docker主機緊密耦合,無法輕鬆地將資料轉移到其他位
    置。(難轉移)
  4. 寫入容器的可寫層需要Docker儲存驅動管理檔案系統。儲存驅動使用Linux核心提供的聯合檔案系統,其效能不如直接寫入主機檔案系統的Docker卷。(讀寫效能差)

3、容器和持久化資料

持久化資料:需要儲存的資料。例如:日誌、業務資料、客戶資訊等有用的資料。
外部儲存:Docker透過將主機中的檔案系統掛載到容器中供容器存取,從而實現持久化資料儲存。
容器持久化資料儲存方式:Docker目前支援卷、繫結掛載,這兩種掛載型別實現容器的持久化。
卷(資料卷):Docker中進行持久化資料儲存的最佳方式。本質是Docker主機檔案系統中的目錄或檔案直接掛載到容器的檔案系統中。
特點:

1.卷和容器是解耦的,可以獨立地建立並管理卷
2.卷不與容器的生命週期繫結(容器的停止刪除和卷無關)
3.可以將任意數量的卷裝入容器,多個容器也可以共享一個或多個卷(多對多關係)

4、掛載型別

往容器中掛載的外部檔案系統主要有:卷、繫結掛載、tmpfs掛載。無論哪種掛載,對容器內部來說是一樣的,都會顯示為檔案或目錄。

(1)卷

卷是Docker持久化儲存資料的最佳方式。卷支援使用卷驅動,可以讓使用者將資料儲存在遠端主機或雲提供商處等。

卷儲存在主機檔案系統中由Docker管理的位置,在Linux主機上該位置預設是
/var/lib/docker/volumes 目錄。

可以以命名方式或匿名方式掛載卷:

  1. 匿名卷(Anonymous Volumes):首次掛載容器未指定名稱,Docker為其隨機指定一個唯一名稱。
  2. 命名卷(Named Volumes):指定明確名稱,和匿名卷其他特性相同。

卷適合以下應用場景:

  1. 在多個正在執行的容器之間共享資料。(資料共享)
  2. 當Docker主機不能保證具有特定目錄結構時,卷有助於將Docker主機的配置與容器執行時解耦。(構建新目錄與主機不同)
  3. 當需要將容器的資料儲存到遠端主機或雲提供商處,而不是本地時。(可以遠端掛載卷,公有云、災備等場景)
  4. 當需要在兩個Docker主機之間備份、恢復或遷移資料時。(主機間備份遷移)

(2)繫結掛載

繫結掛載可以儲存到主機系統的任意位置,甚至會儲存到一些重要的系統檔案或目錄中。
特點:

  1. 主機上程序或容器可以隨時修改。
  2. 相比卷,功能更受限、效能更高。
  3. 繫結掛載執行訪問敏感檔案。

繫結掛載適合以下應用場景。

  1. 在主機和容器之間共享配置檔案。
  2. 在Docker主機上的開發環境和容器之間共享原始碼或構建工件。
  3. 當Docker主機上的目錄結構保證與容器要求的繫結掛載一致時。

(3)tmpfs掛載

tmpfs掛載僅限於執行Linux作業系統的Docker主機使用,它只儲存在主機的記憶體中,不會被寫到主機的檔案系統中,因此不能持久儲存容器的應用資料。

在不需要將資料持久儲存到主機或容器中時,tmpfs掛載最合適。

如果容器產生了非持久化資料,那麼可以考慮使用tmpfs掛載避免將資料永久儲存到任何位置,並且透過避免寫入容器的可寫層來提高容器的效能。

二、Docker卷管理

docker volume 是Docker卷的管理命令。

建立卷的時候主機上的Docker根目錄(linux預設是/var/lib/docker)下的volumes子目錄內會生成一個以卷名命名的子目錄,這個子目錄裡面再建立一個_data的子目錄作為卷的資料儲存路徑。卷名必須唯一,不同的卷驅動不能使用相同的卷名。

1、建立卷

語法:docker volume create 卷名
選項:
-d //說明卷驅動名稱(預設是'local') --label list //設定卷後設資料
-o //設定驅動特殊選項
案例1:建立tmpfs卷,大小100m,uid為1000
image
案例2:建立匿名卷
語法:ddocker volume create

2、檢視卷列表

使用 docker volume ls 命令列出當前的卷。

3、檢視卷詳細資訊

使用 docker volume inspect 命令檢視卷詳細資訊。包含卷在Docker主機檔案系統中的具體位置。

4、刪除卷

使用 docker volume rm 刪除指定卷(不能刪除正在被容器使用的卷)。
使用 docker volume prune 刪除未被容器或服務使用的所有卷。
使用 dicker volume rm 刪除未被使用的卷

語法:docker volume rm 卷名 //刪除指定卷
選項: -f //強制刪除

三、容器檔案系統掛載

使用 docker run 或 docker create 命令的相關選項將外部的檔案系統掛載到容器中。
早期版本:

  1. 卷和繫結掛載都可以透過 -v 和 --mount 選項掛載到容器中,主要是兩者的語法的細微區別。
  2. -v 用於獨立容器, --mount 用於叢集服務。
  3. tmpfs掛載可以使用 --tmpfs 選項。

docker 17.06或更高版本:

  1. 建議所有的容器或服務,繫結掛載、卷、tmpfs都使用 --mount 選項。(語法清晰、定製詳細)
  2. --mount 選項也可以用於獨立容器。

-v 和 --mount 的區別:

  1. -v 語法是將選項組合在一個欄位中, --mount 的語法是將它們分開。
  2. --mount 採用鍵值對寫法支援更多的設定選項, -v 寫法更加簡潔。

1、-v(--volume)選項

[root@hqs ~]# docker run(create)
-v, --volume=[host-src:]container-dest[:]: Bind mount a volume.

第一個host-src欄位表示掛載源,來自主機的檔案系統,為絕對路徑或名稱變數。
第二個container-dest欄位表示掛載目標,即容器的掛載點,可以是目錄或檔案路徑(絕對路徑)
第三個options欄位可選,以逗號分隔選項列表:
如:[rw|ro], [z|Z], [[r]shared|[r]slave|[r]p
rw:讀寫模式??
ro:只讀模式
nocopy:禁止自動複製到卷儲存地址

相關文章