Volume原理
首先我们需要知道Docker
的文件系统是如何工作的。
1,Docker
镜像是由多个文件系统(只读层
)叠加而成。当我们启动一个容器的时候,Docker
会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。
2,如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。
3,当删除Docker
容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker
中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)
。
4,为了能够保存(持久化)数据以及共享容器间的数据,Docker
提出了Volume
的概念。简单来说,Volume
就是目录或者文件,它可以绕过
默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
Docker
管理数据的方式有两种:
什么是数据卷
数据卷是一个特殊的文件或者目录,它将宿主机文件或者目录直接映射进容器中,可供一个或多个容器使用。
容器数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。
因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
通过docker run -v
命令可以将数据卷挂载到对应的容器目录空间,进行文件读取
数据卷特性
1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便
2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
3. 对数据卷的更新不会影响镜像,解耦了应用和数据
4. 卷会一直存在,直到没有容器使用,可以安全地卸载它
数据卷绑定方式
volumes
Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)
bind mounts
指定宿主机目录方式,意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。
这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
tmpfs
挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
数据卷挂载使用方式
//注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
解决办法:在挂载目录后面 多加一个--privileged=true参数即可
匿名目录挂载
属于volumes绑定方式
将挂载到/var/lib/docker/volumes 目录名字将会是一串随机数
docker run -it -v /centosVolume [container]
仅指定名字挂载
属于volumes绑定方式
将挂载到/var/lib/docker/volumes/myVolme/_data 也是挂载到了volumes目录 但是下级目录是我们指定的名字
docker run -it -v hostVolume:/myVolume [container]
指定目录挂载
属于bind mounts绑定方式
将挂载到我们指定的目录/root/hostVolume
docker run -it -v /root/hostVolume:/containerVolume [container]
docker file方式
生成镜像容器 内部将有这2个目录,并跟宿主机的进行绑定,使用的是volumes绑定方式
#基于centos镜像进行构建 FROM centos #数据卷只能指定容器数据卷,不能指定宿主机数据卷,英文并不能够保证在所有的宿主机上都存在这样的特定目录。 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] #以 /bin/bash方式启动 CMD /bin/bash
管理数据卷相关命令
创建数据卷
docker volume create edc-nginx-vol // 创建一个自定义容器卷
使用通过
docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx
查看所有容器卷
docker volume ls // 查看所有容器卷
查看指定容器卷详情信息
docker volume inspect edc-nginx-vol //
删除容器卷
docker volume rm edc-nginx-vol
标签:容器,宿主机,Volume,挂载,docker,数据,目录 From: https://www.cnblogs.com/LQBlog/p/16860907.html