文章目录
1.什么是Docker数据卷
- 数据卷是一个或多个容器中专门指定的目录,它能够绕过联合文件系统。 卷被设计用作数据持久化、并且是独立于容器的生命周期的。
- 因此,Docker不会在删除容器时自动删除数据卷卷,也不会主动“垃圾回收”掉容器不再使用的卷。
说白了,数据卷的存在就是想让的容器的数据持久化存在,而且可以实现容器之间的数据共享。当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的 - Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的 而且容器之间我们希望能够实现数据共享
- 通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中
- 由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷
有三种数据卷类型:
①宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
②命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
③匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。
备注:数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,
只是第一种是在宿主机内的特定目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/
2.为什么要用数据卷
- 数据卷是目录或文件,不是块设备
- 容器可以读写volume中的数据
- volume数据可以持久化保存
bind mount
是将主机上的目录或文件mount到容器里
docker managed volume
bind mount 必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源
bind mount 和docker managed volume对比
3.数据卷的特点
(1)数据卷可以在容器之间共享或重用数据
(2)数据卷中的更改可以直接生效
(3)数据卷中的更改不会包含在镜像的更新中
(4)数据卷的生命周期一直持续到没有容器使用它为止
4.如何添加数据卷
添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加
(1)第一种通过命令行挂载的方式,命令如下:
docker run -it -v /宿主机绝对路径目录: /容器内目录 镜像名
这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享
如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果
docker ps -a ## 查看出容器的id
docker inspect 容器id
上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串
运行命令之后我们在返回的JSON字符串中找到Volumes
属性
假如挂载成功的话,Volumes里面显示的绑定结果应该是你在挂载时输入的命令参数 (/宿主机绝对路径目录: /容器内目录 )
如果与你们之前输入的一致的话,证明挂载成功
PS: Volumes里面显示的绑定结果可能有多个,但是只要找到目标结果就可以
挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改是会同步到容器内的
我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限
docker run -it -v /宿主机绝对路径目录 : /容器内目录 :ro 镜像名
至于只写的话我们一般不会用到,要么就是读写,要么就是只读
而且我们可以通过docker inspect
来查看容器的volumesRW
来查看容器内数据卷的读写权限。
(2)第二种就是利用dockerFile
的形式添加
首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件
使用volume命令
(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)
编写的dockerFile文件如下:
FROM 镜像名
VOLUME ["/生成的目录路径"] -- privileged=true
CMD echo "success build"
CMD /bin/bash
相当于命令行: docker run -it -v /宿主机目录路径 : /生成的目录路径
然后我们通过命令行docker build
执行我们写好的dockerFile文件
(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)
docker build -f /docker/DockerFile -t 命名空间/镜像名
执行后输入docker images
就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷
那么问题来了宿主机所对应的目录是什么呢?
同上,我们可以通过docker inspect
来查看当前容器的Volumes,里面会有宿主机的数据卷目录
说了这么多,那么到底什么是docker数据卷容器?
上面介绍了docker容器数据卷,它的作用相当于生活中的活动硬盘
那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。
官网解析:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,我们称为数据卷容器。
5.bind mount数据卷
[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro busybox
/ # ls
bin data1 data2 dev etc home proc root sys tmp usr var
/ # cd data1/
/data1 # ls
/data1 # touch file1
/data1 # ls
file1
/data1 # cd ../data2/
/data2 # touch file2
touch: file2: Read-only file system
/data2 # [root@server1 ~]#
[root@server1 ~]# cd /tmp/data1/
[root@server1 data1]# ls
file1
[root@server1 data1]# cd ../data2/
[root@server1 data2]# ls
[root@server1 data2]#
挂载文件
[root@server1 ~]# docker run -it --name vm2 -v /etc