如何管理Docker数据

发布时间:2021-12-13 14:23:47 作者:小新
来源:亿速云 阅读:323

这篇文章主要介绍了如何管理Docker数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

管理Docker数据

在容器的可写层可以存储数据,但是有如下缺点:

Docker提供了三种不同的管理宿主上容器数据的方式:volumes, bind mountstmpfs volumes.

如何管理Docker数据

选择合适的mount类型

无论你选择哪种mount 类型,在容器中看到的数据都相同。即在容器文件系统中以目录或者独立文件的形式存在。

一种比较简单的方式区分 volumes, bind mounts 和 tmpfs mounts,是通过区分数据存放在Docker宿主的具体位置。

关于Mount类型的更多细节

当你创建了一个volume,它会被存放在宿主机的一个目录下。当你将这个volume挂载到某个容器时,这个目录就是挂载到容器的东西。这一点和bind mounts类似,除了volumes是由Docker创建的,和宿主机的核心(core functionality)隔离。

一个volume可以同时被挂载到几个容器中。即使没有正在运行的容器使用这个volume,volume依然存在,不会被自动清除。可以通过docker volume prune清除不再使用的volumes。

volumes也支持volume driver,可以将数据存放在另外的机器或者云上。

警告:使用Bind mounts的一个副作用是,容器中运行的程序可以修改宿主机的文件系统,包括创建,修改,删除重要的系统文件或目录。这个功能可能会有安全问题。

适合Volumes的场景

volume 方式应该是持久化数据的首选方式, 其推荐用例:

适合bind mounts的场景

通过 bind mount 方式,你可以将你主机上的任何文件或目录(绝对路径)挂载到容器中。

如果将空文件或目录挂载到容器,容器中的该目录又有文件,那么,这些文件将会被复制到主机上的目录中。如果将非空的文件或目录挂载到容器,容器中的该目录也有文件,那么,容器中的文件将会被隐藏。

Volume VS. Bind mount

volume 在 docker 中被推荐为首选方式,它与 bind mount 相比,有以下优点:

配置 Propagation

Propagation 的在 bind mount 和 volume 中默认为 rprivate。它只能在 bind mount 配置,并且只能在 Linux 主机上配置。这是一个高级选项,许多用户不需要配置它。

Propagation 是指在给定的挂载卷或命名卷中创建的挂载是否可以传播到该挂载的副本。 考虑一个挂载点 /mnt,它被挂载在 /tmp。传播设置控制是否挂载 /tmp/a 也可用 /mnt/a。每个 Propagation 设置都有一个递归对应点。在递归的情况下,考虑 /tmp/a 被挂载为 /foo。传播设置控制是否 /mnt/a 或 /tmp/a 将存在。

Propagation 设置描述
shared原始mount的子mount会暴露给副本mount,并且副本mount的子mount也会传播到原始mount。
slave类似于共享的mount,但仅在一个方向上。如果原始mount显示一个子mount,副本mount可以看到它。但是,如果副本mount公开了子mount,则原始mount无法看到它。
private这个mount是私人的。其中的子mount不会暴露给副本mount,并且副mount的子mount不会暴露给原始mount。
rshared与共享相同,但是传播也扩展到嵌套在任何原始或副本mount点内的挂载点。
rslave与从属设备相同,但传播也延伸到嵌套在任何原始或副本mount点内的挂载点。
rprivate默认。与私有相同,这意味着在原始或副本mount点内的任何位置都不会有mount点向任一方向传播。

在可以在安装点上设置绑定传播之前,主机文件系统需要已经支持绑定传播。有关绑定传播的更多信息,请参阅 共享子树 的 Linux内核文档。

以下示例将 target/ 目录装载到容器中两次,第二个装入设置 ro 选项和 rslave 绑定传播选项。

在 --mount 和 -v 实例有同样的结果。

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \
  nginx:latest


$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  -v "$(pwd)"/target:/app2:ro,rslave \
  nginx:latest

现在如果你创建 /app/foo/,/app2/foo/ 也将存在。

配置selinux标签

如果使用的 selinux 话,可以添加 z 或者 Z 选项来修改正在装入容器的主机文件或目录的 selinux 标签。这会影响主机本身的文件或目录,并可能导致Docker范围之外的后果。

使用极端谨慎使用这些选项。绑定一个系统目录,例如 /home或者 /usr 用这个 Z 选项,将会使你的主机无法工作,你可能需要手工重新标记主机文件。

重要:在使用绑定安装服务时,selinux标签(:Z 和 :z)以及 :ro 被忽略。有关详细信息,请参阅 moby/moby#32579。

这个例子设置 z 选项来指定多个容器可以共享绑定挂载的内容:

使用 --mount 标志来修改selinux标签是不可能的。

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:z \
  nginx:latest

配置macOS的安装一致性

Docker for Mac用于 osxfs 将从 macOS 共享的目录和文件传播到 Linux VM。这种传播使这些目录和文件可用于在 Docker for Mac 上运行的 Docker 容器。

默认情况下,这些共享是完全一致的,这意味着每次在 macOS 主机上发生写入或通过容器中的挂载时,都会将更改刷新到磁盘,以便共享中的所有参与者都具有完全一致的视图。在某些情况下,完全一致可能会严重影响性能。Docker 17.05 和更高版本引入了选项来调整一个一个,每个容器的一致性设置。以下选项可用:

在–mount和-v实例有同样的结果。

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,destination=/app,consistency=cached \
  nginx:latest

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:cached \
  nginx:latest

适合tmpfs mounts的场景

tmpfs mounts主要用在你既不想在容器内,又不想在宿主机文件系统保存数据的时候。这可能是出于安全原因,也可能是你的应用需要写非常多的非持久化数据,tmpfs mounts这时候可以保证容器性能。

相关用例

tmpfs,使用它的情况一般是,对安全比较重视以及不需要持久化数据。

使用方式

--tmpfs 和 --mount 的关系与前面两种方式的关系不用多说。那它们之间的差异是:

--tmpfs 不允许指定任何可配置选项。
--tmpfs 不能用于 swarm service,必须使用 --mount。

tmpfs 容器的限制

tmpfs 挂载不能在容器间共享。 tmpfs 只能在 Linux 容器上工作,不能在 windows 容器上工作。

容器中使用 tmpfs

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

$ docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

tmpfs 通过运行 docker container inspect tmptest 并查找 Mounts 部分来验证安装是挂载:

"Tmpfs": {
    "/app": ""
},

删除容器:

$ docker container stop tmptest

$ Docker container rm tmptest

指定 tmpfs 选项

tmpfs 挂载允许两个配置选项,这两个都是不需要的。如果您需要指定这些选项,则必须使用该 --mount 标志,因为该 --tmpfs 标志不支持它们。

选项描述
tmpfs-sizetmpfs 的大小,以字节为单位。无限制默认。
tmpfs-modetmpfs 的八进制文件模式。例如,700 或者 0770。默认为 1777 或全局可写。

以下示例将设置 tmpfs-mode 为 1770,以便在容器内不可全局读取。

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

感谢你能够认真阅读完这篇文章,希望小编分享的“如何管理Docker数据”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. docker基本管理
  2. docker容器管理和数据管理

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker

上一篇:Docker核心概念是什么

下一篇:React各种状态管理器的原理及使用方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》