让我们回顾几个开源镜像的启动命令:
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 数据存储策略概述
默认情况下,容器内创建的所有文件都存储在容器的可写层中。这意味着:
Docker 提供了两种方法来将容器的文件存储在宿主机上,以便文件在容器停止后仍然存在:volumes 和 bind mounts。如果您在 Linux 上运行 Docker,还可以使用 tmpfs mount;如果在 Windows 上运行 Docker,还可以使用 named pipe。
无论选择哪种挂载方式,从容器内部看数据都是一样的,表现为容器文件系统中的目录或单个文件。

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

列出 volumes:
docker volume ls

检查 volumes:
docker volume inspect webj2eedev-vol

删除 volumes:
docker volume rm webj2eedev-vol

启动带有 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 使用详解
限制条件:
在容器中使用 tmpfs mounts:
docker run -d \ -it \ --name tmptest \ --tmpfs /app \ nginx:latest
参考:
以上就是【Docker】:Docker 数据管理 - Volumes & Bind Mounts的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号