Docker資料卷(Data Volume)學習

語言: CN / TW / HK

image.png

引言

在Docker中,容器的資料讀寫預設發生在容器的儲存層,當容器被刪除時其上的資料將會丟失。要想實現資料的持久化,需要將資料從宿主機掛載到容器中。目前Docker提供了三種方式將資料從宿主機掛載到容器中。

  • Volume

普通資料卷,對映到/var/lib/docekr/volumes目錄下。

  • bind mounts

繫結資料卷,對映到宿主機指定路徑下

  • tmpfs mounts

臨時卷,只存在於宿主機記憶體中

三種方式的示意圖如下所示:

image.png

一、Volume的基本使用

1、建立資料卷

``` 1、建立一個Volume [[email protected] ~]# docker volume create for_nginx for_nginx

2、檢視所有資料卷 [[email protected] ~]# docker volume ls DRIVER VOLUME NAME local for_nginx

3、 檢視指定資料卷詳細資訊 [[email protected] ~]# docker volume inspect for_nginx ```

檢視指定資料卷詳細資訊

可以看到我們建立的for_nginx卷,儲存在宿主機/var/lib/docekr/volumes/下;以後針對該Volume的寫操作都會儲存在/var/lib/docekr/volumes/for_nginx/_data下。

2、掛載資料捲到容器

建立nginx容器,並掛載 for_nginx 資料卷

[[email protected] ~]# docker run -itd -p 88:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx c2124dd81a36e7a798b95276215a59a63d4a5f7d34ccb2bc31889494304ade56

mount引數後面跟的是鍵值對。source指定宿主機原始檔位置。target指定資料卷在容器中的掛載位置。

使用docker inspect檢視容器掛載資訊:

image.png

紅框標出的內容,相信您基本都能看懂,這裡擴充套件一個小知識點:RW: true,表示讀寫。如果希望資料卷對某個容器來說是隻讀的,可以通過新增readonly選項來實現,程式碼示例如下:

docker run -itd --mount source=for_nginx,target=/test,readonly nginx

3、修改nginx主頁內容

[[email protected] ~]# cd /var/lib/docker/volumes/ [[email protected] volumes]# cd for_nginx/_data/ [[email protected] _data]# ls 50x.html index.html [[email protected] _data]# echo "Hello world" > index.html

4、測試訪問nginx主頁

5、驗證資料卷的持久化

1、強制刪除nginx容器[[email protected] ~]# docker rm -f c2 c2 2、容器被刪除,資料卷仍然存在[[email protected] ~]# cd /var/lib/docker/volumes/for_nginx/ [[email protected] for_nginx]# more _data/index.html Hello world

由此可以驗證,容器卷與容器的生命週期無關,在刪除容器時,docker不會自動刪除卷,即使用Volume可以實現資料的持久化儲存。

6、清理卷

如果不再使用本地容器卷,那麼可以手動清理掉

[[email protected] ~]# docker volume rm for_nginx`

二、bind mounts 的基本使用

1、 使用卷建立容器

執行一個nginx容器,並將宿主機/webapp目錄掛載至容器/usr/share/nginx/html目錄:

[[email protected] ~]# docker run -itd -p 81:80 --mount type=bind,source=/webapp,target=/usr/share/nginx/html nginx 690e779843933f735cf9044d7fd159a72ce6dcb833da61a010df58b0122b074e

上述命令等同於使用舊的-v引數,程式碼如下:

docker run -itd -p 81:80 -v /webapp:/usr/share/nginx/html nginx

2、驗證掛載情況

3、進入容器

[[email protected] ~]# docker exec -it 690 /bin/bash [email protected]:/# cd /usr/share/nginx/html/ [email protected]:/usr/share/nginx/html# ls

進入該容器,會發現容器該目錄本身存在的檔案消失不見了。原因如下:

如果你使用Bind mounts掛載宿主機目錄到一個容器中的非空目錄,那麼此容器中的非空目錄中的檔案會被隱藏,容器訪問這個目錄時能夠訪問到的檔案均來自於宿主機目錄。這也是Bind mounts模式和Volumes模式最大的不同

三、tmpfs mounts 的使用

tmpfs mountfs,顧名思義 是一種非持久化的資料儲存。它僅僅將資料儲存在宿主機的記憶體中,一旦容器停止執行,tmpfs mounts會被移除,從而造成資料丟失

1、執行一個容器,並指定臨時卷

[[email protected] ~]# docker run -itd --mount type=tmpfs,target=/test ubuntu:18.04 fad68fbcdab580fad03db7fa1e4f40c4e694fb8a30dc292af38dc3efd556b140 [[email protected] ~]#

2、在容器中寫入資料

[[email protected] ~]# docker exec -it fa /bin/bash [email protected]:/# cd /test [email protected]:/test# echo 123123 > tmp.txt [email protected]:/test# cat tmp.txt 123123

3、重啟容器,發現數據丟失

[[email protected] ~]# docker restart fa fa [[email protected] ~]# docker exec -it fa /bin/bash [email protected]:/# cd /test [email protected]:/test# cat tmp.txt cat: tmp.txt: No such file or directory

4、tmpfs mounts的使用場景

當因為安全或其他原因,不希望將資料持久化到容器或宿主機上,那麼可以使用tmpfs mounts模式。

文末

您的點贊收藏就是對我最大的鼓勵! 歡迎關注我的簡書,分享Android乾貨,交流Android技術。 對文章有何見解,或者有何技術問題,歡迎在評論區一起留言討論!