Docker 数据卷 volume
Docker 有两种共享数据的方式,一种是数据卷,一种是挂载主机目录。数据卷和挂载主机目录都需要宿主机的文件管理系统的支持,但两者的区别在于数据卷被创建在 Docker 的目录中,不受到其他宿主机上其他服务的影响,数据卷创建后的所有者是 root。挂载目录则由宿主机管理。
本来以为 Docker 为 volume 单独设计的系统,提供不同的权限转换操作。但实际上 volume 仅仅是管理者转变为 docker,文件权限和系统都和宿主机一致。因此,如果你希望在使用时与宿主共享文件内容,那么最好还是使用挂载目录,虽然 volume 在创建时,可以指定挂载目录,但权限不会改变,和挂载目录相比没有优势。
另外,docker 的一个核心思想就是隔离,涉及到共享文件时,就一定程度打破了这个观念,因此,docker 只是提供了一种容器访问宿主目录和文件的方式,但不会对宿主机上的文件的权限做任何更改。
使用 volume
先查看 docker 中的 volume 命令都有哪些子选项。
1$ docker volume --help2
3Usage: docker volume COMMAND4
5Manage volumes6
7Commands:8 create Create a volume9 inspect Display detailed information on one or more volumes10 ls List volumes11 prune Remove unused local volumes12 rm Remove one or more volumes13
14Run 'docker volume COMMAND --help' for more information on a command.
最常用的就是 create 和 inspect 选项。通过 create 可以自定义创建数据卷,通过 inspect 可以查看数据卷的详细信息。
创建数据卷
可通过 --help
查看 create 选项的详细信息。
1$ docker volume create --help2
3Usage: docker volume create [OPTIONS] [VOLUME]4
5Create a volume6
7Options:8 -d, --driver string Specify volume driver name (default "local")9 --label list Set metadata for a volume10 -o, --opt map Set driver specific options (default map[])
-d
可以指定 volume 驱动,除了默认的 local 驱动,Docker 还支持第三方的 volume 驱动插件。如果是本地储存,直接忽略即可。
--label
可以设置数据卷的标签,方便管理。例如 --label owner=apple
-o
可以设置驱动特定的选项,比如 size
可以设置数据卷的大小。-o
中的选项和指令的 volume 驱动有关。内置的 local 驱动程序在 Windows 上不接受任何选项。在 Linux 和 Docker Desktop 上, local 驱动程序接受类似于 Linux mount 命令的选项。可以通过多次传递 --opt
标志来提供多个选项。一些 mount 选项(例如 o 选项)可以接受逗号分隔的选项列表。完整的可用挂载选项列表可以在 mount 找到。更多详细配置请参考:docker volume create。
例如,创建一个名为 volume-name
的 volume,并将其数据存储在自定义文件夹中:
1docker volume create --driver local --opt type=none \2--opt device=/你的/宿主机/目录 \3--opt o=bind \4volume-name
启动容器挂载 volume
创建完 volume 后,在启动容器时,就可以挂载到容器对应的目录中。例如,通过 ubuntu:24.04 镜像启动容器 test-vol,并将 test-volume 挂载到 /home/test
目录。
1docker run -it --name test-vol -v test-volume:/home/test ubuntu:24.04
需要注意的是,挂载的目录的权限仍然和宿主机一致,容器中的用户 id 需要和宿主机一致,否则不能写入。