Docker的两类存储资源
Docker为容器提供了两种存放数据的资源
- 由storage driver管理的镜像层和容器层
- Data Volume。
存储卷作用
优点是容器中进程所生成的数据,都保存在存储卷上,从而脱离容器文件系统自身后,当容器被关闭甚至被删除时,都不用担心数据被丢失,实现数据可以脱离容器生命周期而持久,当再次重建容器时,如果可以让它使用到或者关联到同一个存储卷上时,再创建容器,虽然不是之前的容器,但是数据还是那个数据,特别类似于进程的运行逻辑,进程本身不保存任何的数据,数据都在进程之外的文件系统上,或者是专业的存储服务之上,所以进程每次停止,只是保存程序文件,对于容器也是一样;容器就是一个有生命周期的动态对象来使用,容器关闭就是容器删除的时候,但是它底层的镜像文件还是存在的,可以基于镜像再重新启动容器。
但是容器有一个问题,一般与进程的启动不太一样,就是容器启动时选项比较多,如果下次再启动时,很容器会忘记它启动时的选项,所以最好有一个文件来保存容器的启动,这就是容器编排工具的作用。一般情况下,是使用命令来启动操作docker,但是可以通过文件来读,也就读文件来启动,读所需要的存储卷等,但是它也只是操作一个容器,这也是需要专业的容器编排工具的原因。
另一个优势就是容器就可以不置于启动在那台主机之上了,如几台主机后面挂载一个NFS,在各自主机上创建容器,而容器上通过关联到宿主机的某个目录上,而这个目录也是NFS所挂载的目录中,这样容器如果停止或者是删除都可以不限制于只能在原先的宿主机上启动才可以,可以实现全集群范围内调试容器的使用,当再分配存储、计算资源时,就不会再局限于单机之上,可以在集群范围内建立起来,基本各种docker的编排工具都能实现此功能,但是后面严重依赖于共享存储的使用。
运行docker info查看容器的driver
- data volume
本质上是文件系统中的目录或文件,能够直接挂载到容器的文件系统中,有以下几个特点
- 可以是文件或者目录,而不是没有格式化的磁盘(块设备);
- 容器可以读写volume中的数据;
- 数据可以被永久保存,即使容器被销毁。
因为是持久化的数据,所以需要和镜像分开存放。
在具体的使用上,docker提供了两种类型的volume:
bind mount和docker managed colume,
我们一个一个来说,直接操作
- bind mount
1、下载一个httpd镜像,并启动
curl的是httpd默认的主页
2、创建一个目录,写一个简单网页,挂载给容器
使用-v 选项 把我们刚刚写的/data/挂载到了httpd这个容器上,/usr/local/apache/htdocs/是这个容器默认存放网页的地方。Curl完以后返回了我们编写的index.html,这就实现了bind mount。
- docker managed volume
跟上面不一样的地方就是-v 后面不用指定本地目录,直接写容器的目录。
- docker run -dit -p 80 -v /usr/local/apache2/htdocs/ --name test2 httpd
启动过后,在/var/lib/docker/volume目录中会多一个容器的文件
进入里面会有我们指定容器的/usr/local/apache2/htdocs中的文件,可以修改这个文件,创建新文件等,来达到资源共享的目的
如果不知道目录在哪可以执行这条命令
docker inspect test2 | grep Source
- 另外一种比较省事的方法。
就是我们直接手动做一个容器,把我们要用的数据存放到这个容器中,在启动其它容器时,只要继承这个容器就可以实现了。
docker create --name box -v /data/:/usr/local/apache2/htdocs/ -v /data/ busybox
这个容器可以不用启动,我们使用data挂载到了box容器中,那么其他容器只要继承box容器,就可以共同使用/data/目录中的文件
使用 –volumes-from [container]选项
- 销毁
可以删除不再需要的volume,但一定要知道自己在干嘛,一旦删除就找不回来了。销毁卷的工作只能交给host,因为docker容器是没法销毁的。
我们在使用docker rm删除容器时,那么这个容器所用到的volume是不会删除的,遗留下来的我们叫它孤儿卷。
只要在删除容器时加上-v选项就可以把容器使用的volume一起销毁啦。