我试图更深入地了解 Docker 的体积,我很难找出差异 / 用例:
docker volume create
命令
docker run-v /path:/host_path
Dockerfile
文件中的VOLUME
项
我特别不明白如果将VOLUME
条目与-v
标志结合会发生什么。
卷是存储在/var/lib/docker/volumes/...
中的持久性数据
您可以在 Dockerfile 中声明它,这意味着每次从映像启动容器时,都会创建卷(empty),即使您没有任何-v
选项。
您可以在运行时docker run -v [host-dir:]container-dir
上声明它。
将两者结合(VOLUME
+docker run -v
)意味着您可以将主机文件夹的内容挂载到由/var/lib/docker/volumes/...
中的容器保存的卷中
docker volume create创建卷,而无需定义 Dockerfile 并构建映像并运行容器,它用于快速允许其他容器挂载所述卷。
如果您在卷中保留了一些内容,但此后删除了容器(默认情况下不会删除其关联的卷,除非您使用 docker rm-v),则可以将所述卷重新附加到新容器(声明相同的卷)。
请参阅“Docker - How to access a volume not attached to a container?”。
使用 docker volume create,可以轻松地将命名卷重新附加到容器。
docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer
# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
当您将VOLUME
指令与volumes-from
运行时参数结合使用时,它会变得很有趣。
给定以下 Dockerfile:
FROM busybox
VOLUME /myvolume
使用以下命令构建映像:
docker build -t my-busybox .
并旋转一个容器:
docker run --rm -it --name my-busybox-1 my-busybox
首先要注意的是,您将在此映像中有一个名为myvolume
的文件夹。但这并不是特别有趣,因为当我们退出容器时,卷也将被删除。
在此文件夹中创建一个空文件,因此请在容器中运行以下命令:
cd myvolume
touch hello.txt
现在旋转一个新容器,但与my-busybox-1
共享相同的卷:
docker run --rm -it --volumes-from my-busybox-1 --name my-busybox-2 my-busybox
您将看到my-busybox-2
包含myvolume
文件夹中的文件hello.txt
。
一旦退出两个容器,卷也将被删除。
@ radium226
在 Dockerfile 中指定 VOLUME 可确保在运行时将文件夹视为卷(即外部容器),而不是容器内的常规目录。请注意性能和可访问性的影响。
如果忘记在“docker run”命令行中指定“-v”,上述仍然是正确的。只是卷名变得匿名。但是仍然有办法从这些匿名卷访问或恢复数据。
从docker hub使用 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 将在其中写入其数据文件。
因此,当容器被杀死时仍然存在的目录是可用的,这也为某些操作(如数据库操作)提供了更高的性能。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(4条)