0

0

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

看不見的法師

看不見的法師

发布时间:2025-07-18 09:56:11

|

949人浏览过

|

来源于php中文网

原创

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

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 适用于以下几种场景:

Llama Coder
Llama Coder

Llama Coder 是一个AI驱动的代码生成工具,可以一键生成完整的应用程序

下载
  • 从宿主机共享配置文件到容器中。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

参考:

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

660

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

245

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

528

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

598

2023.08.14

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

97

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.5万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.4万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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