Dockerfile中的docker卷和VOLUME

时间:2018-12-23 05:01:54

标签: docker dockerfile

我对创建docker volume create my-volVOLUME ["/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中吗?

2 个答案:

答案 0 :(得分:4)

Dockerfile VOLUME命令说两件事:

  1. 如果操作员未在特定容器目录上显式安装卷,则无论如何都要在其中创建一个匿名卷。

  2. 没有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

[路径]是您要存储容器数据的位置。