docker volume

docker data volume

  • Docker鏡像由多個只讀層疊加而成,啓動容器時,Docker會加載只讀鏡像層並在鏡像棧頂部添加一個讀寫層
  • 若是運行中的容器修改了現有的一個已經存在的文件,那該文件將會從讀寫層下面的只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏,此即「寫時複製(COW)」機制。

卷是持久化由Docker容器生成和使用的數據的首先機制。雖然綁定掛載依賴於主機的目錄結構,但卷由Docker徹底管理。與綁定安裝相比,卷有幾個優勢:html

  • 與綁定掛載相比,卷更容易備份或遷移
  • 您可使用Docker CLI命令或Docker API管理卷
  • 卷在Linux和Windows容器上都可用
  • 卷能夠在多個容器之間更安全地共享
  • 卷驅動程序容許您遠程主機或雲提供程序上存儲卷,加密卷的內容或添加其它功能
  • 新卷的內容能夠由容器預先填充

另外,與使容器的可寫入層中的數據持久化相比,卷一般是更好的選擇,由於使用卷不會增長容器的大小,而且容器的內容存在於給定容器的生命週期以外。docker

Docker有兩種類型的卷,每種類型都在窗口中存在一個掛載點,但其在宿主機上的位置有所不一樣;

  • Bind mount volume(宿主機上的目錄結構,相似mount --bind 命令)
  • Docker-managed volume (docker本身管理的目錄)
Docker-managed volume
~]# docker run -it --name b1 -v /data docker.io/busybox:latest
查看容器b1的卷、卷標識符及掛載的主機目錄
~]# docker inspect -f {{.Config.Volumes}}{{.Mounts}} b1

Bind-mount Volume
~]# docker run -it -v HOSTDIR:VOLUMEDIR --name b2 docker.io/busybox:latest
~]# docker inspect -f {{.Mounts}} b2
多個容器的卷使用同一個主機目錄,例如
~]# docker run -it --name b1 -v /hostname/html/:/app/www/ docker.io/busybox:latest
~]# docker run -it --name b2 -v /hostname/html/:/app/www/ docker.io/busybox:latest


複製使用其它容器的卷,爲docker run命令使用--volumes-from(複製另外一個容器的卷定義)選項
~]# docker run -it --name b1 -v /hostname/html/:/app/www/ docker.io/busybox:latest
~]# docker run -it --name b2 --volumes-from b1 docker.io/busybox:latest
宿主機 容器 關聯後
/hostname/html/{a,b,c}有a,b,c三個文件 爲空 容器內生成目錄和文件。而且無論怎樣都是mount

volume相關命令:

[root@centos7 ~]# ls /var/lib/docker/volumes/
metadata.db

啓動容器並掛載卷,建立文件並退出
[root@centos7 ~]# docker run --name b1 -it -v /app/html/ docker.io/busybox
/ # cd /app/html/
/app/html # ls
/app/html # echo "Hello World!" > index.html
/app/html # ls
index.html
/app/html # exit
[root@centos7 ~]# ls /var/lib/docker/volumes/
765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827  metadata.db
[root@centos7 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

查看b1這個容器的二級Mounts的詳細信息。{{兩個花括號表示二級選項
[root@centos7 ~]# docker inspect -f {{.Mounts}} b1
[{volume **765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827** /var/lib/docker/volumes/765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827/_data /app/html local  true }]
第一個參數:volume卷
第二個參數:卷名,哈希生成 
第三個參數:掛載至宿主機的目錄
第四個參數:本地卷
第五個參數:我也不清楚,就當成能夠正常使用的吧!


查看永久存儲,哈希生成的目錄名
[root@centos7 ~]# cat /var/lib/docker/volumes/765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827/_data/index.html 
Hello World!


[root@centos7 ~]# docker rm b1
b1

顯示有哪些卷
[root@centos7 ~]# docker volume ls 
DRIVER              VOLUME NAME
local               765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827

刪除卷
[root@centos7 ~]# docker volume rm 765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827
765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827
[root@centos7 ~]# ls /var/lib/docker/volumes/
metadata.db
相關文章
相關標籤/搜索