Docker学习06-容器数据卷

又来到了一个新的概念,每次到一个新的概念,就要问自己

是什么?有什么用?怎么用?能干嘛?解决了什么痛点?有什么优势?

0x00 坑

先说一个坑

Docker挂载主机目录访问如果出现cannot open directory:Permission denied,解决方法就是在挂载目录后多加一条命令:

--privileged=true

如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SElinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,containerroot拥有真正的root权限,否则,container中的root只是外部的一个普通用户权限。

怎么加?加在哪儿?

到了一家新的公司,老员工给你一条命令,你不懂就不做了?先跟着走,再去考虑是什么等。

0x01 docker容器数据卷

记得这个命令吧。现在解释一下

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
#docker run -d 后台守护进程启动
#-p 5000:5000 通过宿主机的5000访问docker服务的5000 端口映射
#-v /zzyyuse/myregistry/:/tmp/registry	-v自定义数据卷 宿主机路径:docker内路径
#--privileged=true 放开权限
#registry 自建立的私有库

数据卷是啥子?

概念:卷就是目录或文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持久存储或共享数据的特性;卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时,删除其挂载的数据卷。

说白了,就是docker容器里面开了个外接网盘用于存储文件。将docker容器内的数据保存进宿主机的磁盘中。

平时我们备份数据的时候:电脑——阿里云网盘/百度网盘/外接移动硬盘

docker备份数据:通过容器数据卷的方式,完成数据的持久化以及重要资料backup。当然数据卷的功能,包含但不限于这个功能。

image-20220123154154496

0x02 容器卷存储功能实例

容器卷能干嘛?

将应用与运行的环境打包镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久性的

Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。

为了能保存数据在docker中我们使用卷。相当于redis的主从复制的那个备份机器。

特点

1、数据卷可在容器之间共享或重用数据

2、卷中的更改可以直接实时生效,爽

3、数据卷中的更改不会包含在镜像的更新中

4、数据卷的生命周期一直持续到没有容器使用它为止

对比

之前我们学过复制、导出和导入容器这些功能,但是没有数据卷这么强大,数据卷就是一个备份实时率非常高的机制。

docker cp CID:/tmp/1.txt /root
docker export CID > filename.tar
cat filename.tar | docker import - u1/ubuntu:1.0

image-20220123155302713

练习测试

可以看出输入下方命令后,实现了双方的互通,我写你读,你写我读都可以。

docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
#/tmp/host_data和/tmp/docker_data这两个文件本身是不存在的,只要输入这条命令,就成功建立
#-v, v即volumes的意思

image-20220124191414038

数据卷挂载位置分析

docker inspect 容器ID

这个命令相当于一个X光片,将这个容器的所有属性项全部以json串的形式输出出来。

image-20220124193100698

那么在这里就能看到,这里挂载的路径等信息。

image-20220124193849893

多个数据卷挂载

到了后面学习,可以多个-v参数进行挂载。目前先写一个玩玩。

思考

假设我建立好了数据卷目录,当docker容器停了,我在主机上新建目录,docker容器里面会有同步的文件吗?答案是有的!

image-20220124194232463

总结

1、docker修改、主机同步获得

2、主机修改、docker同步获得

3、docker容器stop,主机修改,docker容器重启看数据是否同步

image-20220124194351762

0x03 深入学习1:读写规则映射添加说明

之前我们学到的,双方修改,双方同时获得数据,其实是docker自身默认的设置,也就是下方这个命令。

docker run -it --privileged=true -v 主机目录:docker容器目录 镜像名称 /bin/bash

其实上方的命令是这么写的,rw即可读可写的意思。

docker run -it --privileged=true -v 主机目录:docker容器目录:rw 镜像名称 /bin/bash

有时候我们限制容器内部只读不可写,说白了就是它限制的是,我们进入容器终端,不可touch文件。但是不影响主机写入文件,所以就是这么进行编写:

docker run -it --privileged=true -v /mydocker/u:/tmp:ro ubuntu /bin/bash
#ro代表read only

再次强调,是容器内部只读不可写。

image-20220124194923270

0x04 深入学习2:卷的继承与共享

1、容器1完成和宿主机的映射

docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data:rw --name=u1 ubuntu /bin/bash

2、容器2继承容器1的卷规则

docker run -it --privileged=true --volumes-from 父类 --name=u2 ubuntu

3、重点思考

假设容器2建立了、继承了容器1卷的继承与共享,这时候将容器1关闭掉,容器2会怎么样呢?答案是容器2还是会保存原来的继承关系,和容器1一样,这个继承是独立存在的。

posted @ 2022-01-24 22:14  sukusec不觉水流  阅读(19)  评论(0编辑  收藏  举报