博主有话说

  1. 在博文【Docker】容器端口暴露+镜像生成实战中针对tomcat镜像的启动,需要修改配置文件,此时如果容器删除了,那么对应的修改也就没了,当时采用了镜像生成的方式进行规避,但是从源头上,还是没有解决数据可以持久化的问题
  2. 在博文【LINUX】常用基本指令(1)目录管理中介绍rm -rf /不能用,会强制删库,同样的,如果删除了容器,那么对应着,里面的操作数据也就同样不保留了,这个在数据库容器的使用中尤为明显,数据存储在本地上很有必要
  3. 容器之间是隔离的,在博文【Docker】容器端口暴露+镜像生成实战中提到了端口暴露,如果2个容器之间数据互相访问,不能直接进行,需要容器1先向linux进行暴露,然后容器2再向linux进行访问,才能实现容器2对容器1的数据获取,此时实现容器之间数据共享就很有必要

综上三点,引入数据卷技术和数据卷容器,前两点可以用数据卷技术,后一点就是数据卷技术和数据卷容器。

数据卷和数据卷容器区分

概念分析

  • 数据卷(Volume):是被共享和持久化存储的数据载体(目录 / 文件),而非 “父容器”。数据卷由 Docker 管理,位于宿主机上,独立于容器生命周期,可被多个容器同时挂载实现共享与持久化。

  • 数据卷容器(Data Volume Container):是一种 “专门挂载数据卷并供其他容器挂载” 的普通容器,常被称为 “父容器”。它本身不是数据卷,而是数据卷的 “管理者 / 共享中介”。

关键对比

  • 数据卷:存储与共享数据的载体(目录 / 文件),位于宿主机,独立于容器生命周期。
  • 数据卷容器:用于组织和共享数据卷的容器,常被当作 “父容器”,但不等同于数据卷本身。

速记

  • 数据卷 = 数据的 “存储位置”(共享与持久化)
  • 数据卷容器 = 数据卷的 “共享中介”(父容器)

ps:持久化(Persistence)是把易失性内存数据写入非易失性存储(如磁盘、数据库),使其在程序 / 系统重启、故障后仍可恢复与继续使用的机制与过程。

使用数据卷

方式一:使用命令来挂载 -v

指定路径挂载

-v 主机目录:容器内目录

docker run -it -d centos:7.0.1406 /bin/bash启动centos实例,通过docker inspect bold_haibt查看容器元数据,其中Mounts里面的就是挂载相关信息,此时可以发现为空,即该容器没有挂载。
在这里插入图片描述
docker run -it -d -v /home/vceshi:/home centos:7.0.1406 /bin/bash进行启动,将容器的/home挂载在主机/home/vceshi中。采用docker inspect musing_edison进行元数据查看,可以从Mount获知设置的挂载信息。此时在容器/home中加文件,/home/vceshi会同步出现;在/home/vceshi中加文件,/home会同步出现。即实现双向同步。此时如果把容器删除了,本地/home/vceshi中的数据依旧会存在,这就实现了容器数据的持久化功能
在这里插入图片描述

匿名挂载

-v 容器内路径

使用docker run -it -d -v /home centos:7.0.1406 /bin/bash进行挂载,通过docker inspect admiring_chatelet对容器admiring_chatelet进行查看,发现本机路径在/var/lib/docker/volumes/68e2c1033b3feae84fb088d6d0cf3c402504c7d69e1f3beb82c806c8cb7740a6/_data。这边有一个要点:所有的docker容器内的卷,如果没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data,其中xxxx为卷名
在这里插入图片描述
在容器/home中创建文件,然后进入到路径/var/lib/docker/volumes/68e2c1033b3feae84fb088d6d0cf3c402504c7d69e1f3beb82c806c8cb7740a6/_data中进行验证,也发现了创建的文件。
在这里插入图片描述
延伸一下,docker volume ls可以查看所有数据卷的情况,而容器admiring_chatelet的数据卷名字是68e2c1033b3feae84fb088d6d0cf3c402504c7d69e1f3beb82c806c8cb7740a6,这个如果不指定本机目录,是与生成的本机路径地址对应的。此时如果关闭容器,会发现数据卷依旧存在;如果删除容器,数据卷也依据存在。故,数据卷的生命周期独立于容器,删除容器不会自动删除数据卷,这再次说明了数据卷技术的持久化
在这里插入图片描述

具名挂载

-v 卷名:容器内路径

使用docker run -it -d -v centos_cesi:/home centos:7.0.1406 /bin/bash将容器/home挂载到本机中卷名为centos_cesi的路径下,使用docker volume ls查看所有的卷,已经出现了增加的卷名。
在这里插入图片描述
使用docker inspect frosty_einstein 对容器frosty_einstein进行元数据查看,可以获知卷名centos_cesi对应的路径是/var/lib/docker/volumes/centos_cesi/_data,即在前面匿名加载小节中提到的:所有的docker容器内的卷,如果没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data,其中xxxx为卷名
在这里插入图片描述

拓展:容器权限设置

-v 容器内路径:ro rw 改变读写权限
ro readonly 只读
rw readwrite 可读可写

使用docker run -it -d -v centos_cesi:/home:ro centos:7.0.1406 /bin/bas指定容器/home只读,此时在该路径下进行文件创建,会报失败。
在这里插入图片描述
但如果在主机卷centos_cesi路径下进行文件创建,可以成功,且容器/home下会同步生成。
在这里插入图片描述
故,一旦设置了这个容器权限,容器对我们挂载出来的内容就有限定了。ro 只要看到就说明这个路径只能通过宿主机来操作,容器内部都是无法操作的!

方式二:构建镜像时挂载卷

【Docker】容器端口暴露+镜像生成实战里面,介绍了采用docker commit实现镜像的生成,当时没有涉及到数据卷的使用。本节中,会新介绍一种方式来实现镜像的构建,同时实现容器对数据卷的挂载。构建镜像前,先创建Dockerfile构建文件,文件名字可以随机,建议是dockerfile。关于Dockrfile的使用会在后面的博文中进行详细介绍。
在这里插入图片描述

ps: 使用touch dockerfile进行文件的创建,然后vim dockerfile后,按i进入 插入模式(编辑文本),按 : 进入 命令行模式(执行保存、退出等操作)。其中在插入模式中,按 Esc 返回正常模式。

然后采用docker build -f /home/test-volum/dockerfile -t ceshicentos:1.0 .进行镜像的生成,注意后面的.,否则会报错:ERROR: “docker buildx build” requires exactly 1 argument

在这里插入图片描述
接着进行docker run -it --name=cs ceshicentos:1.0进行启动后,就会在容器中生成volume01和volume02两个目录,且创建2个数据卷。
在这里插入图片描述
在这里插入图片描述

数据卷容器

采用--volumes-from在两个或者多个容器之间实现数据共享,而且共享卷之间是拷贝的概念,如果docker01与docker02共享卷,docker02与docker03共享卷,删除了docker01,不影响docker02和docker03对共享数据的访问。这边要注意:数据卷容器中的共享数据是指对数据卷配置信息进行容器之间的共享,不是在docker1里面随便创建一个文件,然后docker2里面就有了这个文件

按照之前-v的数据卷技术,如果要实现2个容器共享同意卷,需要docker run -v 卷名:/ 容器内路径docker run -v 卷名:/ 容器内路径(路径可相同或不同),如果多个容器就较为麻烦;采用--volumes-from的方法,docker run --volumes-from 源容器 实际上就是复用其卷配置,效果等价于挂载同一卷。这边再次说明了:共享卷之间是拷贝的概念。

采用docker run -it --name=centos10 -v volume01 -v volume02 centos:7.0.1406 /bin/bash创建数据卷容器,采用docker run -it --name=centos11 --volumes-from centos10 centos:7.0.1406 /bin/bash去实现数据卷的共享。可以发现centos11也有了共享的容器目录volume01和volume02。
在这里插入图片描述
采用docker inspect centos11docker inspect centos10去查看元数据,可以发现主机数据卷目录都是同一个,这表明2个容器之间实现了数据共享,而其中centos10是数据卷容器,也叫父容器
在这里插入图片描述
因此,容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐