docker存储卷

docker的两类存储资源

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

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

          2:Data Volume。

storage driver

docker 镜像的分层结构

docker存储卷

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

docker存储卷

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

docker存储卷

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

docker存储卷

 docker存储卷

现在我们修改一下html文件

docker存储卷

 docker存储卷

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

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

docker存储卷

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

docker存储卷

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

docker存储卷

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

docker存储卷

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

docker存储卷

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

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

docker存储卷

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

docker managed volume

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

docker存储卷

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

docker存储卷

docker存储卷

source就是volume在host上的目录。

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

docker存储卷

 这个目录就是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 命令

docker存储卷

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

docker存储卷

 容器与host共享数据

docker存储卷

docker存储卷

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

docker存储卷

 docker存储卷

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

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

容器之间共享数据

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

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

docker存储卷

 docker存储卷

 现在我们修改html文件

docker存储卷

 发现可以同步

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

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

docker存储卷

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

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

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

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

docker存储卷

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

docker存储卷

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

docker存储卷

 验证效果

docker存储卷

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

docker存储卷

 data-packed volume container

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

我们用下面的dockerfile构建镜像

docker存储卷

build新镜像

docker存储卷

 用新的镜像创建nginx—new

docker存储卷

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

docker存储卷

 删除

docker存储卷

 如果想批量删除可以使用

docker volume rm $(docker volume ls -q)