openshift

container的存储

2018-10-27  本文已影响34人  wangxiaoxi

container 存储是临时的,也就是说当这个container被删除之后,所有的内容都不会保留。容器化的应用总是被假设在一个空的存储上运行,这就使的创建和销毁容器非常简单。

然而,如果容器重启前后需要数据一致,则仅有临时的container的存储是不够的,像数据库。为了支撑这些应用,则需要为container提供持续化存储。

一个正在运行的container实际上是在其base container image上重新建了一层,这一层就是container storage. 首先,这一层是仅供该容器读写,创建工作文件,临时文件和日志文件等。这些文件是变化的,这些文件的丢失不会影响到container中的application. container的storage层是独属当前所运行的容器的。即使是基于同一个image创建的container也不会共享这个storage而是拥有各自的。

容器化的应用不应该用container storage去存储持久化的数据。因为呈程序本身不能控制这些数据会被保存多久。尽管这样作有时候也可以保持一段时间。

docker会保留已经停止的container一段时间,以便于调试和定位问题,例如docker logs去查log等。但是container storage是一个临时观念。重启container,将会获取一个新的container storage.

docker 进程可以申请绑定host上的目录到一个正在运行的container. 这个host目录可以看成这个容器化程序的container storage的一部分,就像一个远端的网络卷,可以看成这个container文件系统的一部分,但是这个host的目录当container停止的时候不会被回收而可被其他container利用。

例如。一个数据库container可以在启动的时候绑定一个host目录去存储数据库文件。如果这个数据库的容器挂了,我们可以重新创建一个container绑定同一个host目录,已保证数据库数据持续可用。而对数据库container而言,host目录的路径并不重要,因为对container而言,它使用的路径而是挂载后的路径。

但是我们需要注意host目录的权限。container的作为操作系统中的进程同样是基于userID和groupID的,所以请却到该进程的用户可以访问这个host目录。

在RHEL,这个host目录还需要配置合适的SELinux上下文,可通过类似“chcon -t svirt_sandbox_file_t /var/dbfiles”的命令来实现。

等创建和配置了host目录后,我们就可以用“-v”指令挂载到container了。

例如,host目录为"/var/dbfiles", 我们预期其在container内部为“/var/lib/mysql",则我们可以用命令 “docker run -v /var/dbfiles:/var/lib/mysql mysql”来实现。

上一篇 下一篇

猜你喜欢

热点阅读