docker容器實現數據持久化的兩種方式及其區別

前言

這篇博文是我對docker實現數據持久化幾種方式的特徵進行一個總結。

在docker中,它的存儲文件系統是在dockerhost上原有的xfs或ext4架設了一層文件系統:overlay2(將此行重點標註的原因就是我在面試中被問到過:docker使用的是什麼文件系統?),通過docker info命令可以查看出主機上docker相關的信息,包括支持的網絡類型、系統版本、內核版本、docker主機的cpu、內存等信息。如下:

docker容器實現數據持久化的兩種方式及其區別

在docker中實現數據持久化有兩種方式:Bind mount和Docker Manager Volume。

Bind mount和Docker Manager Volume的區別:

  • Bind mount數據持久化的方式,如果是掛載本地的一個目錄,則容器內對應的目錄下的內容會被本地的目錄覆蓋掉,而Docker Manager Volume這種方式則不會,不管哪種方式的持久化,在容器被銷燬後,本地的數據都不會丟失。
  • 使用“-v”選項掛載時,Bind mount明確指定了要掛載docker host本地的某個目錄到容器中,而Docker Manager Volume則只指定了要對容器內的某個目錄進行掛載,而掛載的是docker host本地的哪個目錄,則是由docker來管理的。

數據持久化的特點:

  • Data Volume是目錄或文件,不能是沒有格式化的磁盤(塊設備)。
  • 若要掛載一個文件到容器中,那麼該文件必須是已經存在,否則,會被當成一個目錄掛載到容器中。
  • 默認掛載到容器內的文件或目錄,容器是有讀寫權限。可以在運行容器時-v指定完掛載目錄後面加“:ro” 限制容器的寫入權限(:ro來限制)。
  • volume數據可以永久保存,即使使用它的容器已經被銷燬。

1、Bind mount——數據卷容器:--volumes-from方式實現數據持久化

以下數據卷容器掛載的方式就是Bind mount實現方式。

實現的大概思路如下:

  1. 運行一個容器作爲數據卷容器,掛載本地目錄到容器內的本地目錄,無需所掛載的源目錄或目標掛載點是否存在,docker會自動創建相應的目錄的,也無需考慮使用哪個鏡像來運行這個容器,任意鏡像都可以;
  2. 之後無論運行多少容器,都可以使用--volumes-from選項來指定第一個運行的容器進行數據持久化;
  3. 實現的效果爲:掛載數據卷容器實現數據持久化的容器,會自動將數據卷容器掛載的本地目錄掛載到該容器本身(本身的掛載點與數據卷容器的掛載點自動保持一致),也僅僅只會掛載數據卷容器實現了數據持久化的目錄到自己本身,而不是數據卷容器的全部目錄。

上面實現的效果可能我表達的不夠好,舉個例子 :
有A、B、C這三個容器,其中A作爲數據卷容器,掛載了本地的/data/web01和/data/web02這兩個目錄到容器內的/usr/share/nginx/html/和/data這兩個目錄。
容器B和容器C在運行之初,通過--volumes-from選項來指定容器A的名稱或ID,那麼最終實現的效果就是,A、B、C這三個容器內都會存在/usr/share/nginx/html及/data這兩個目錄,並且是實現了數據持久化的,對應的本地目錄都是/data/web01和/data/web02。

#基於busybox鏡像來做數據卷容器
[root@docker ~]# docker run -tid --name data -v /data/web01/:/dbdata -v /data/web02:/index busybox
#運行兩個nginx容器
[root@docker ~]# docker run -d --name web01 --volumes-from data -P nginx
[root@docker ~]# docker run -d --name web02 --volumes-from data -P nginx

當容器運行成功後,通過命令docker inspect 容器名稱來查看容器的掛載信息(在查看出來的信息中找到mount字段):

1)數據卷容器data查看到的mount信息如下:

[root@docker ~]# docker inspect data

docker容器實現數據持久化的兩種方式及其區別

2)容器web01查看到的mount信息如下:

[root@docker ~]# docker inspect web01

docker容器實現數據持久化的兩種方式及其區別

3)容器web02查看到的mount信息如下:

[root@docker ~]# docker inspect web02

docker容器實現數據持久化的兩種方式及其區別

不難發現,採用數據卷容器這種方式可以讓多個容器掛載相同的目錄,讓其要實現數據持久化的目錄保持一致。

在需要運行的容器都運行完成後,--volumes-from指定的容器,停止或被刪除,都不會影響基於nginx鏡像運行的容器數據持久化。

數據卷容器使用場景:

  • 多個容器需要實現數據持久化的目錄是一致的,可以採用這種方式。
  • 如果不使用這種方式,並且還要對多個目錄實現數據持久化,那麼每運行個容器都要指定很多"-v"選項來指定目錄,並且出現指定錯誤的機率比較大。

2、Docker Manager Volume實現數據持久化

#運行容器時,-v選項只指定一個路徑,則就是容器內的目錄,也就是Docker Manager Volume方式
[root@docker ~]# docker run -tid -v /usr/share/nginx/html -P --name web03 nginx
[root@docker ~]# docker inspect web03   #查看容器的mount字段信息

返回的信息如下:

docker容器實現數據持久化的兩種方式及其區別

可以看到,它是掛載的本地一個目錄,這個目錄看起來比較雜亂無章,其實不然,它是docker 的root根目錄,在其根目錄下有一個volume目錄,這個目錄就是用來存放Docker Manager Volume實現數據持久化產生的數據的,在volume目錄下會有以容器ID命名的目錄,然後下面會有_data這個目錄,這個目錄就是和容器內的數據持久化目錄遙相對應的。建議瞭解一下docker 的根目錄下都有哪些東西,面試的時候我被問到過。根目錄下的部分信息如下:

docker容器實現數據持久化的兩種方式及其區別

———————— 本文至此結束,感謝閱讀 ————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章