docker数据存储

主要是container中的数据如何持久化的问题。

概论

有三种方式来实现:

  1. volumes
  2. bind mounts
  3. tmpfs mount(只在linux环境下,且无法持久化)

  1. 其中volumes是指 直接在宿主机的文件系统中拿出一块地方来存储docker相关数据,非docker进程应无权限触碰。
  2. bind mounts则可以存储在宿主机上的任何地方(包括重要的系统文件等),非docker进程也可以进行触碰。
  3. tmpfs mount是指存储在宿主机的内存之中,不会持久化。

详情

volumes

  1. docker volume create可用来创建一个volume
  2. 一个volume可以同时被多个container挂载,而且不会被自动清除,只有手动清除。可以通过docker volume prune来清除掉没有在用的volume。这里特别注意一点: volume只可以被显式移除
  3. volume分为anonymousnamed,一旦一个匿名volume被挂载在一个container后,便会分配一个名字给它,所以匿名与否表现都是完全一致的;
  4. 有驱动可以支持到远程volume的挂载,无论是在远程主机上还是在云上。

bind mounts

  1. docker早期就已经支持这种方式;
  2. 优点是性能较好;
  3. 缺点是隔离性太差,安全性也有一些问题,且对宿主机的文件系统目录结构有一定要求。隔离性差是因为由于操作宿主机上的文件,可能会影响其他进程;安全性是指,container可以操作系统内任意文件,包括重要的系统文件;

tmpfs mount

  1. 不会持久化存储,container结束即销毁;
  2. 一般来存储重要票据

最佳实践

什么时候用volume方式?

  1. 多个正在运行的container需要共享数据;
  2. 持久化到远程主机或云;
  3. container的数据有可能迁移。

什么时候使用bind mounts

一般来说,使用volume应该是你的第一选择。但是,以下场景可能会适合bind mounts

  1. 需要在宿主机和container之间共享系统配置文件,比如DNS解析的配置文件/etc/resolv.conf

什么时候使用tmpfs mount

  1. 非持久化场景,如票据;

一些额外小点

  1. 如果挂载一个空的volumecontainer内一个已经有文件的目录,这些文件会复制进volume;如果你在启动container的时候指定挂载一个不存在的volume,那么将会默认创建给你;
  2. 如果挂载一个非空的volume或者bind mountcontainer内一个已经有文件的目录,那么原有文件将会乱掉不可读,但不会坏也不会丢,等到解除挂载之后即可恢复正常。
Comments
Write a Comment