docker volume

docker data volume

  • Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
  • 如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,此即“写时复制(COW)”机制。

卷是持久化由Docker容器生成和使用的数据的首先机制。虽然绑定挂载依赖于主机的目录结构,但卷由Docker完全管理。与绑定安装相比,卷有几个优点:

  • 与绑定挂载相比,卷更容易备份或迁移
  • 您可以使用Docker CLI命令或Docker API管理卷
  • 卷在Linux和Windows容器上均可用
  • 卷可以在多个容器之间更安全地共享
  • 卷驱动程序允许您远程主机或云提供程序上存储卷,加密卷的内容或添加其它功能
  • 新卷的内容可以由容器预先填充

另外,与使容器的可写入层中的数据持久化相比,卷通常是更好的选择,因为使用卷不会增加容器的大小,并且容器的内容存在于给定容器的生命周期之外。

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

posted @ 2018-03-17 18:01  dance_man  阅读(452)  评论(0编辑  收藏  举报