学习 Docker,第 6 部分:处理数据

在今天有关 Docker 的一系列材料的翻译部分中,我们将讨论如何处理数据。 特别是关于 Docker 卷。 在这些材料中,我们不断地将 Docker 编程机制与各种可食用的类比进行比较。 我们不会在这里背离这一传统。 让 Docker 中的数据成为香料。 世界上有很多香料,Docker 有很多处理数据的方法。

第 1 部分:基础知识
第 2 部分:术语和概念
第 3 部分:Dockerfile
第 4 部分:减小图像大小并加快其组装速度
第 5 部分:命令
第 6 部分:处理数据

学习 Docker,第 6 部分:处理数据

请注意,本材料是使用 Docker 引擎版本 18.09.1 和 API 版本准备的 1.39.

Docker 中的数据可以临时存储,也可以永久存储。 让我们从临时数据开始。

临时数据存储

有两种方法可以管理 Docker 容器中的临时数据。

默认情况下,容器中运行的应用程序创建的文件存储在可写容器层中。 为了使该机制发挥作用,无需进行任何特殊配置。 事实证明,它既便宜又令人愉快。 应用程序只需要保存数据并继续做自己的事情。 然而,当容器不复存在后,用这种简单方式保存的数据也会消失。

Docker 中的临时文件存储是另一种解决方案,适用于与使用标准临时数据存储机制可实现的性能相比需要更高级别性能的情况。 如果您不需要将数据存储的时间长于容器存在的时间,则可以连接到容器 tmpfs - 一种使用主机 RAM 的临时信息存储。 这将加快数据写入和读取操作的执行速度。

经常发生这样的情况:即使容器不复存在,数据也需要存储。 为此,我们需要持久的数据存储机制。

持久数据存储

有两种方法可以使数据生命周期长于容器生命周期。 一种方法是使用绑定安装技术。 例如,通过这种方法,您可以将现实文件夹挂载到容器中。 Docker 外部的进程也能够使用存储在此类文件夹中的数据。 这就是如何 tmpfs挂载和绑定挂载技术。

学习 Docker,第 6 部分:处理数据
挂载 tmpfs 并绑定挂载

使用绑定挂载技术的缺点是它的使用使数据备份、数据迁移、多个容器之间的数据共享变得复杂。 使用 Docker 卷进行持久数据存储要好得多。

卷 Docker

卷是位于容器外部的主机上的文件系统。 卷由 Docker 创建和管理。 以下是 Docker 卷的主要属性:

  • 它们是永久存储信息的一种手段。
  • 它们是独立的并且与容器分开。
  • 它们可以在不同的容器之间共享。
  • 它们允许您组织有效的数据读取和写入。
  • 卷可以放置在远程云提供商的资源上。
  • 它们可以被加密。
  • 他们可以被命名。
  • 容器可以安排用数据预先填充卷。
  • 它们便于测试。

如您所见,Docker 卷具有惊人的属性。 让我们谈谈如何创建它们。

创建卷

可以使用 Docker 或 API 请求创建卷。

这是 Dockerfile 中的一条指令,允许您在启动容器时创建卷。

VOLUME /my_volume

当使用类似的指令时,Docker在创建容器后,将创建一个卷,其中包含指定位置中已存在的数据。 请注意,如果您使用 Dockerfile 创建卷,这并不能免除您指定卷的安装点的需要。

您还可以使用 JSON 格式在 Dockerfile 中创建卷。

此外,可以在容器运行时使用命令行工具创建卷。

从命令行使用卷

▍体积创建

您可以使用以下命令创建独立卷:

docker volume create —-name my_volume

▍了解卷的信息

要查看 Docker 卷的列表,请使用以下命令:

docker volume ls

您可以像这样探索特定卷:

docker volume inspect my_volume

▍删除卷

您可以像这样删除卷:

docker volume rm my_volume

为了删除容器未使用的所有卷,您可以使用以下命令:

docker volume prune

在删除卷之前,Docker 会要求您确认此操作。

如果卷与容器关联,则在删除相应容器之前无法删除该卷。 同时,即使容器被移除,Docker也并不总是理解这一点。 如果发生这种情况,您可以使用以下命令:

docker system prune

它旨在清理 Docker 资源。 执行此命令后,您应该能够删除之前状态不正确的卷。

--mount 和 --volume 标志

要使用卷,当您调用命令时 docker,您经常需要使用标志。 例如,为了在容器创建期间创建卷,您可以使用以下构造:

docker container run --mount source=my_volume, target=/container/path/for/volume my_image

在古代(直到2017年),国旗很流行 --volume。 最初,这个标志(也可以缩写形式使用,那么它看起来像 -v) 用于独立容器,并且标志 --mount - 在 Docker Swarm 环境中。 然而,从 Docker 17.06 开始,该标志 --mount 可以在任何场景下使用。

使用标志时需要注意的是 --mount 必须在命令中指定的附加数据量会增加,但是,出于多种原因,最好使用此特定标志,而不是 --volume。 旗帜 --mount 是允许您使用服务或指定卷驱动程序选项的唯一机制。 此外,该标志更易于使用。

在现有的Docker数据操作命令示例中,可以看到很多使用flag的例子 -v。 当尝试为自己调整这些命令时,请记住这些标志 --mount и --volume 使用不同的参数格式。 也就是说,你不能简单地替换 -v--mount 并组建一个工作团队。

之间的主要区别 --mount и --volume 是当使用标志时 --volume 所有参数都收集在一个字段中,并且在使用时 --mount 参数是分开的。

使用时 --mount 参数表示为键值对,即,它看起来像 key=value。 这些对以逗号分隔。 以下是常用的选项 --mount:

  • type — 安装类型。 对应键的值可以是 绑定, 体积 или 临时文件系统。 我们这里谈论的是数量,也就是说,我们感兴趣的是价值 volume.
  • source - 安装源。 对于命名卷,这是卷的名称。 对于未命名卷,未指定此键。 它可以缩短为 src.
  • destination - 文件或文件夹在容器中安装的路径。 该键可以缩短为 dst или target.
  • readonly - 安装所需的卷 仅供阅读。 该键的使用是可选的,并且没有为其分配任何值。

这是一个用法示例 --mount 有很多选择:

docker run --mount type=volume,source=volume_name,destination=/path/in/container,readonly my_image

结果

以下是使用 Docker 卷时可以使用的一些有用命令:

  • docker volume create
  • docker volume ls
  • docker volume inspect
  • docker volume rm
  • docker volume prune

以下是常用选项的列表 --mount,适用于以下形式的命令 docker run --mount my_options my_image:

  • type=volume
  • source=volume_name
  • destination=/path/in/container
  • readonly

现在我们已经完成了这个 Docker 系列,是时候谈谈 Docker 学习者下一步可以去哪里了。 这里 关于 Docker 的好文章。 这里 有关 Docker 的书籍(购买本书时,请尝试获取最新版本)。 这里 另一本书适合那些认为实践是学习技术的最佳方式的人。

亲爱的读者! 您会推荐哪些 Docker 材料供初学者学习?

学习 Docker,第 6 部分:处理数据

来源: habr.com

添加评论