Docker管理应用数据

1.  Manage data in Dockerdocker

默认状况下,全部在容器内部建立的文件被存储在一个可写的容器层。这就意味着:安全

  • 当容器不存在的时候,数据不能被持久化,并且在容器外部想要读取这些数据十分困难。
  • 容器的可写的层与运行容器的主机密切相关。你不能轻易地移动数据。
  • 要想把数据写到容器的可写层,须要一个存储驱动来管理文件系统。存储驱动提供一个文件系统供Linux内核调用。

Docker有两种方式将容器中的文件存储到主机上,这样的话即便容器中止了,文件依然被持久化下来。这两种方式分别是:volumesbind mounts。若是你是在Linux上运行Docker,那么你还能够使用tmpfs mount性能

2.  选择正确的挂载类型spa

不管你选择哪一种挂载类型,数据看起来是同样的。它以目录或者容器的文件系统中的单个文件的形式暴露出来。blog

下面这幅图能够帮助咱们更好的理解 volumesbind mountstmpfs mounts 三者的区别生命周期

  • Volumes 存储在由Docker管理的主机文件系统的一部分中(在Linux中是 /var/lib/docker/volumes/ )。非Docker进程不该该去修改这部分文件系统。Volumes是在Docker上持久化数据最好的方式。
  • Bind mounts 数据能够被储存在主机的任何地方。它们甚至多是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程能够随时修改它们。
  • tmpfs mounts 数据只会被存储到主机的内存中,并且历来不会写到文件系统上。

3.  关于挂载类型进程

Volumes内存

Volumes由Docker建立并管理。你能够用docker volume create命令显式地建立一个volume,或者在容器或服务建立的时候建立一个volume。开发

当你建立了一个volume之后,它被存储到Docker主机上的一个目录下。当你挂载这个volume到一个容器的时候,这个目录就是挂载到容器中的目录。这种方式跟bind mounts很像,除了volumes被Docker管理并与主机的核心功能隔离之外。文档

一个volume能够同时挂载到多个容器中。当没有一个运行中的容器使用这个volume的时候,这个volume仍然是可用的,而且不会被自动删除。你能够用docker volume prune命令删除未使用的volumes。

当你挂载一个volume的时候,它多是被命名的或者匿名的。匿名的volumes在它首次被挂载到一个容器中的时候不会被指定一个明确的名字,所以Docker给它们一个随机的名字,以保证它在Docker主机中是惟一的。关于名字,命名的和匿名的volumes在使用上是同样的。

Volumes也支持volume驱动,能够运行你存储数据到远程主机或云上。

Bind mounts

volumes相比,bind mounts有一些功能限制。当你使用bind mount的时候,主机上的一个文件或目录被挂载到一个容器。这个文件或目录关联主机上的绝对路径。这个文件或目录不须要事先在Docker主机上存在,若是没有则会自动在后台建立。Bind mounts的性能很是好,但它依赖于主机的文件系统上有一个特定的目录结构可用。若是你正在开发一个新的Docker应用,建议用volumes。你不能直接用Docker命令来直接管理bind mounts

tmpfs mounts

一个tmpfs挂载不会持久化数据到磁盘,不管是在Docker主机上仍是在容器中。容器能够在容器的生命周期中使用它来存储非持久性状态或敏感信息。例如,在内部,群集服务使用tmpfs挂载来将秘钥挂载到服务的容器中。

4.  volumes最佳实践

Volumes是在Docker容器和服务中保存数据的首选方式。使用volumes的一些场景:

  • 在多个运行的容器之间共享数据。若是你没有显式地建立一个volume,那么在它首次被挂载到一个容器中的时候会被自动建立。当容器中止或被删除之后,这个volume仍然存在。多个容器能够挂载同一个volume,能够是读写或只读的。只有当你显式地删除volumes的时候它们才会被删除。
  • Docker主机不保证有一个给定的目录或文件结构。Volumes解耦从容器运行时到Docker主机之间的配置。
  • 当你想要存储你的容器的数据到一个远程主机或云上,而不是本地
  • 当你须要备份、恢复,或者将数据从一个Docker主机移动到另外一个Docker主机的时候,volumes是最好的选择。你能够中止正在使用这个volume的容器,而后备份这个volume的目录(例如:/var/lib/docker/volumes/<volume-name>)

5.  bind mounts最佳实践

通常而言,你应该尽量地用volumesBind mounts适用于下列情形:

  • 在主机和容器之间共享配置。默认状况下,经过挂载/etc/resolv.conf到每一个容器上,Docker提供DNS解析到容器。
  • 在Docker主机和容器之间开发环境共享源代码和构建artifacts。例如,你可能挂载一个Maven的target/目录到一个容器,而且每次你在Docker主机上构建Maven工程的时候,这个容器能够得到构建后的artifacts。
  • 当保证Docker主机的文件或目录结构与容器所需的bind mounts一致时。

6.  tmpfs mounts最佳实践

当你不想要数据持久化到主机或容器的时候,tmps mounts是最好的选择。这多是出于安全缘由,或者是为了在应用程序须要编写大量非持久性状态数据时保护容器的性能。

7.  文档

https://docs.docker.com/storage/

https://docs.docker.com/storage/volumes/

相关文章
相关标签/搜索