docker管理数据(一):如何管理数据

介绍

为什么需要着重讲一讲docker中的数据管理,在实际的运行过程中,经常需要存储一些配置信息,程序运行中产生的信息,这些都是需要持久化的数据。可以将这些数据写入容器的文件层中,这样的方式有很多的缺点:

  • 当容器生命周期结束之后,这些数据也会同步丢失;对于存储在容器文件层中的数据,从容器外获取非常的不方便。
  • 容器的可写层和宿主机的耦合非常的严重,很难一致到别的地方执行。
  • 将数据写入可写层需要storage driver的支持,这种方式和使用volumes相比,会有极大的性能损失。

Docker提供三种不同的方式将宿主机的文件映射到容器内部,用于读写数据:

  • volumes
  • bind mounts
  • tmpfs

当你不确定使用那一种方式的时候,volumes总会是一种不错的选择。

选择合适的存储

不管选择哪一种数据存储方式,在容器内部,这些数据的使用方式是一致的。要么以文件夹的方式,要么以文件的方式在容器内部展现。

下面这幅图清楚的展示了三种方式存储数据的不同:

  • Volumes:数据存储在由Docker管理的宿主机的文件系统上( /var/lib/docker/volumes/),非Docker进程不能修改这一部分的内容。Volumes是最好的管理数据的方式。
  • Bind mounts:数据存储在宿主机的任何地方,非Docker进程也可以修改这些区域的数据。
  • tmpfs:数据存储在宿主机的内存中,并不会持久化到磁盘上。

什么时候选择volumes

Volumes始终是推荐的管理数据的方式,一些典型的应用场景如下:

  • 在多个运行的容器之间共享数据。如果你没有显示的创建它,volume会在第一次被mounted到一个容器的时候自动创建。当容器停止甚至被删除,volume仍然会被保存。多个容器可以同时mounted到同一个volume,可以分配读写或者只读权限。volume只会被显示的删除。
  • 当容器的宿主机无法保证一个存在的文件或者文件目录。volumes帮助宿主机的配置和容器运行时的解耦。
  • 当数据不想保存在本地,需要保存到一个远程机器或者是云上。
  • 当需要从一台宿主机备份、恢复、迁移数据到另外一台宿主机时,volumes是一个很好的选择。

什么时候选择bind mounts

一般情况下请选择使用volumes,在如下情况可以选择bind mounts:

  • 从宿主机共享配置文件到容器。Docker使用这种方式向各个容器共享DNS配置文件/etc/resolv.conf
  • 将开发环境的源码以及编译的文件共享给容器。例如,可以将maven的target/目录共享给容器,每一次编译工程之后,容器内部就可以从新构建服务。如果这种开发步骤,production Dockerfile需要直接拷贝production-ready artifacts

什么时候选择tmpfs

当既不想持久化数据到宿主机,也不想持久化到容器内部可以使用tmpfs。例如,当你的应用程序需要输出大量的状态数据,为了性能或者安全性考虑并不想持久化这些数据时,可以使用tmpfs。

一点小建议

无论使用volume或者mounts,记住以下几点:

  • 如果你映射一个空的volume到容器内部某一个已存在的文件或者文件夹,这些文件或者文件夹会被拷贝到volume中。相似的,如果你启动一个容器,指定一个不存在的volume,会为你创建一个空的volume。这是一种很好的为容器初始化数据的方式。
  • 如果你映射一个非空的volume,或者bind mount到容器内部某一个已存在的文件或者文件夹,这些文件或者文件夹会变成暂时不可访问,直到解除mount关系,这些文件或者文件夹是不会被删除的。
Comentarios