Docker容器数据卷

1、什么是容器数据卷

docker的理念: 将应用和环境打包成一个镜像。
问题: docker将应用和环境打包成一个镜像,运行镜像时就启动容器应用,应用一般会有数据,如果数据都在容器中,那么我们删除容器,就会将数据也一起删除。
比如一个mysql容器,容器删除了,如果mysql数据也在容器中,也会一并删除,那就真的是删库跑路了。
需求: 数据可以持久化到本地或者数据可以在容器间共享。即容器和本地或容器之间,可以有一种数据共享技术,Docker容器中产生的数据,可以同步到本地或者容器间共享,这就是容器卷技术。
容器数据卷: 将容器内的目录挂载在本地或容器间,实现容器的持久化和同步操作。

2、使用数据卷

2.1 命令挂载

启动容器时,直接使用命令来挂载 -v

docker run -v 主机目录:容器目录

测试:
首先确保本地home目录没有内容:
在这里插入图片描述
启动容器,挂载目录:

# 将容器的/home目录挂载到本地的/home/cesi/目录
docker run -it -v /home/ceshi/:/home 5d0da3dc9764 /bin/bash

在这里插入图片描述
同时打开一个本地的窗口,查看/home目录,发现多了一个ceshi的目录:
在这里插入图片描述
我们也可以使用docker inspect命令查看容器信息:

docker inspect 7015076795b4

在容器信息中可以看到容器挂载信息,如下图显示挂载信:
在这里插入图片描述在这里插入图片描述

这样本地和容器就目录就挂载成功,在这两个目录做的变更都能双向同步,我们测试下,在容器home目录下新建一个test.java文件,本地什么都不做,在home/ceshi/目录下就可以同步test.java,如下图:
在这里插入图片描述
这是新增操作,如果我们将容器停止了,在本地文件编辑test.java,重新启动容器,会不会同步呢?
1、停止容器
2、在本地编辑文件
3、启动容器
4、数据可以同步
在这里插入图片描述
优势:这样挂载之后,我们就可以在本地目录修改,容器内目录会自动同步。这就是容器数据卷最简单的应用。

2.1.1 具名和匿名挂载

匿名挂载 :
-v 容器内路径,在-v后面只写了容器内路径,没有写本地路径

docker run -d -P -v /etc/nginx --name nginx01 容器ID

查看所有volume情况:

docker volume ls

在这里插入图片描述
具名挂载:
-v 容器内路径,在-v后面写卷名称:卷名:容器内路径

docker run -d -P --name nginx01 -v alinx:/etc/nginx nginx

在这里插入图片描述
查看所有volume情况:
在这里插入图片描述
查看以下这个卷:
在这里插入图片描述
所有的docker容器内的卷,如果没有指定目录,都在/var/lib/docker/volumes/xxx/_data目录下。
通过具名挂载,可以方便的找到一个卷,大多数情况都这使用,不建议用匿名挂载。

如何确定是具名挂载还是匿名挂载,还是指定路径挂载?

-v 容器内路径   #匿名挂载
-v 卷名:容器内路径   #具名挂载
-v /宿主机路径:容器内路径    #指定路径挂载
2.2 DockerFile挂载

通过Dockerfile可以构建镜像,镜像是一层一层构建的,每一个命令都是一层。

  1. 构建一个Dockerfile文件
    文件名可以随意,但是建议使用Dockerfile,如果不是Dockerfile,在build镜像时,需要使用-f指定构建文件。
# 文件内容
FROM centos:7

VOLUME ["volume1","volume2"]

CMD "---- buile end-----"

CMD /bin/bash

在这里插入图片描述

  1. 用Dockerfile创建镜像
# 注意最后的 .
docker build -f Dockerfile1 -t alinx/centos:1.0 .

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 启动容器
docker run -it e44472b75d8d /bin/bash

在这里插入图片描述
这个用Dockerfile构建自动挂载的数据卷目录一定和宿主机有一个同步的目录。

  1. 测试

在容器的volume1目录创建一个文件:
在这里插入图片描述
退出容器,查看容器信息:
在这里插入图片描述
在这里插入图片描述
查看刚才在容器的volume1创建的文件时候同步到宿主机挂载目录:
在这里插入图片描述

2.3、 数据卷容器

数据卷不当可以实现容器和宿主机的目录挂载数据同步,还可以实现两个容器的数据卷数据同步。
在这里插入图片描述
测试:
还是使用上面Dockerfile构建的镜像,创建3个容器:
在这里插入图片描述
使用Ctrl+p+q,不退出这个容器:
在这里插入图片描述
创建第二个容器:

# 使用--volumes-from 挂载目录
docker run -it --name docker02 --volumes-from docker01 e44472b75d8d

在这里插入图片描述
这样我们就可以在docker01创建一个文件,测试是否同步到docker02:
在docker01创建一个文件:
在这里插入图片描述
可以看到,docker02自动同步了docker01创建的文件:
在这里插入图片描述
再启动一个docker03的容器:
在这里插入图片描述
删除测试:
删除docker01,那docker02和docker03的数据是否还在呢?
首先停止docker01,docker02和docker03的数据依然存在:
在这里插入图片描述
删除docker02,查看docker02和docker03的数据一样存在:
在这里插入图片描述
从上面的测试可以知道,数据是拷贝的,而不是有一个中心共享,如果是共享,删除docker01后,数据应该不存在:
在这里插入图片描述
数据卷容器一般应用于多个mydql数据库实现数据的共享。
在这里插入图片描述
总结:容器之间数据信息的传递,数据卷容器的生命周期一直持续到所有容器都删除。但是一旦持久化到本地(宿主机),就算所有容器都删除了,本地的数据是不会删除的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alinlx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值