【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:15:50
下一篇 2025年11月8日 03:16:28

相关推荐

发表回复

登录后才能评论
关注微信