引言
在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系統開發、網絡編程、以及虛擬化和雲計算等技術乾貨)。風裏雨裏,我們在這裏等您,期待與您相遇。