什么是数据卷?
容器运行过程中会产生相关数据,为了避免在 停止/删除 容器时造成数据丢失,需要实现数据持久化存储,需要把宿主机目录挂载到容器里面,实现数据共享并且存储。
简单来说:把宿主机中的某几个目录挂载到容器中,目的是:实现数据持久化存储以及数据备份,实现数据共享。
类似于Redis中的rdb和aof文件
主要特点哪些?(能干什么)
数据卷的设计目的就在于:数据持久化,完全独立于容器的生存周期,因此Docker 不会在容器删除时删除其挂载的数据卷,这样就实现了数据持久化。
数据卷作用:
- 数据持久化
- 数据共享、容器继承
主要特点:
- 数据卷可在容器之间共享或者共用数据
- 数据卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
- 数据卷中的数据不会因为容器的删除而丢失
创建容器数据卷的方式
方式一:直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器中目录 (必须为绝对路径)镜像ID / 镜像名称
先在宿主机创建一个名为:myDatavolumn目录
mkdir myDatavolumn
运行命令:
docker run -it -v /myDatavolumn:/myContainerVolumn --name="mycentos03" centos
这个时候容器会创建一个目录为myContainerVolumn
docker inspect 容器ID 可以查看挂载相关信息
"HostConfig": { "Binds": [ "/Users/xiemingbao/myDatavolumn:/myContainerVolumn" ] } "Mounts": [ { "Type": "bind", "Source": "/Users/xiemingbao/myDatavolumn", "Destination": "/myContainerVolumn", "Mode": "", "RW": true, "Propagation": "rprivate" } ]
HostConfing 的Binds 代表绑定成功了!
RW:true 表示容器有度写的宿主机权限,如果为false表示只有读权限,不能写入任何宿主机权限。
如果需要变false 运行时 宿主机:容器目录:ro 在后面添加 :ro 参数即可
ro:只读
rw:读写
方式二:DockerFile形式添加
- 在宿主机目录下面创建mydocker并且进入
- 创建一个Dockerfile 文件 并且写入一个VOLUME指令来给镜像添加一个或多个数据卷
- Dockerfile的构建
- 使用build生成镜像
- 运行容器
- 使用命令docker inspect 容器ID 查看挂载目录
- 测试数据共享以及存储
1、创建目录 mkdir /mydocker 2、进入目录 cd ./mydocker 3、构建Dockerfile文件并且写入VOLUME命令 vim Dockerfile #volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,------success1" CMD /bin/bash 命令解释 FROM centos 来源于centos镜像 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] 表示在镜像根目录下面创建两个挂载目录 CMD echo "finished,------success1" 输出成功标识 CMD /bin/bash 执行命令 5、运行build命令、生成新的镜像 docker build -f Dockerfile文件绝对路径()-t 你自定义的镜像名称 . (这个点必然加) docker build -f /Users/xiemingbao/mydocker/Dockerfile -t ymb/centos . 6、运行容器 docker run -it 你自定义的镜像名称 这会就看到了容器里面存在两个挂载目录了 7、查看宿主机对于目录默认地址 docker inspect 容器ID 如下图红色标记路径
Dockerfile默认挂载到宿主机的目录
容器数据卷的挂载
- 匿名挂载(一般不推荐使用)
- 具名挂载
- 指定路径挂载
什么是匿名挂载?简单来说没有指定数据卷的名称,随机生成
-v 容器内部挂载路径docker run -d --name mycentso01 -v /home/mycentosData centos 6f831608233d6883a90f50e0a1ad606b7ed7f987461d1bfb7810685b7f022450 #查看所有的volume 情况 容器数据卷 docker volume ls iemingbaodeMacBook-Pro:mydocker xiemingbao$ docker volume ls DRIVER VOLUME NAME local 37788a68709ab78f424d01bcfdc53f0d20ef3c318e0481557fcad9eebe4ff86e local 3113118ccc23304ec7de0d4e224bd0566591cd01aaaa507431d5372f247f7f34 local a1976b49640e2d67eadfd306aba8b52588cd98455b70ba3ef526fcdff6c1b76e local b442e19b567efc623dad2f30fb7b3867a05117cf3a06071ae3980ae2ab17e1dd 这些都是匿名挂载(没有具体名字的) 查看挂载目录所在 docker volume inspect (VOLUME NAME) docker volume inspect 37788a68709ab78f424d01bcfdc53f0d20ef3c318e0481557fcad9eebe4ff86e [ { "CreatedAt": "2021-07-20T15:58:02Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/ff4f13aeace03b67e45283cd9caad7d1c0b6352a7ef7d84dcb241d47d4ff1e09/_data", "Name": "ff4f13aeace03b67e45283cd9caad7d1c0b6352a7ef7d84dcb241d47d4ff1e09", "Options": null, "Scope": "local" } ]
什么是具明挂载?起了具体名字的
-v 数据卷名称:容器内部挂载路径运行容器: docker run -d -P --name nginx02 -v kerry-juming:/etc/nginx nginx 查看所有数据卷 docker volume ls DRIVER VOLUME NAME local 37788a68709ab78f424d01bcfdc53f0d20ef3c318e0481557fcad9eebe4ff86e local ff4f13aeace03b67e45283cd9caad7d1c0b6352a7ef7d84dcb241d47d4ff1e09 local ymb-juming #这就是具名挂载
由此可见,所有的docker容器内的数据卷,没有指定挂载目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
什么是指定路径挂载?指定宿主机的挂载目录
-v /宿主机路名:/容器内部挂载路径
docker run -d --name zhiding -v /home/mydocker/zhidingData:/home/centos centos /bin/sh -c "while true;do echo hello ymb;done" 查看容器结构 docker inspect 容器ID "Mounts": [ { "Type": "bind", "Source": "/Users/xiemingbao/mydocker/zhidingData", "Destination": "/home/centos", "Mode": "", "RW": true, "Propagation": "rprivate" } ], 由于是宿主机指定了目录挂载,所以查看所有的容器卷是不显示的。因为显示的都是没有指定宿主机挂载目录,默认在/var/lib/docekr/volumes/ 路径生成 docker volume ls
总结:
-v 容器内路径 #匿名挂载-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:/容器内目录路径 #指定路径挂载
大多数情况下使用后面的两种