可能需要在容器中的可写入层存储数据,但这样会有以下缺点:
- 当容器不再运行时数据不会被持久化,如果容器外需要使用这部分数据也不容易取出。
- 当容器运行时容器的可写入层与主机偶合时分紧密,数据难以做到到处使用。
- 对可写入层写入数据时需要一个存储驱动来管理文件系统。存储驱动使用LINUX内核提供的UNION FILESSYSTEM。这种方法与使用挂载卷区方式直接写主机的文件系统相比十分消耗性能。
Docker提供三种方式从Docker主机挂载数据下容器中:Volumes ,Bind mount和tempfs mount。当不确定的时候,卷区总是最好的选择。
选择适合的挂载类型
无论使用哪种类型,数据使用上感觉和在容器中一样。在容器中显示为文件夹或者文件系统。观察他们不同的最简单的方法是
看数据放在主机的哪里。
- Volumes存储在主机文件系统中由Docker管理(/var/lib/docker/volumes/ on Linux)。Docker以外和程序没有权限修改这部分文件系统的。Volumes是Docker中最好的持久层方法。
- Bind mounts 可以放在主机的任何位置。他们甚至可以是重要的系统文件和目录。任何程序都可以对它修改。
- tmpfs mounts 是存储在主机内存中,不会被写入文件系统中。
挂载类型的细节
- Volumes:由Docker创建和管理。使用docker volume create命令创建,也可是由容器或者服务创建。
当你创建一个volume,它被存储在docker主机的一个文件夹中,当你将它持载到容器中时,这个文件夹被挂载到容器中。这和bind mounts操作是一 样的,与之不一样的是volume是由docker管理,与主机功能没有关系。
一个volume可以同时挂载到多个容器。当不有运行的容器使用它时,Docker仍然可以使用它,不会自动卸载。可以使用docker volume prune移除。
当挂载一个volume,可是有名子,也可以是匿名。匿名的在第一次挂载时主机会给一个唯一的名子。
Volumes支持volume driver,可以将数据存储在云端或者远程主机中。
- Bind mounts:从早期的Docker就有了。与Volumes相比没有限制的功能。当使用它时主机的文件或文件夹被挂载到容器中。使用主机的全路径形式引用。文件或文件夹不需要在主机中已经存在。Bind mounts拥有高性能,主要依赖主机文件系统的可用性。如果你正在开发一个新的Docker应用,建议使用命名的Volumes。你不能使用Docker CLI命令直接管理Bind mounts。
Warning:它的副作用是你可以在容器中操作(增,删,改,查)主机文件系统。
- tmpfs mounts:它不是磁盘持久层,使用的是内存。