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}} b1Bind-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 # lsindex.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 b1b1显示有哪些卷[root@centos7 ~]# docker volume ls DRIVER VOLUME NAMElocal 765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827删除卷[root@centos7 ~]# docker volume rm 765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827765b79f6088d9b3c8ea46cc556794b1b2a204bdad821f02a1833a8e5c383c827[root@centos7 ~]# ls /var/lib/docker/volumes/metadata.db