理解docker -v命令

45

我只是在浏览这个Youtube上的教程,试图理解-v命令的用法。

为什么作者要使用-v命令?他是这样使用该命令的:

docker run -v /var/lib/mysql --name=my_datastore -d busybox echo "my datastore"

现在我可以在一定程度上理解上述命令:

  • --name=my_datastore 给容器指定一个特定的名称。
  • -d busyboxbusybox镜像的基础上,以分离模式启动容器。

执行该命令后,下面一行文字将被输出到控制台。

my datastore 

现在,我不理解的部分是以下内容:

-v /var/lib/mysql

为什么这里使用了-v命令,并指定了路径/var/lib/mysql

我很难理解上述行在什么情况下使用,请问有人可以解释一下吗?


如果你执行 docker run --help 命令,除了其他信息,你会看到 -v, --volume=[] Bind mount a volume 的选项。 - user2915097
1
@user2915097 我不理解它的使用情境,所以我提出了这个问题,你能否逐步向我解释发生了什么,因为对我来说把这些块组合起来很困难! - Tenali_raman
通常,我们会将源和目标放在一起,例如 -v $HOME/.rainbow_oauth:/root/.rainbow_oaut(这是来自 https://blog.jessfraz.com/post/docker-containers-on-the-desktop/ 的示例) - user2915097
1个回答

112

-v(或--volume)参数用于在容器内创建与其余容器文件系统分开的存储空间。该命令有两种形式。

当只给定一个参数时,例如-v /var/lib/mysql,这会从Docker中分配空间并将其挂载到指定位置。这主要是一种从Docker中分配与服务容器不同的存储空间的方法。例如,您可能想运行较新版本的数据库应用程序,这涉及拆除现有的MySQL容器并启动一个新容器。您希望您的数据能够在此过程中生存下来,因此将其存储在可以由数据库容器访问的卷中。

当给定两个参数(host_path:container_path)时,例如-v /data/mysql:/var/lib/mysql,这会将主机上指定的目录挂载到容器内的指定路径(更准确地说,这也可以用于将主机文件暴露在容器内;例如,-v /etc/localtime:/etc/localtime会将主机上的/etc/localtime作为容器内的/etc/localtime可用)。这是一种将信息传递到容器内部的方式,或者提供一种使容器内的文件可供主机访问的方式。

如果容器有可用的卷,无论是通过-v命令行参数还是通过Dockerfile中的VOLUME指令,这些卷都可以使用--volumes-from选项从另一个容器中访问:

docker run --volumes-from my_datastore ...

通过--volumes-from,您可以在启动的容器中使用源容器中定义的任何卷。

更多详细信息请参阅Docker Volumes文档。


最后一个文档链接现在已经失效了。 - Karel Bílek
1
这个答案有点过时了。 -v 有稍微不同的语法,推荐新用户使用 --mount 选项。 - jiggunjer
新语法是什么? - nerdlyfe
我已经更新了链接,指向当前文档。我认为“-v”的语法没有发生实质性的变化(你可以在末尾添加新的修饰符,但基本语法是相同的)。如果你跟随链接,就会看到关于“-v”与“--mount”的讨论。 - larsks
“:ro” 在 “-v /etc:/node/etc:ro” 中是什么意思?@larsks - Treefish Zhang
1
这将创建一个只读的卷挂载,因此容器无法修改该目录中的文件。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接