文中内容摘自Docker官网
提醒:请务必使用root帐号,以免在后面应用系统部署时,发生权限问题。
默认情况下,保存在Docker的数据会随着Docker的关闭而消失。Docker提供三种模式可以将数据持久化:卷(Volume)、绑定挂载(bind mount)、tmpfs挂载(tmpfs mount)。
卷 保存在Docker管理的主机文件系统中 (Linux默认路径在 /var/lib/docker/volumes/
),非Docker进程不能修改这部分文件系统。卷是在Docker下最佳持久化方式。
卷由Docker创建和管理。可以使用 docker volume create 命令显式创建卷,或者在创建容器或服务期间创建卷。
创建卷时,它存储在Docker主机上的目录中。当将卷装入容器时,这个目录就是装入容器的目录。这与绑定装载的工作方式类似,只是卷由Docker管理,并且与主机的核心功能隔离。
给定的卷可以同时装入多个容器中。当没有正在运行的容器使用卷时,该卷仍可用于Docker,不会自动删除。可以使用 docker volume prune 删除未使用的卷。
装载卷时,它可以是命名的或匿名的。当匿名卷第一次装入容器时,Docker会给它们一个随机的名称,保证在给定的Docker主机中是唯一的。除了名称之外,命名卷和匿名卷的行为也相同。
卷还支持卷驱动程序的使用,它允许您将数据存储在远程主机或云提供商上,以及其他可能性。
绑定挂载 可以保存在主机系统的任何路径下。非Docker进程可以在任何时候访问这些数据。
早期提供的方案。如果您正在开发新的Docker应用程序,请考虑改用命名卷。不能使用 docker cli 命令直接管理绑定装载。使用绑定装载时,将主机上的文件或目录将装载到容器中。如果该文件或目录不存在,则自动创建。绑定挂载的性能非常好,但它们依赖于主机的文件系统。
tmpfs挂载 保存在内存中,它可以依附于主机或某个容器。
绑定挂载和卷都可以使用 -v
或 --volume 参数,只是语法上稍有不同,使用 --tmpfs 可以实现tmpfs挂载。Docker 17.06及以上版本,我们建议使用 --mount 参数,在容器和服务上实现绑定挂载和卷、tmpfs挂载,语法会更加简洁。
优势
卷
卷是在Docker容器和服务中保存数据的首选方法。卷的一些用例包括:
1. 在多个正在运行的容器之间共享数据。如果不显式创建卷,则在第一次将卷装入容器时创建卷。当容器停止或移除时,卷仍然存在。多个容器可以同时装载同一个卷,读写或只读。只有在显式删除卷时才删除它们。
2. 当Docker主机不能保证具有给定的目录或文件结构时。卷帮助您将Docker主机的配置与容器运行时分离。
3. 当您希望将容器的数据存储在远程主机或云提供程序上,而不是本地时。
4. 当您需要从一个Docker主机备份、恢复或迁移数据到另一个Docker主机时,卷是更好的选择。您可以停止使用卷的容器,然后备份卷的目录(例如/var/lib/docker/volume s/<volume name>)。
绑定挂载
一般来说,您应该尽可能使用卷。绑定装载适用于以下类型的用例:
1. 将配置文件从主机共享到容器。这就是Docker默认情况下通过将/etc/resolv.conf从主机装载到每个容器中为容器提供DNS解析的方式。
2. 在Docker主机和容器上的开发环境之间共享源代码或构建工件。例如,您可以将maven目标/目录装入容器中,并且每次在Docker主机上构建maven项目时,容器都可以访问重建的工件。
3. 如果您使用docker进行这种开发,那么您的生产dockerfile将直接将生产就绪的工件复制到映像中,而不是依赖于绑定挂载。
4. 当docker主机的文件或目录结构保证与bind挂载所需的容器一致时。
tmpfs挂载
当您不希望数据在主机或容器中持久化时,最好使用tmpfs装载。这可能是出于安全原因,或者在应用程序需要写入大量非持久状态数据时保护容器的性能。
小提示
如果将空卷装入文件或目录所在容器中的目录中,这些文件或目录将被传播(复制)到卷中。同样,如果启动容器并指定一个不存在的卷,则会为您创建一个空卷。这是预填充另一个容器所需数据的好方法。
如果将绑定挂载或非空卷挂载容器中的某个目录(其中存在某些文件或目录),这些文件或目录将被装入掩盖,就像将文件保存到Linux主机上的/mnt中,然后将USB驱动器装入 /mnt 一样。/mnt的原有内容将被USB驱动器的内容遮蔽,直到USB驱动器卸载为止。被遮蔽的文件不会被删除或更改,但在装入绑定装入或卷时无法访问。