首页 > 运维 > linux运维 > 正文

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

看不見的法師
发布: 2025-07-18 09:56:11
原创
942人浏览过

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

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的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号