Docker容器中数据两种持久化存储方式:卷和挂载宿主目录
鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像為基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個為容器運行時讀寫而準備的存儲層為容器存儲層。容器存儲層的生存周期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存于容器存儲層的信息都會隨容器刪除而丟失。
按照Docker最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。
(1).卷(volumes):是宿主機器的文件系統的一部分,由Docker進行管理(在Linux,存儲于/var/lib/docker/volumes/)。非Docker程序不應該去修改這些文件。Docker推薦使用卷進行持久化數據。卷可支持卷驅動(volume drivers),該驅動允許用戶將數據存儲到遠程主機或云服務商(cloud provider)或其它。沒有名字的卷叫匿名卷(anonymous volume),有名字的卷叫命名卷(named volume)。匿名卷沒有明確的名字,當被初始化時,會被賦予一個隨機名字。
卷是一個可供一個或多個容器使用的特殊目錄,它繞過UFS,可以提供很多有用的特性:A.卷可以在容器之間共享和重用;B.對卷的修改會立馬生效;C.對卷的更新,不會影響鏡像;D.卷默認會一直存在,即使容器被刪除。
卷的使用,類似于Linux下對目錄或文件進行mount,鏡像中的被指定為掛載點的目錄中的文件會復制到卷中(僅卷為空時會復制)。卷是被設計用來持久化數據的,它的生命周期獨立于容器,Docker不會在容器被刪除后自動刪除卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的卷。
(2).掛載宿主目錄(bind mounts, 綁定掛載):通過將宿主機器的路徑掛載到容器里的這種方式,從而數據持久化,因此綁定掛載可將數據存儲在宿主機器的文件系統的任何地方。非Docker程序可修改這些文件。綁定掛載是Docker早期就存在的,相比起卷,綁定掛載十分簡單明了。在開發Docker應用時,應使用命名卷(named volume)代替綁定掛載,因為用戶不能對綁定掛載進行Docker CLI(command line interface, 命令行界面)命令操作。
綁定掛載常用于:A.同步配置文件,如:將宿主主機的DNS配置文件(/etc/resolv.conf)同步至容器中;B.在開發程序時,將源代碼或Artifact同步至容器中。這種用法與Vagrant類似。
卷相關操作命令如下:
docker volume create vol1 # 創建一個卷,如卷名為vol1
docker volume ls # 查看所有的卷
docker volume inspect vol1 # 查看指定卷的信息,如卷vol1
# 啟動一個掛載卷的容器,如將卷名為"vol1"掛載到容器的/home/fengbingchun目錄;新建的容器名為"yyyy"; -P,隨機端口映射,容器內部端口隨機映射到主機的端口
docker run -it -P --name yyyy --mount source=vol1,target=/home/fengbingchun fengbingchun/ubuntu:16.04 /bin/bash
docker inspect yyyy # 查看容器中卷的具體信息,卷的信息在"Mounts"字段內,"yyyy"為容器名
docker volume rm vol1 # 刪除卷,如卷名為"vol1",需要卷"vol1"沒有被任何容器使用時才能刪除
docker volume prune # 刪除所有沒有被使用的卷
掛載主機目錄相關操作命令如下:
# 掛載一個本地主機的目錄到容器中去,新建的容器名為"test"; -P,隨機端口映射,容器內部端口隨機映射到主機的端口;
# "/home/GitHub"為本地主機目錄,本地目錄的路徑必須是絕對路徑;"/home/fengbingchun"為掛載到容器此目錄;Docker掛載主機目錄的默認權限是讀寫
docker run -it -P --name test --mount type=bind,source=/home/GitHub,target=/home/fengbingchun fengbingchun/ubuntu:16.04 /bin/bash # linux
docker run -it -P --name test --mount type=bind,source=e:\GitCode,target=/home/fengbingchun fengbingchun/ubuntu:16.04 /bin/bash # windows
docker inspect yyyy # 查看容器中掛載主機目錄的具體信息,掛載主機目錄的配置信息在"Mounts"字段內,"yyyy"為容器名
?
總結
以上是生活随笔為你收集整理的Docker容器中数据两种持久化存储方式:卷和挂载宿主目录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源库jemalloc简介
- 下一篇: Jenkins简介及在Windows上的