Docker容器数据卷讲解

概述

为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会遭到删除,需求:数据持久化,容器的删除不会导致数据的删除。

Docker的容器数据卷实现的就是这样的一个技术,是一个数据共享技术,数据卷保存在宿主机上,通常表现为一个目录,独立与容器,生命周期与容器分离,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换。

数据卷的特点:
1.容器启动的时候初始化的,如果容器使用的镜像包含了数据,这些数据也会拷贝到数据卷中。
2.容器对数据卷的修改是及时进行的。
3.数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像与数据卷之间不会有相互影响。
4.数据卷是宿主机中的一个目录,与容器生命周期隔离。
5. 数据的更新时双向的,容器内对应的数据更新会同步到宿主机数据卷中,宿主机对数据卷的数据更新也会同步到容器中,是双向且及时。

使用数据卷

使用mysql镜像为例。
数据卷用-v参数指定。
命令:

docker -v 宿主机目录路径(数据卷):docker目录
  1. 下载mysql5.7镜像:
docker pull mysql:5.7

在这里插入图片描述
2. 在宿主机上创建/home/test目录,该目录就是数据卷。
3. 创建并运行容器并挂载数据卷。

DockerHub文档说明要在启动时通过MYSQL_ROOT_PASSWORD参数指定密码。

 docker run -p 3301:3306 --name mysql5.7container -e MYSQL_ROOT_PASSWORD=123456 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -d  718a6da099d8


#解释:
-d  后台运行
--name  指定容器的名字
-v 宿主机目录(数据卷):docker容器路径    可以设置多个
-e MYSQL_ROOT_PASSWORD=123456  设置mysql  root账号的密码
-p  宿主机3301端口映射到docker容器3306端口、

在这里插入图片描述
4. 查看数据卷数据
在这里插入图片描述
可以发现数据卷里面已经有了相关数据。
5. 连接mysql创建一个数据库docker。然后在查看数据卷。
在这里插入图片描述
可以看到数据卷能及时看到数据的变化。
6. 停止并删除容器。然后查看数据卷数据。
在这里插入图片描述
可以看到数据没有随着容器删除而删除。

  1. 使用同样的命令再次创建运行该容器,此时因为容器使用了该数据卷,所以创建的容器mysql数据没有丢失。
具名数据卷和匿名数据卷

docker有三种方式创建数据卷:

docker run -v docker里面的路径 imageId       #这种就是匿名数据卷。
docker run -v 数据卷名字:docker里面的路径  imageId   #具名数据卷,指定数据卷名称
docker run -v 数据卷路径:docker里面的路径  imageId   #直接指定数据卷的路径

匿名数据卷:使用上面第一个命令创建的数据卷。因为没有指定数据卷的路径和名字,所以默认会在宿主机的/var/lib/docker/volumes/数据卷名/_data 目录为数据卷,因为没有指定数据卷名,所以会自动生成数据卷的名字。

具名数据卷:使用上面第二个命令创建数据卷,因为没有指定数据卷的路径,所以默认会在宿主机的/var/lib/docker/volumes/数据卷名/_data 目录为数据卷,因为指定了数据卷名,所以不用自动生成。

直接指定路径生成数据卷:不使用默认路径。参考上面使用数据卷。

数据卷容器

假设有以下架构图:
在这里插入图片描述
有4个容器,container1-4,container1通过-v参数在宿主机创建数据卷/home/volume,对应该容器的地址路径是/volume,然后container2-4通过参数–volumes-from继承container。

下面就进行上图的操作实现:

  1. 先创建并运行container1:
docker run -it --name=container1 -v /home/centos/volume1:/volume1 -v /home/centos/volume2:/volume2 7e6257c9f8d8

在这里插入图片描述

  1. 创建container2-4:
docker run -it --name=container2 --volumes-from container1 7e6257c9f8d8

docker run -it --name=container3 --volumes-from container1 7e6257c9f8d8

docker run -it --name=container4 --volumes-from container1 7e6257c9f8d8

在这里插入图片描述
可以看到新创建的容器也有volume1和volume2目录。
3. 在container3的根目录新建一个目录volume3,并且在/volume1目录中新建一个文件aaa.txt。
在这里插入图片描述
4. 去container1和container2容器中看看文件是否同步过去了。
在这里插入图片描述
由图可知目录/volume1的数据会同步,但是目录/volume3不会同步,所以继承的容器之间只会同步数据卷。

此时container2-4称为子容器,container1叫作数据卷容器,也叫父容器。这样就可以实现多个容器的数据同步。容器被删除数据也不会消失,因为数据会持久化到宿主机的数据卷中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值