1.  Manage data in Docker

默认情况下,所有在容器内部创建的文件被存储在一个可写的容器层。这就意味着:

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

Docker有两种方式将容器中的文件存储到主机上,这样的话即使容器停止了,文件依然被持久化下来。这两种方式分别是:volumes和bind mounts。如果你是在Linux上运行Docker,那么你还可以使用tmpfs mount。

2.  选择正确的挂载类型

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

下面这幅图可以帮助我们更好的理解 volumes 、 bind mounts 、 tmpfs 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最佳实践

一般而言,你应该尽可能地用volumes。Bind 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/

Docker管理应用数据的更多相关文章

  1. Docker 管理应用程序数据

    1.将Docker主机数据挂载到容器 Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes , bind mounts 和tmpfs volumes:  Docker管理宿主机文件 ...

  2. Docker容器和数据可视化管理工具Flocker

    Flocker 可轻松实现 Docker 容器及其数据的管理.这是一个数据卷管理器和多主机的 Docker 集群管理工具,你可以通过它来控制数据.可用来在 Docker 中运行你的数据库.查询和 K/ ...

  3. docker 管理应用程序数据和网络管理

    Volume和Bind Mount Docker提供三种不同方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs volumes:Docker管理宿主机文件系统的一部分( ...

  4. [Docker] 容器持久化数据的首选机制 Volume

    Volume 是 docker 容器生成持久化数据的首选机制.bind mounts 依赖主机机器的目录机构,volume 完全由 docker 管理.volume 较 bind mounts 有几个 ...

  5. docker 系列 - 容器数据持久化和数据共享

    docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver. stroage driver主要是存储那些无状 ...

  6. Docker Swarm volume 数据持久化

    Docker Swarm volume 数据持久化 volume 是将宿主级的目录映射到容器中,以实现数据持久化. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. v ...

  7. Docker Swarm bind 数据持久化

    Docker Swarm bind 数据持久化 bind:主要将工作节点宿主级文件或目录,同步挂载到容器中. 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节 ...

  8. docker swarm英文文档学习-9-使用Docker Configs存储配置数据

    Store configuration data using Docker Configs 使用Docker Configs存储配置数据 Docker 17.06引入了集群服务配置,允许你在服务镜像或 ...

  9. Docker管理工具 - Swarm部署记录

    之前介绍了Docker集群管理工具-Kubernetes部署记录,下面介绍另一个管理工具Swarm的用法,Swarm是Docker原生的集群管理软件,与Kubernetes比起来比较简单. Swarm ...

随机推荐

  1. 对canvas arc()中counterclockwise参数的一些误解

    一直没有很细心地去研究CanvasRenderingContext2D对象的arc方法,对它的认识比较模糊,导致犯了一些错误,特发此文,以纠正之前的错误理解. arc()方法定义如下: arc() 方 ...

  2. windows下route命令详解(转载)

    1.具体功能        该命令用于在本地IP路由表中显示和修改条目.使用不带参数的ROUTE可以显示帮助.            2.语法详解        route [-f] [-p] [co ...

  3. android启动另一应用

    http://www.2cto.com/kf/201203/122910.html Android SDK中有这样一个API: public abstract Intent getLaunchInte ...

  4. OTL中文乱码 OTL UTF8

    在用unixODBC连接MySQL的时候字符编码是由odbc支持的,不须要C++编译OTL的时候加上什么编译条件. 假设你的数据库使用的编码是UTF-8,你要从这个数据库读数据.并且还要将结果放到这个 ...

  5. java基础知识查漏 三

    一.Servlet 和Jsp的生命周期 1.Servlet生命周期       Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发 ...

  6. STL之队列的运用

    卡片游戏:非常好地介绍了队列的特点和应用 桌上有一叠牌,从第一张牌開始从上往下依次编号1~n.当至少还剩两张牌时进行例如以下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后. 输入n,输出每次 ...

  7. (转)live555学习笔记10-h264 RTP传输详解(2)

    参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...

  8. jmeter之java请求

    通常情况下,推荐使用jmeter之java请求编写一beashell调用java代码(上篇)(推荐)编写Java 请求 有以下优势 脚本易维护 易调试 开发脚本周期短 不过网上扩展java请求文章比较 ...

  9. Looksery Cup 2015 C. The Game Of Parity —— 博弈

    题目链接:http://codeforces.com/problemset/problem/549/C C. The Game Of Parity time limit per test 1 seco ...

  10. Codeforces Round #304 (Div. 2) C. Soldier and Cards —— 模拟题,队列

    题目链接:http://codeforces.com/problemset/problem/546/C 题解: 用两个队列模拟过程就可以了. 特殊的地方是:1.如果等大,那么两张牌都丢弃 : 2.如果 ...