我对创建docker volume create my-vol
和VOLUME ["/var/www"]
的区别感到困惑。
我的理解是:
1)docker volume create my-vol
在我们的计算机上创建了一个永久卷,每个容器都可以链接到my-vol
。
2)VOLUME ["/var/www"]
在其容器内创建一个卷。
当我创建另一个容器时,可以如下链接
my-vol
: 运行容器时$ docker run -d --name devtest --mount source=myvol2,target=/app nginx:latest
那时,如果我在Dockerfile中添加了
VOLUME ["/var/www"]
,此docker文件的所有数据都将存储在myvol2
和/var/www
中吗?
答案 0 :(得分:4)
Dockerfile VOLUME
命令说两件事:
如果操作员未在特定容器目录上显式安装卷,则无论如何都要在其中创建一个匿名卷。
没有Dockerfile步骤将无法对该目录树进行进一步更改。
作为操作员,您可以使用docker run -v
选项将卷(命名卷或主机目录)安装到容器中。您可以将其安装在容器中的任何目录上,而不管Dockerfile中是否为此声明了VOLUME
。
(因为无论您是否声明docker run -v
都可以使用VOLUME
,并且它具有令人困惑的副作用,所以我通常会避免在Dockerfiles中声明VOLUME
。)>
就像在普通Linux中一样,在给定目录上只能(有用地)安装一件事。使用您描述的设置,数据将存储在您创建和安装的myvol2
中,并且可以在容器的/var/www
中看到,但实际上数据仅存储在一个位置。如果您删除并重新创建了没有卷挂载的容器,则数据将不再存在。
答案 1 :(得分:1)
Docker中使用两种类型的持久性存储,第一种是Docker Volumes,第二种是绑定装载。它们之间的区别在于,卷是Docker内部的并且存储在Docker存储中(通常都在/ var / lib / docker下),并且绑定装载使用计算机上的物理位置来存储持久数据。
如果要对nginx使用Docker卷:
docker卷创建nginx-vol
docker run -d --name devtest -v nginx-vol:/ usr / share / nginx / html nginx
如果要使用绑定安装:
docker run -d --name devtest -v [path]:/ usr / share / nginx / html nginx
[路径]是您要存储容器数据的位置。