(07)Docker容器之数据卷
1、数据卷及其作用
Docker理念是将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的,容器之间希望有可能共享数据。Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷,一句话:有点类似我们Redis里面的rdb和aof文件。
卷的作用有两个:做容器的持久化;容器间继承+共享数据。卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1、数据卷可以在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命周期一直持续到没有容器使用它为止
2、容器内添加数据卷
有两种方式:直接命令添加;DockerFile添加
(1)直接命令添加
1)命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
[root@localhost ~]# docker run -it -v /myDataVolume:/dataVoContainer cento
2)查看数据卷是否挂载成功,看到宿主机和容器内部都成功创建了对应目录,宿主机和容器可以共享数据了
使用docker inspect命令也可以查看
docker inspect 92afd4685d89
3)容器和宿主机之间数据共享:在宿主机内创建test.txt在容器内可以读取到并修改,在容器内新建的test2.txt在宿主机中可以读到。
4)容器停止退出后,主机修改后数据是否同步。此时容器内和宿主机的文件如下:
在宿主机内新增、修改文件,然后启动容器,发现数据已经同步
5)命令(带权限)
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
作用:宿主机可以写文件,但是容器内的目录中只能读文件,不能修改,也不能写
演示:首先清空宿主机和容器内相关目录的文件,然后exit容器。
[root@localhost myDataVolume]# docker run -it -v /myDataVolume:/dataVoContainer:ro centos
(2) DockerFile添加
DockerFile理解为镜像模板的描述文件。去https://github.com/看一下tomcat的部分DockerFile,用到了jdk:
创建数据卷使用:VOLUME ["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]。由于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。因为宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
1)根目录下新建mydocker文件夹并进入
[root@localhost /]# mkdir mydocker [root@localhost /]# cd mydocker [root@localhost mydocker]# pwd /mydocker
2)可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。构建File文件
[root@localhost mydocker]# vim Dockerfile
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------successl" CMD /bin/bash
FROM centos:来自于父类的镜像
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]:新建两个数据卷
整个文件类似于:docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash
3)build后生成镜像
docker build -f /mydocker/Dockerfile -t sl/centos .
-f:指明dockerfile路径
-t:指明命令空间和镜像名字
.:当前目录
4) run容器
[root@localhost mydocker]# docker run -it sl/centos
容器内已经创建了两个数据卷,可使用docker inspect image查看宿主机对应目录,同样具有数据共享、读写权限 。
[root@localhost mydocker]# docker inspect e042513c1a91
备注 :Docker挂载主机目录,Docker访问出现cannot open directory .:Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
如:docker run -it -v /myDataVolume:/dataVolumeContainer --privileged=true 镜像名