是什么
docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷。卷就是目录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些用于持久化数据或共享数据的特点
能干嘛?
卷的设计目的就是数据的持久化,完全独立与容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
1. 数据卷可以在容器之间共享和重用数据。
2. 卷的更改可以直接生效。
3. 数据卷的更改不会包含在镜像的更新中。
4. 数据卷的生命周期一直持续到没有容器使用它为止。
容器的持久化
容器间继承+共享数据
数据卷
容器内添加
1.直接命令添加:
命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否挂载成功。
使用docker imspect 容器ID,返回的json串有这么一串数据说明挂载成功。
容器和宿主机之间通信
容器关闭后在宿主机更改文件,容器再次启动数据仍然同步
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (read only)
此时主机能对数据卷进行更改,但是容器不能对其更改,只允许读。
DockerFile
hello.java ---- hello.class
hello images ---- images DockerFile
实际就是镜像的描述。
2.DockerFile添加
根目录下新建mydocker文件夹并进入。
在DockerFile中使用VOLUME指令给镜像添加一个或者多个数据卷
VOLUME["/dataVolumeContainer","dataVolumeContainer2","dataVolumeContainer3"]
出于可移植和分享的考虑,用-v命令这种方法不能够直在DockerFile中实现,由于宿主机目录是依赖于特定宿主机的,并不能保证所有的宿主机都存在这样的特定目录。File构建
build后生成镜像-----获得新的镜像
也是一层一层的叠加,联合文件系统
run容器
可以看到已经创建两个数据卷,对应主机路径
Docker 挂载主机目录Docker出项cannot open directory .:Permission denied
解决办法:在挂载目录后面 多加一个--privileged=true参数即可
docker run -it -v /mydatavolume:/datavolumecontainer --privileged=true 镜像名
数据卷容器
命名的容器挂载数据卷,其他的容器通过挂载这个容器(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器
- 以上一步新建的镜像为模板运行容器dc01/dc02/dc03
他们已经具有容器卷/datavolumecontainer1和/datavolumecontainer2容器间传递共享(--volumes-from)
启动父容器dc01--在datavolumecontainer2中新增内容
dc01/dc02继承自dc01(--volumes-from)
子容器创建文件父容器查看
删除父容器子容器数据保留,
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。