Docker 镜像是内置的层级结构,而 Docker 容器将所有正在使用的数据都存储在容器的可写层上,该层仅在容器的生命周期内才会被持久化,也就是说,一旦容器被移除,该层就无法再访问。如果其他进程需要这些数据,那么从容器中获取这些数据也会变得非常困难。
为了无论能持久保存数据,以便即使容器不再可用,文件仍可在主机文件系统中使用,Docker 提供了两个选项:
-
Docker 卷
-
绑定挂载
但是,如果您在 Linux 上使用 Docker,您也可以使用tmpfs mount ,如果您在 Windows 上使用 Docker,您也可以使用命名管道。
在本文中,我们将介绍 docker 卷和绑定挂载以及它们在用例和有效性方面的差异。
1. Docker volume
volume是存在于主机文件系统上的目录或文件,它们被挂载到容器上,用于持久化容器生成或修改的数据。它们存储在由 Docker 专门管理的主机文件系统部分,并且不应被非 Docker 进程修改。卷是存储容器数据的最佳方式,因为它们性能高效,并且与 Docker 主机的其他功能隔离。
我们可以使用以下命令来创建 docker 卷 -:
docker volume create <volume_name>
我们可以同时将一个卷挂载到多个容器,即使它们没有被任何正在运行的容器使用,Docker 也不会删除它们。要删除卷,我们可以使用以下命令:
docker volume prune
在 Linux 文件系统中,我们可以在以下路径“ /var/lib/docker/volumes/ ”找到可用的卷,而在 Windows 中,我们可以通过在文件资源管理器中运行以下命令来获取卷的位置 :
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
要了解有关卷的更多信息以及如何将其安装到容器,请单击此处。
2.) 绑定挂载
这也是 Docker 提供的一种在本地主机上存储容器数据的机制,但使用绑定挂载挂载的目录或文件也可以被非 Docker 进程访问,并且它依赖于主机的文件系统具有特定的可用目录结构,因为它使用绝对路径进行绑定。
绑定挂载功能有限,无法通过 Docker CLI 直接管理,因此与卷相比不太受欢迎。此外,它允许容器修改主机文件系统,即创建、修改或删除重要的文件目录,这可能会影响安全性和非 Docker 进程。
3.) tmpfs 挂载
在 Linux 中使用 Docker 时,你也可以使用tmpfs挂载为容器创建存储卷。但与绑定挂载和卷不同,这种挂载是临时的,会持久保存在主机内存中。
一旦容器停止,_tmpfs_挂载将被移除,使用它存储的文件将不再可用。这种挂载的用途非常有限,仅限 Linux 用户使用。此外,它不允许在容器之间共享已挂载的数据。
4.) 命名管道
何时使用卷
以下是卷的一些潜在用例 -:
-
卷可用于以安全的方式在多个容器之间共享数据,而不会影响主机文件系统。
-
它们提供了从一个 Docker 主机到另一个 Docker 主机的便捷备份和数据迁移。
-
我们可以使用 Docker CLI 和 Docker API 轻松管理卷,但这对于绑定挂载来说是一个限制。
-
主机文件系统结构的重要性使得Docker主机配置与容器运行时解耦。
-
卷通过卷驱动程序可以将数据存储到远程主机或云提供商。
-
卷存储在 Linux 虚拟机中,因此延迟更低、吞吐量更高。它们在 Docker 桌面上性能卓越,是数据存储等写入密集型应用的更佳选择。
何时使用绑定挂载
尽管功能有限,但我们可以在以下情况下使用绑定挂载:
-
它可用于在主机和容器之间提供共享配置文件。例如,Docker 将“ /etc/resolv.conf ” 挂载到容器以进行 DNS 解析。
-
在保证主机文件系统保持一致并且挂载的卷不被非 Docker 进程访问的情况下,我们可以使用绑定挂载来存储数据。