tmpfs 挂载

绑定挂载 允许您在主机和容器之间共享文件,以便在容器停止后仍能保留数据。

如果您在Linux上运行Docker,您还有第三种选择:tmpfs挂载。 当您使用tmpfs挂载创建容器时,容器可以在容器的可写层之外创建文件。

与卷和绑定挂载不同,tmpfs 挂载是临时的,仅持久化在主机内存中。当容器停止时,tmpfs 挂载会被移除,写入其中的文件不会被持久化。

tmpfs 挂载最适合用于不希望数据在主机或容器内持久化的情况。这可能是出于安全原因,或者在您的应用程序需要写入大量非持久状态数据时,为了保护容器的性能。

重要

Docker 中的 tmpfs 挂载直接映射到 Linux 内核中的 tmpfs。因此, 临时数据可能会被写入交换文件,从而持久化到 文件系统。

挂载到现有数据上

如果您在容器中创建一个 tmpfs 挂载到包含文件或目录的目录中,预先存在的文件会被挂载所遮挡。这类似于在 Linux 主机上将文件保存到 /mnt 中,然后将 USB 驱动器挂载到 /mnt/mnt 的内容会被 USB 驱动器的内容所遮挡,直到 USB 驱动器被卸载。

使用容器时,没有直接的方法来移除挂载以重新显示被隐藏的文件。最好的选择是重新创建不包含该挂载的容器。

tmpfs 挂载的限制

  • 与卷和绑定挂载不同,您不能在容器之间共享 tmpfs 挂载。
  • 此功能仅在您在 Linux 上运行 Docker 时可用。
  • 在 tmpfs 上设置权限可能会导致它们在 容器重启后重置。在某些情况下 设置 uid/gid 可以作为一种变通方法。

语法

要使用 docker run 命令挂载 tmpfs,您可以使用 --mount--tmpfs 标志。

$ docker run --mount type=tmpfs,dst=<mount-path>
$ docker run --tmpfs <mount-path>

通常情况下,首选 --mount。主要区别在于 --mount 标志更明确,并支持所有可用选项。

--tmpfs 标志不能与 swarm 服务一起使用。您必须使用 --mount

--mount 的选项

--mount 标志由多个键值对组成,用逗号分隔,每个键值对由一个 <key>=<value> 元组组成。键的顺序不重要。

$ docker run --mount type=tmpfs,dst=<mount-path>[,<key>=<value>...]

--mount type=tmpfs 的有效选项包括:

选项描述
destination, dst, targettmpfs 挂载的大小(以字节为单位)。如果未设置,tmpfs 卷的默认最大大小为主机总 RAM 的 50%。
tmpfs-sizetmpfs 挂载的大小(以字节为单位)。如果未设置,tmpfs 卷的默认最大大小为主机总 RAM 的 50%。
tmpfs-modetmpfs 的文件模式(八进制)。例如,7000770。默认为 1777 或全局可写。
示例
$ docker run --mount type=tmpfs,dst=/app,tmpfs-size=21474836480,tmpfs-mode=1770

--tmpfs 的选项

--tmpfs 标志不允许您指定任何选项。

在容器中使用 tmpfs 挂载

要在容器中使用 tmpfs 挂载,请使用 --tmpfs 标志,或使用带有 type=tmpfsdestination 选项的 --mount 标志。tmpfs 挂载没有 source。以下示例在 Nginx 容器的 /app 处创建一个 tmpfs 挂载。第一个示例使用 --mount 标志,第二个示例使用 --tmpfs 标志。


$ docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app \
  nginx:latest
$ docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

通过查看 docker inspect 输出的 Mounts 部分,验证挂载是否为 tmpfs 挂载:

$ docker inspect tmptest --format '{{ json .Mounts }}'
[{"Type":"tmpfs","Source":"","Destination":"/app","Mode":"","RW":true,"Propagation":""}]

停止并移除容器:

$ docker stop tmptest
$ docker rm tmptest

后续步骤