docker存储卷

时间:2020-06-02 16:10:36   收藏:0   阅读:91

docker的两类存储资源

docker为容器提供了两种存放数据的资源

          1:由storage driver 管理的镜像层和容器层

          2:Data Volume。

storage driver

docker 镜像的分层结构

技术图片

 

 

 

运行docker info 查看centos 的默认driver:

技术图片

 

 

data volume之bind mount

storage driver和data volume是容器存放数据的两种方式。

data volume本质上是docker host 文件系统中的目录或者文件,能够直接被mount到容器文件系统中

特点:

1:data volume 是目录或者文件,而非没有格式化的磁盘(块设备)

2:容器可以读写 volume中的数据。

3:volume数据可以被永久的保存,即使使用它的容器已经销毁

这是需要持久化的数据,并且应该与镜像分开存放。

在使用上docker提供了两种类型的volume:

1:bind mount

2:docker managed volume。

bind mount

bind mount 是将 host上已存在的目录或者文件mount到容器。

我们先在宿主机上创建一个名字为html的文件夹里面随意写一个html文件

mkdir /html

echo “caoyi666” >/html/index.html

技术图片

 

 然后我们通过-v将其mount到nginx容器上:

技术图片

 

 技术图片

 

现在我们修改一下html文件

技术图片

 

 技术图片

 

 可以看出修改生效了,bind mount 可以让host 与容器共享数据,这在管理上是非常方便的

下面我们将容器销毁,看看对bind mount 有什么影响:

技术图片

 

 可见,即使我们把容器给删除了bind mount还是存在的

技术图片

 

 现在我们进入容器里面修改一下nginx的html文件看看是否可以修改成功

技术图片

 

 可以看到修改成功了,然后我们再访问一下看是否生效

 

技术图片

 

 上图可以看出已经生效了,如果我们不允许修改容器里面html的内容我们可以这样做

技术图片

 

 只需要在跑容器的时候给个只读权限ro即可

 

 

我们除了可以挂载一个目录,还可以单独挂载一个文件

技术图片

 

 单独使用一个文件的时候我们需要注意的是host中的源文件必须要存在,不然的话会当做一个新的目录bind mount给容器

docker managed volume

docker managed volume与bind mount 在使用上最大的区别是不需要指定mount源,指定mount point即可

 

技术图片

 

 我们通过-v告诉docker需要一个data volume ,并且将其mount到/usr/share/nginx/html.这个data volume具体在哪里我们可以使用docker inspect查看

 

技术图片

 

 

 

技术图片

 

 

 

source就是volume在host上的目录。

当我们容器申请mount docker managed volume时docker都会在/var/lib/docker/volumes下生成一个目录

技术图片

 

 这个目录就是mount源

docker managed volume 的创建过程:

1:容器启动时,简单的告诉docker我需要一个volume存放数据帮我mount到目录/abc

2:docker在/var/lib/docker/volumes中生成一个随机目录作为mount源。

3:如果/abc已经存在,则将数据复制到mount源。

4:将volume mount 到/abc

我们除了可以通过docker inspect查看volume以外,还可以使用docker volume 命令

技术图片

 

 现在我们将两种data volume 做个比对

技术图片

 

 容器与host共享数据

技术图片

 

 

技术图片

 

 可以看出现在只有两个html现在我们开始复制

技术图片

 

 技术图片

 

 上图可以看出已经复制过来了

docker cp 可以在容器和host之间拷贝数据,当然我们也可以直接通过linux  cp过去

 

 

容器之间共享数据

第一种方法是将共享数据放在bind mount当中,然后将其mount到多个容器,

我们创建三个nginx组成的webserver集群

技术图片

 

 技术图片

 

 现在我们修改html文件

技术图片

 

 发现可以同步

另外一种容器之间的共享数据方式是使用volume container

他提供的卷可以是 bind mount 也可以是docker managed volume 下面我们创建一个volume container:

技术图片

 

 我们将容器命名为vc_data 注意这里执行的是docker create命令,这是应为volume container的作用只是提供数据,它本身是不需要处于运行状态,容器mount乐两个volume:

1:bind mount,存放 web server 的静态文件

2:docker managed volume, 存放一些实用工具

通过docker inspect 可以查看到这两个volume。

技术图片

 

 其他的容器可以通过--volumes-from 实用vc_data这个volume container:

技术图片

 

 三个nginx容器都实用乐vc_data 看看他们都有哪些volume

技术图片

 

 验证效果

技术图片

 

 可见,三个容器已经陈宫的共享乐volume container中volume

技术图片

 

 data-packed volume container

原理是将数据打包到镜像中然后通过docker managed volume 共享

我们用下面的dockerfile构建镜像

技术图片

 

 

build新镜像

技术图片

 

 用新的镜像创建nginx—new

技术图片

 

 因为在dockerfile已经实用乐volume指令吗,这里就不需要指定volume的mount point了,启动容器并且使用 nginx_new volume container:

技术图片

 

 删除

技术图片

 

 如果想批量删除可以使用

docker volume rm $(docker volume ls -q)

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!