标签:适应 log 启动 app 存在 suse 本质 device 系统
Docker为容器提供了两种存放数据的资源:
1.storage driver管理的镜像层和容器层
2。Data volume
Storage driver
之前我们学习镜像的时候知道镜像的分层结构:
盗图
容器有最上面的一个可写的容器层组成,以及若干的只读的镜像层组成,容器的数据就存放在这些只读的镜像层中,这样分层的最大特性就是Copy-on-Write:
1.新数据会直接放在最上面的容器层中;
2.修改现有数据会先从镜像层将数据复制到容器层中,修改后的数据直接保存在容器层中,镜像层不变;
3.如果多个层中有相同的命名文件,用户只能看到最上面的一层的文件
分层结构使镜像和容器的创建,共享以及分发变得非常高效,而这些都要归功于Docker storage driver。正是docker storage driver 实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图
docker 支持du多种的storage driver,有AUFS, Device Mapper,Btrfs,OverlayFS,VFS和ZFS,他们都能实现分层的架构,同时又有各自的特性,对于docker 用户来讲,具体使用那种storage driver是一个难题,因为:
1.没有那种storage driver能适应所有的场景;
2.driver本身在快速发展和迭代
不过,docker 官方给了一个简单的答案:
优先使用linux发行版默认的storage driver。
docker 安装的时候会根据当前系统的配置选择默认的driver,默认的driver具有更好的稳定性,因为默认的driver在发行版上做了严格的测试。
运行docker info查看centos默认的driver
centos/redhat默认的driver使用的是overlay,底层的文件系统是extfs
Ubuntu用的是AUFS,底层文件系统用的是extfs;
SUSE用的是Btrfs的storage driver
对于某些容器,直接将数据放在由storage driver维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可从镜像直接创建,。
比如busybox,他是一个工具箱,我们启动busybox是为了诸如wget,ping之类的命令,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器中的数据也一起被删除,下次启动新容器即可。
但对于另一类应用这种方式就不合适了,他们有持久化数据的需求,容器启动时需要加载已有的数据,容器销毁时,希望保留产生的数据,也就是说,这类容器是有状态的;
这就要用到docker的另一种存储机制:data volume。
data volume
data volume本质是docker host文件系统中的目录或文件,能够直接被mount到容器的文件系中
data volume有以下特点:
1.Data volume是目录或文件,并不是没有格式化的磁盘(块设备)
2.容器可以读写volume中的数据
3.volume数据可以被永久的保存,即使使用他的容器被永久销毁
平时运行容器的时候既有无状态的容器也有有状态的容器,我们的数据层(镜像层和容器层)和volume都可以存储数据,使用的时候该怎么选择呢?
需要考虑以下几个场景:
1.Database软件VS Database数据
2.Web应用VS应用产生的日志
3.数据分析软件VS input/output数据
4.Apache Server VS静态Html 文件
很显然这几个场景:前部分都是无状态的,可以放在数据层(镜像层和容器层),应该作为镜像的一部分
而后面的都是数据需要保存的,应该放在data volume,并且与镜像分开存放
标签:适应 log 启动 app 存在 suse 本质 device 系统
原文地址:http://www.cnblogs.com/lkun/p/7750575.html