1. 简介
先来看看Docker的理念:
- 将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
总结:实际就是建立一个通道,让宿主机和容器内的目录/文件互通,有点类似Redis里面的rdb和aof文件
2. 作用
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点: 1:数据卷可在容器之间共享或重用数据 2:卷中的更改可以直接生效 3:数据卷中的更改不会包含在镜像的更新中 4:数据卷的生命周期一直持续到没有容器使用它为止
总结:
- 容器的持久化
- 容器间继承+共享数据
3. 数据卷
容器和宿主机之间的数据共享
3.1 命令添加
# -v 代表指定数据卷参数# 容器内可读可写docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名# 容器内只读,read onlydocker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名# 备注:# 如果Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied# 解决办法:在挂载目录后多加一个--privileged=true参数即可
- 绑定后可以使用四、Docker常用命令 3.11 docker inspect———查看容器内部细节查看数据卷是否挂载成功

- 容器和宿主机之间数据共享,容器停止退出后,主机修改后数据也会同步,在下一次启动时会加载,类似Redis的持久化文件
3.2 DockerFile添加
# docker file中命令# 容器数据卷测试dockerfileFROM centos:7# 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]CMD echo "finished,--------success1"CMD /bin/bash# 说明:# 出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。# 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。# 对应的宿主机有默认路径:/var/lib/docker/volumes/xxxxxx/_data
- 案例演示
- 根目录下新建mydocker文件夹并进入
- dockerfile构建

- build执行构建 ```bash docker build -f /mydocker/dockerfile -t jshawn/centos .
参数解释
-f 指明dockerfile路径 -t 指明镜像的命名空间和名称 . 代表在当前目录下生成,可以自定义
- build后生成一个新镜像jshawn/centos- run执行,看是否生成容器数据卷- 通过`**docker inspect 容器ID**`查看宿主机对应的默认地址- 测试容器和宿主机之间数据共享<a name="w6w4x"></a># 4. 数据卷容器> 命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器> **一句话:容器间继承+共享数据,容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止**```bashdocker run -it --name="dc02" --volumes-from dc01 c899766476ac# 参数解释--volumes-from:新容器继承于哪个父容器,那么新容器就具有和父容器一样的数据卷,并且两个容器间数据共享,哪怕删除其中一个容器,另外一个的数据卷也会继续存在,并且可以继续被其他容器继承,可以无限延伸
- 案例演示
- 以上一步已配置好数据卷的镜像jshawn/centos为模板新建并运行容器dc01

同样创建dc02/dc03,但需加入
**--volumes-from**,让dc02和dc03的数据卷继承于dc01docker run -it --name="dc02" --volumes-from dc01 c899766476acdocker run -it --name="dc03" --volumes-from dc01 c899766476ac
在dc01中的
/dataVolumeContainer1目录下新增文件,查看dc02和dc03中相同目录也出现该文件(图略)- 此时删除容器dc01,而dc02和dc03还可以继续互通数据,证明数据卷之间的继承与共享,并且可以继续被其他容器继承

