一、是什么
一句话,有点类似我们Redis里面的rdb和aof文件
二、能干嘛
1、容器的持久化
2、容器间继承+共享数据
三、如何添加数据卷
1、直接命令添加
语法: docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
例:
docker run -it -v /myDataVolume:/dataVolumeContainer centos
一开始我们的宿主机里面并没有/myDataVolume目录,我们以平常方式启动centos容器,里面也没有/dataVolumeContainer目录,如下图所示
执行命令后
宿主机和容器中均出现了对应的文件夹, 接下来查看数据卷是否挂载成功
docker inspect e4643738cfce
centos 7可能有些不太一样
为了验证数据共享我们现在宿主机host的/myDataVolume中添加 host.txt
首先我们的容器中的/dataVolumeContainer中什么都没有
宿主机中进入到/myDataVolume 运行touch host.txt
然后我们在绑定的容器中查看是否有host文件
我们看到 /dataVolumeContainer 里面已经有我们的host.txt了,为了验证容器所修改或者创建的文件我们宿主机可以共享到,我们修改host.txt的内容并创建container.txt
然后我们在主机上观察
打开host.txt查看
我们看到,我们在容器中所记录的文字在宿主机显示了,所以现在宿主机跟容器的数据卷现在是工作的
提问1:容器停止退出后,主机修改后数据是否同步
① 我们先将容器退出
② 我们在宿主机中再次建立host02.txt,并且在host.txt中加入host updata 01
touch host02.txt
③ 重启我们之前关闭的容器
docker attach 9515cd7fea02 重新进入我们的服务器
进入/dataVolumeContainer 发现,在容器关闭的情况下,我们在宿主机上建立的东西还在
并且 更新的内容 也在
1.1 加只读权限
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
我们在容器内目录后加了个ro,加了这个只读权限后,我们容器内便不可以在我们指定的容器内目录中修改或创建任何数据
并且容器详情信息中也会有对应改变
2、DockerFile添加
前言:如图就为官网的tomcat的DockerFile
用dockerfile可以构建我们新的镜像,所以我们可以在构建镜像时就写好有关于数据卷的代码,这样镜像构建完成后,我们无需多余的工作,只需要启动该镜像对应的容器,便可将数据卷构建完毕
例:
1、在我们的根目录下新建mydocker文件夹并进入
2、编写属于我们的简单的DockerFile
技术点:可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
创建文件Dockerfile ,将下面的脚本粘贴至该文件中
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
解释:from 大概的意思就是java里的继承的意思
VOLUME 是容器中数据卷的文件夹,可以设立多个
CMD echo “finished,————success1” 为打印一个日志代表成功
CMD /bin/bash 加上这一行整个dockerfile的意思差不多为
3、build后生成镜像
docker build -f /mydocker/Dockerfile -t spz/centos .
如同花卷一般,一层层的构建我们的镜像并返回镜像id
这下面便是我们根据dockerfile构建的我们自己的centos
4、run容器
这下面两个文件夹便是我们创建的容器数据卷
进入容器数据卷创建 containt01.txt
5、通过上述步骤,容器内的卷目录地址已经知道,那对应的主机目录地址哪??
说明:因为用这种方法创建数据卷,我们并没有指定宿主机的卷的目录地址,docker会给我们默认分配一个,我们需要使用docker inspect 容器id命令来查看
centos 6.8如下
centos 7如下
我们进入对应的文件夹内,便可以看到我们在容器内创建的文件
备注:
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个—privileged=true参数即可
例: