Docker系列教程05-Docker數據卷(Data Volume)學習

引言

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

  • Volume

普通數據卷,映射到/var/lib/docekr/volumes目錄下。

  • bind mounts

綁定數據卷,映射到宿主機指定路徑下

  • tmpfs mounts

臨時卷,只存在於宿主機內存中

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

一、Volume的基本使用

1、創建數據卷

1、創建一個Volume
[root@qll251 ~]# docker volume create for_nginx
for_nginx

2、查看所有數據卷
[root@qll251 ~]# docker volume ls
DRIVER              VOLUME NAME
local               for_nginx

3、 查看指定數據卷詳細信息
[root@qll251 ~]# docker volume inspect for_nginx
查看數據卷詳細信息

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

2、掛載數據捲到容器

創建nginx容器,並掛載 for_nginx 數據卷

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

mount參數後面跟的是鍵值對。source指定宿主機源文件位置。target指定數據卷在容器中的掛載位置。

使用docker inspect查看容器掛載信息:

紅框標出的內容,相信您基本都能看懂,這裏擴展一個小知識點:RW: true,表示讀寫。如果希望數據卷對某個容器來說是隻讀的,可以通過添加readonly選項來實現,代碼示例如下:

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

3、修改nginx主頁內容

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

4、測試訪問nginx主頁

5、驗證數據卷的持久化

1、強制刪除nginx容器
[root@qll251 ~]# docker rm -f c2
c2

2、容器被刪除,數據卷仍然存在
[root@qll251 ~]# cd /var/lib/docker/volumes/for_nginx/
[root@qll251 for_nginx]# more _data/index.html
Hello world

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

6、清理卷

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

[root@qll251 ~]# docker volume rm for_nginx

二、bind mounts 的基本使用

1、 使用卷創建容器

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

[root@qll251 ~]# 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、進入容器

[root@qll251 ~]# docker exec -it 690 /bin/bash
root@690e77984393:/# cd /usr/share/nginx/html/
root@690e77984393:/usr/share/nginx/html# ls

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

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

三、tmpfs mounts 的使用

tmpfs mountfs,顧名思義 是一種非持久化的數據存儲。它僅僅將數據保存在宿主機的內存中,一旦容器停止運行,tmpfs mounts會被移除,從而造成數據丟失

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

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

2、在容器中寫入數據

[root@qll251 ~]# docker exec -it fa /bin/bash
root@fad68fbcdab5:/# cd /test
root@fad68fbcdab5:/test# echo 123123 > tmp.txt
root@fad68fbcdab5:/test# cat tmp.txt
123123

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

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

4、tmpfs mounts的使用場景

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

結語

歡迎來到『開源Linux』,這裏是 Linux 愛好者的聚集地。專注分享Linux/Unix相關內容(包括Linux運維、Linux系統開發、網絡編程、以及虛擬化和雲計算等技術乾貨)。風裏雨裏,我們在這裏等您,期待與您相遇。

 

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