【Docker】:Docker 数据管理 – Volumes & Bind Mounts

让我们回顾几个开源镜像的启动命令:

1.1. GitLab

设置环境变量:

export GITLAB_HOME=/srv/gitlab

启动 GitLab 容器的命令如下:

sudo docker run --detach   --hostname gitlab.example.com   --publish 443:443 --publish 80:80 --publish 22:22   --name gitlab   --restart always   --volume $GITLAB_HOME/config:/etc/gitlab   --volume $GITLAB_HOME/logs:/var/log/gitlab   --volume $GITLAB_HOME/data:/var/opt/gitlab   --shm-size 256m   gitlab/gitlab-ee:latest

这将下载并启动一个 GitLab 容器,并发布所需的端口以访问 SSH、HTTP 和 HTTPS。所有 GitLab 数据将存储在宿主机的 GITLAB_HOME 子目录中。容器会在系统重启后自动重启

1.2. MySql

启动 MySql 容器的命令如下:

$ docker run --name some-mysql   -v /my/own/datadir:/var/lib/mysql   -e MYSQL_ROOT_PASSWORD=my-secret-pw   -d mysql:tag

命令中的 -v /my/own/datadir:/var/lib/mysql 部分将宿主机的 /my/own/datadir 目录映射为容器中的 /var/lib/mysql 目录。MySQL 默认会将数据文件写入此目录。

值得注意的是,启动 GitLab 和 MySql 镜像时,都使用了 -v(--volume) 命令,使得容器中的数据可以持久化到宿主机中,从而避免因容器被删除导致的数据丢失问题。

2. Docker 数据存储策略概述

默认情况下,容器内创建的所有文件都存储在容器的可写层中。这意味着:

容器不存在时(指容器被删除),容器中的文件也将不存在。容器的可写层与运行容器的主机紧密耦合,数据不易移动到其他位置。向容器的可写层写入数据需要存储驱动来管理文件系统。这种存储驱动使用 Linux 内核提供了一个统一的文件系统,但这种抽象降低了一些性能。

Docker 提供了两种方法来将容器的文件存储在宿主机上,以便文件在容器停止后仍然存在:volumes 和 bind mounts。如果您在 Linux 上运行 Docker,还可以使用 tmpfs mount;如果在 Windows 上运行 Docker,还可以使用 named pipe。

无论选择哪种挂载方式,从容器内部看数据都是一样的,表现为容器文件系统中的目录或单个文件。

【Docker】:Docker 数据管理 - Volumes & Bind Mounts

Volumes

Volumes 的数据存储在由 Docker 管理的宿主机文件系统的特定区域中(Linux:/var/lib/docker/volumes/)。非 Docker 进程不应修改此部分文件系统。Volumes 是 Docker 中持久化数据的最佳方式。

Bind mounts

Bind mounts 的数据可以存储在宿主机的任何位置上,Docker 及其他进程可以随时对其进行修改。

tmpfs mounts

tmpfs mounts 的数据仅存储在宿主机的内存中,从不写入宿主机的文件系统。

2.1. Volumes

Volumes 由 Docker 创建并管理。您可以使用 docker volume create 命令显式创建 volumes,或者 Docker 可以在容器或服务创建时自动创建 volumes。

创建 volumes 时,它存储在 Docker 主机上的目录中。当您将 volumes 挂载到容器中时,该目录将被挂载到容器中。这与 bind mounts 的工作方式类似,但 volumes 由 Docker 管理,并且与主机的核心功能隔离。

一个特定的 volumes 可以同时挂载到多个容器中。当没有运行的容器使用 volumes 时,volumes 仍然对 Docker 可用,并且不会被自动删除。您可以使用 docker volume prune 命令删除未使用的 volumes。

挂载 volumes 时,它可以是命名 volumes 或匿名 volumes。匿名 volumes 在首次挂载到容器时不指定明确名称,因此 Docker 会为其分配一个在给定 Docker 主机上唯一且随机的名称。除了名称,命名 volumes 和匿名 volumes 的行为方式相同。

Volumes 还支持使用 volumes 驱动程序,使您能够将数据存储在远程主机或云提供商上。

2.2. Bind mounts

Bind mounts 自 Docker 早期版本就已存在,但与 volumes 相比,功能有限。当您使用 bind mounts 时,宿主机上的文件或目录被挂载到容器中。文件或目录通过其在宿主机上的完整路径引用。如果文件或目录在 Docker 主机上还不存在,则会在需要时创建。Bind mounts 性能非常高,但它们依赖于宿主机文件系统具有特定的目录结构。如果您正在开发新的 Docker 应用程序,建议使用命名 volumes。您无法使用 Docker CLI 命令直接管理 bind mounts。

Bind mounts 适用于以下几种场景:

乾坤圈新媒体矩阵管家 乾坤圈新媒体矩阵管家

新媒体账号、门店矩阵智能管理系统

乾坤圈新媒体矩阵管家 17 查看详情 乾坤圈新媒体矩阵管家 从宿主机共享配置文件到容器中。Docker 通过将宿主机的 /etc/resolv.conf 挂载到每个容器中,默认提供 DNS 解析功能。在 Docker 主机上的开发环境与容器之间共享源代码或构建工件。例如,您可以将 Maven 的 target/ 目录挂载到容器中,每次在 Docker 主机上构建 Maven 项目时,容器都可以访问重新构建的工件。

2.3. tmpfs mounts

tmpfs mounts 不会持久化到磁盘上,无论是在 Docker 主机还是容器内。tmpfs mounts 最适合用于您不希望数据持久化到宿主机或容器内的场景,可能是出于安全性考虑或为了保护容器性能,当您的应用程序需要写入大量非持久状态数据时。

2.4. Tips for using bind mounts or volumes

如果您将空 volumes 挂载到容器中一个包含文件或目录的目录中,这些文件或目录将被复制到 volumes 中。同样,如果您启动一个容器并指定一个不存在的 volumes,将为您创建一个空 volumes。这是一个预填充另一个容器所需数据的好方法。

如果您将 bind mounts 或非空 volumes 挂载到容器中一个包含文件或目录的目录中,这些文件或目录将被挂载所遮盖,就像您在 Linux 主机上将文件保存到 /mnt 中,然后将 USB 驱动器挂载到 /mnt 中一样。/mnt 的内容将被 USB 驱动器的内容遮盖,直到 USB 驱动器被卸载。被遮盖的文件不会被删除或更改,但在 bind mounts 或 volumes 挂载时不可访问。

3. Volumes 使用详解

创建 volumes:

docker volume create webj2eedev-vol

【Docker】:Docker 数据管理 - Volumes & Bind Mounts

列出 volumes:

docker volume ls

【Docker】:Docker 数据管理 - Volumes & Bind Mounts

检查 volumes:

docker volume inspect webj2eedev-vol

【Docker】:Docker 数据管理 - Volumes & Bind Mounts

删除 volumes:

docker volume rm webj2eedev-vol

【Docker】:Docker 数据管理 - Volumes & Bind Mounts

启动带有 volumes 的容器:

docker run -d   --name devtest   -v myvol2:/app   nginx:latest

使用只读 volumes:

docker run -d   --name=nginxtest   -v nginx-vol:/usr/share/nginx/html:ro   nginx:latest

备份 volumes 示例,创建一个名为 dbstore 的新容器:

docker run -v /dbdata --name dbstore ubuntu /bin/bash
docker run --rm   --volumes-from dbstore   -v $(pwd):/backup   ubuntu tar cvf /backup/backup.tar /dbdata

从备份中恢复 volumes。使用刚创建的备份,您可以将其恢复到同一个容器或在其他地方创建的容器。例如,创建一个名为 dbstore2 的新容器:

docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

删除所有未使用的 volumes 并释放空间:

docker volume prune

4. Bind mounts 使用详解

启动带有 bind mounts 的容器:

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

使用只读 bind mounts:

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

5. tmpfs mounts 使用详解

限制条件:

与 volumes 和 bind mounts 不同,tmpfs mounts 不能在容器之间共享。此功能仅在 Linux 上运行 Docker 时可用。

在容器中使用 tmpfs mounts:

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

参考:

以上就是【Docker】:Docker 数据管理 – Volumes & Bind Mounts的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/460276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
北京软件开发需要多少钱?
上一篇 2025年11月8日 03:16:09
Java函数式编程中的并行规约操作
下一篇 2025年11月8日 03:16:19

相关推荐

  • 开源免费PHP工具 PHP开发效率提升利器

    推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    100
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • c++如何实现UDP通信_c++基于UDP的网络通信示例

    UDP通信基于套接字实现,适用于实时性要求高的场景。1. 流程包括创建套接字、绑定地址(接收方)、发送(sendto)与接收(recvfrom)数据、关闭套接字;2. 服务端监听指定端口,接收客户端消息并回传;3. 客户端发送消息至服务端并接收响应;4. 跨平台需处理Winsock初始化与库链接,编…

    2026年5月10日
    100
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • MySQL数据库不支持中文的解决办法

    接上一篇文章,在解决了mysql+flask环境配置问题之后,往数据库存中文字符串会报1366错误,提示不正确的字符。继而发现默认的mysql采用了latin1字符集,这种编码是不支持中文的。 如果想支持中文的话,需要设置一下mysql字符集。 众所周知utf-8是可以的,gbk也没问题,为了可扩展…

    用户投稿 2026年5月10日
    000
  • JavaScript计算器开发:解决数值显示与初始化问题

    本教程深入探讨了使用JavaScript构建计算器时常见的数值显示异常问题,特别是由于类属性未初始化导致的`Cannot read properties of undefined`错误。我们将详细分析问题根源,并通过在构造函数中调用初始化方法来解决该问题,同时优化显示逻辑,确保计算器功能稳定且界面显…

    2026年5月10日
    000
  • NextAuth getToken 在服务端返回 null 的问题排查与解决

    问题描述 在使用 Next.js 和 NextAuth 构建应用程序时,有时需要在服务端获取用户的身份验证信息。getToken 函数是 NextAuth 提供的一个便捷方法,用于从请求中提取 JWT (JSON Web Token)。然而,在某些情况下,尤其是在使用 getServerSidePr…

    2026年5月10日
    000
  • pycharm解析器怎么添加 解析器添加详细流程

    在pycharm中添加解析器的步骤包括:1) 打开pycharm并进入设置,2) 选择project interpreter,3) 点击齿轮图标并选择add,4) 选择解析器类型并配置路径,5) 点击ok完成添加。添加解析器后,选择合适的类型和版本,配置环境变量,并利用解析器的功能提高开发效率。 在…

    2026年5月10日
    000
  • HTML文档如何工作?如何编辑HTML格式文件?

    HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?HTML文档如何工作?如何编辑HTML格式文件?

    浏览器解析和渲染html的过程包括:1. 解析html构建dom树;2. 结合css构建渲染树;3. 布局计算元素位置;4. 绘制像素到屏幕。编辑html可使用记事本、vs code、sublime text等文本或代码编辑器,其中vs code因语法高亮、自动补全和插件生态成为主流选择。标准htm…

    2026年5月10日 用户投稿
    000
  • 一台服务器上如何同时运行多个UWSGI服务避免冲突?

    多UWSGI服务部署方案:利用Docker实现服务器资源隔离 本文探讨如何在单台服务器上安全运行多个UWSGI服务,避免服务冲突。 问题在于,即使端口不同,两个UWSGI服务(例如:san和san_test)也可能发生冲突,后启动的服务覆盖之前的服务。 理想情况下,san_test应该持续运行,而s…

    2026年5月10日
    000
  • GolangWeb项目异常捕获与日志记录

    答案:通过中间件使用defer和recover捕获panic,结合zap等结构化日志库记录请求链路信息,为每个请求生成trace ID,实现异常捕获与可追踪日志,提升系统稳定性与可观测性。 在Go语言Web项目中,异常捕获与日志记录是保障系统稳定性和可维护性的关键环节。Go本身没有像其他语言那样的t…

    2026年5月10日
    000
  • 硬盘数据被误删除怎么办?教你快速找回删除的文件!

    硬盘数据被误删除,别慌!恢复数据并非不可能,关键在于你接下来的操作。立刻停止对该硬盘的任何写入操作,然后尝试使用专业的数据恢复软件。 解决方案 首先,数据恢复的原理是,删除文件后,操作系统只是将文件占用的空间标记为“可覆盖”,但文件本身的数据可能还存在于硬盘上。所以,避免新的数据写入覆盖掉旧数据,是…

    2026年5月10日
    000
  • CodeIgniter在IIS环境下实现URL重写与index.php移除指南

    本教程详细指导如何在IIS服务器上部署的CodeIgniter应用中,移除URL中不必要的index.php。核心解决方案涉及修改CodeIgniter的config.php文件,将$config[‘index_page’]设置为空,并辅以正确的IIS web.config重…

    2026年5月10日
    100
  • Python官网用户调查的参与方式_Python官网反馈提交详细教程

    答案是通过访问Python官网新闻页面、邮件邀请链接或GitHub仓库提交反馈。具体为:访问官网查找用户调查公告,或点击邮件中的专属链接参与,在GitHub的cpython仓库提交技术建议,并注意如实填写问卷与保护隐私。 如果您希望参与Python官网的用户调查并提交反馈,可以通过官方指定的渠道完成…

    2026年5月10日
    000
  • Windows任务管理器查看HTML占用内存情况方法

    通过任务管理器可定位HTML页面内存占用过高的问题。首先使用Ctrl+Shift+Esc打开任务管理器,查看chrome.exe或msedge.exe各进程的内存使用情况;再通过Shift+Esc调用浏览器内置任务管理器,精准识别具体标签页的内存消耗;最后可用perfmon性能监视器长期监控浏览器进…

    2026年5月10日
    000
  • JavaScript Electron桌面应用

    答案:使用JavaScript开发%ignore_a_1%桌面应用需结合Web技术与Node.js,通过主进程管理窗口、渲染进程展示界面,并利用IPC通信,调用系统功能如文件对话框,最后用electron-builder打包发布,注意安全与进程职责分离。 用JavaScript开发Electron桌…

    2026年5月10日
    000
  • 我有时使用 awk 而不是 Python 的四个原因

    Python 是一门强大的编程语言,但在某些特定场景下,Awk 的优势更为显著,尤其体现在可移植性、生命周期、代码简洁性和与其他工具的互操作性方面。 Python 脚本通常具有良好的可移植性,但并非总能在所有环境中完美运行,例如流行的 Docker 基础镜像 (如 Debian 和 Alpine)。…

    2026年5月10日
    000
  • Go语言连接外部MySQL数据库:DSN配置与常见错误解析

    本文详细阐述了go语言使用`go-sql-driver/mysql`驱动连接外部mysql数据库的正确方法。重点介绍了数据源名称(dsn)的规范格式,特别是主机地址部分的配置,以避免常见的“getaddrinfow: the specified class was not found.”等网络解析错…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信