您的位置:首页 > 运维架构 > Docker

Docker 管理应用数据 - 存储概述

2018-03-08 23:01 681 查看
原文地址

可以将数据存储在容器的可写层中,但有一些缺点:

当容器不再运行时,数据不会持续存在,并且如果另一个进程需要数据,很难从容器中获取数据。

容器的可写层紧密耦合到容器所在的主机。无法轻松地将数据移到其他地方。

写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用 Linux 内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象性能会降低性能。

Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中:卷(volumes),绑定挂载(bind mounts)或 tmpfs 卷。如果不确定用哪一个,卷几乎总是正确的选择。请继续阅读以获取更多关于将数据挂载到容器中的机制的信息。

1. 选择合适的挂载方式

不管你选择了哪种挂载方式,数据从容器中看到的是一样的。它被暴露为容器文件系统中的目录或单个文件。

要简单的看出卷(volumes),绑定挂载(bind mounts)或 tmpfs 卷的差异,只要判断数据是否在 Docker 主机中即可。



卷存储在 Docker 管理的主机文件系统中(Linux 中的
/var/lib/docker/volumes/
)一部分。非 Docker 进程不应该编辑这一部分文件系统。卷是持久化 Docker 中的数据的最佳方式。

绑定挂载可以存储在主机系统的任何位置。甚至可以是重要的系统文件或目录。Docker 主机上的非 Docker 进程或 Docker 容器可以可以随时编辑它们。

tmpfs 挂载只会存储在主机系统的内存中,永远都不会写入文件系统。

1.1 挂载类型详情

1. 卷(volumes):

由 Docker 创建并管理。可以通过
docker volume create
命令明确的创建卷,或者可以在容器或服务创建期间创建卷。

当创建卷时,会存储到 Docker 主机的一个目录中。当把卷挂载到容器中,这个目录就会挂载到容器中。这和绑定挂载有类似的工作方式,但是卷由 Docker 管理并且与主机的核心功能隔离。

给定的卷可以同时挂载到多个容器中。当卷没有被正在运行的容器使用时,该卷仍然可用于 Docker,并且不会自动删除。可以使用
docker volume prune
删除未使用的卷。

挂载卷时,可以命名或匿名。匿名卷在首次挂载到容器中时没有指定明确的名字,因此 Docker 会为其指定在当前 Docker 主机中独一无二的随机名字。除了名字外,有名字的和匿名的卷其他特性一致。

卷也支持使用卷驱动程序,这些卷驱动程序可让你将数据存储在远程主机或云提供商中,以及其他可能性。

2. 绑定挂载(Bind mounts):

和卷相比只有很少功能。使用绑定挂载时,主机机器上的一个通过完整路径名指定的文件或目录会挂载到容器中。文件或目录不需要已经在 Docker 主机上存在。如果它尚不存在,则会根据需求创建。绑定挂载非常高效,但它们依赖于具有特定目录结构的主机的文件系统。如果你正在开发新的 Docker 应用程序,请考虑使用命名卷。不能使用 Docker CLI 命令直接管理绑定挂载。

警告:无论好坏,使用绑定挂载的一个副作用是可以通过容器中运行的进程更改主机文件系统,包括创建,修改或删除重要的系统文件或目录。这是一个强大的能力,可能会对安全产生影响,包括影响主机系统上的非 Docker 进程。

3. tmpfs 挂载:

tmpfs 挂载不会在磁盘上持久化存储,无论是在 Docker 主机上还是在容器中。它可以在容器的生命周期内由容器使用,以存储非持久状态或敏感信息。例如,在内部,swarm 服务使用 tmpfs 挂载将密码装入服务的容器中。

绑定挂载和卷都可以通过
-v
--volume
标志挂载到容器中,但是二者的语法有细微差异。对于 tmpfs 挂载,可以使用
--tmpfs
标志。然而,在 Docker 17.06 或更高版本,建议对于所有的容器或服务,对于绑定挂载、卷或 tmpfs 使用
--mount
标志,因为其语法更清晰。

2. 卷的良好用例

卷是在 Docker 容器或服务中持久化数据的首选方式。下面是卷的用例:

在多个运行中的容器之间共享数据。如果没有明确创建,卷会在第一次挂载到容器上时创建。在这个容器停止或删除时,卷依然会存在。多个容器可以同时挂载同一个卷,不管是读写或只读模式。只有在明确删除卷时,卷才会被删除。

当 Docker 主机不能保证具有给定的目录或文件结构时。卷帮助你将 Docker 主机的配置与容器运行时分离。

当需要将容器的数据存储到远程主机或云端而不是本地时。

当需要在两个 Docker 主机之间备份、再次存储或迁移数据时,卷是更好的选择。可以在停止使用卷的容器后直接备份卷所在的目录(例如
/var/lib/docker/volumes/<volume-name>
)。

3. 绑定挂载的良好用例

通常来说,只要可能就尽量使用卷。绑定挂载适合下面的场景:

从主机向容器分享配置文件。这也是 Docker 向容器提供 DNS 解决的默认方式,将主机上的
/etc/resolv.conf
挂载到每个容器。

在 Docker 主机上的开发环境和容器之间共享源代码或构建文件。例如,你可能挂载了一个 Maven
target/
目录到容器中,并且每次你在 Docker 主机上构建 Maven 项目的时候,容器会访问重新构建的文件。

如果在开发环境中这样使用 Docker,你生产环境中的 Dockerfile 会直接把可用于生产环境的代码复制到镜像中,而不是依赖一个绑定挂载。

当 Docker 主机的文件或目录结构保证与容器所需的绑定挂载一致时。

4. tmpfs 挂载的良好用例

在不需要将数据持久化到主机或容器中时,tmpfs 挂载最合适。可能是出于安全考虑或在应用程序在写大量非持久状态数据时保证容器的性能

5. 使用绑定挂载或卷的注意事项

如果使用绑定挂载或卷,注意:

如果将一个空的卷挂载到容器中的一个包含文件或目录的目录,这些文件或目录会被复制到卷中。类似的,如果启动容器时指定一个不存在的卷,则自动创建一个空的卷。这是预先填充其他容器需要的数据的好方法。

如果将绑定挂载或非空卷挂载到容器中的一个包含文件或目录的目录,则这些文件或目录会被挂载遮盖,就像先将文件保存到 Linux 主机上的
/mnt
中,然后将一个 USB 驱动器挂载到
/mnt
中一样。在卸载 USB 驱动器之前,
/mnt
中的内容将被 USB 驱动器的内容遮盖。遮盖的文件不会被删除或更改,但在装入绑定挂载或卷时不可访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: