VOLUME 在 Dockerfile 中的作用是什么
What is the purpose of VOLUME in Dockerfile
我正在尝试更深入地了解 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),您可以 re-attach 表示卷到新容器(声明相同的卷)。
参见“”。
使用 docker 卷创建,这很容易将命名卷重新附加到容器。
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 运行”命令行中指定“-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 将写入其数据文件。
因此,挂载容器时仍然存在的目录可用,它还为某些操作(如数据库操作)提供了更高的性能。
我正在尝试更深入地了解 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),您可以 re-attach 表示卷到新容器(声明相同的卷)。
参见“
使用 docker 卷创建,这很容易将命名卷重新附加到容器。
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 运行”命令行中指定“-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 将写入其数据文件。
因此,挂载容器时仍然存在的目录可用,它还为某些操作(如数据库操作)提供了更高的性能。