【Docker】数据卷技术和数据卷容器
如果docker01与docker02共享卷,docker02与docker03共享卷,删除了docker01,不影响docker02和docker03对共享数据的访问。数据卷容器(Data Volume Container):是一种 “专门挂载数据卷并供其他容器挂载” 的普通容器,常被称为 “本节中,会新介绍一种方式来实现镜像的构建,同时实现容器对数据卷的挂载。去实现数据卷的共享。,前两点可以用
【Docker】数据卷技术和数据卷容器
博主有话说
- 在博文【Docker】容器端口暴露+镜像生成实战中针对tomcat镜像的启动,需要修改配置文件,此时如果容器删除了,那么对应的修改也就没了,当时采用了镜像生成的方式进行规避,但是从源头上,还是没有解决数据可以持久化的问题;
- 在博文【LINUX】常用基本指令(1)目录管理中介绍
rm -rf /
不能用,会强制删库,同样的,如果删除了容器,那么对应着,里面的操作数据也就同样不保留了,这个在数据库容器的使用中尤为明显,数据存储在本地上很有必要; - 容器之间是隔离的,在博文【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 centos11
和docker inspect centos10
去查看元数据,可以发现主机数据卷目录都是同一个,这表明2个容器之间实现了数据共享,而其中centos10是数据卷容器,也叫父容器。
因此,容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
更多推荐
所有评论(0)