Docker学习06-容器数据卷
又来到了一个新的概念,每次到一个新的概念,就要问自己
是什么?有什么用?怎么用?能干嘛?解决了什么痛点?有什么优势?
0x00 坑
先说一个坑
Docker挂载主机目录访问如果出现cannot open directory:Permission denied
,解决方法就是在挂载目录后多加一条命令:
--privileged=true
如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SElinux里面挂载目录被禁止掉了,如果要开启,我们一般使用--privileged=true
命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container
内root
拥有真正的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。当然数据卷的功能,包含但不限于这个功能。
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
练习测试
可以看出输入下方命令后,实现了双方的互通,我写你读,你写我读都可以。
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
#/tmp/host_data和/tmp/docker_data这两个文件本身是不存在的,只要输入这条命令,就成功建立
#-v, v即volumes的意思
数据卷挂载位置分析
docker inspect 容器ID
这个命令相当于一个X光片
,将这个容器的所有属性项全部以json
串的形式输出出来。
那么在这里就能看到,这里挂载的路径等信息。
多个数据卷挂载
到了后面学习,可以多个-v
参数进行挂载。目前先写一个玩玩。
思考
假设我建立好了数据卷目录,当docker
容器停了,我在主机上新建目录,docker
容器里面会有同步的文件吗?答案是有的!
总结
1、docker修改、主机同步获得
2、主机修改、docker同步获得
3、docker容器stop,主机修改,docker容器重启看数据是否同步
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
再次强调,是容器内部只读不可写。
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一样,这个继承是独立存在的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」