docker存储卷
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)