Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么有些Docker映像没有定义卷?_Docker_Dockerfile_Docker Volume - Fatal编程技术网

为什么有些Docker映像没有定义卷?

为什么有些Docker映像没有定义卷?,docker,dockerfile,docker-volume,Docker,Dockerfile,Docker Volume,我只是从Docker开始,如果我的问题对你来说太傻了,请原谅 我看到一些图像,如nginx,没有定义任何VOLUME,而一些图像,如mysql在其Dockerfile中定义了VOLUME 在没有定义卷的情况下如何管理数据或文件,以及它们的工作目录是什么?Docker有卷的概念,卷是持久的,这意味着如果Docker容器因任何原因必须重新启动,相同的卷将附加到新容器,并且数据不会丢失 由于这个原因,MySQL容器有一个连接到它的数据卷。它附加在容器存储MySQL数据的路径中 您可以将一个卷从本地主机

我只是从Docker开始,如果我的问题对你来说太傻了,请原谅

我看到一些图像,如
nginx
,没有定义任何
VOLUME
,而一些图像,如
mysql
在其Dockerfile中定义了
VOLUME


在没有定义卷的情况下如何管理数据或文件,以及它们的工作目录是什么?

Docker有卷的概念,卷是持久的,这意味着如果Docker容器因任何原因必须重新启动,相同的卷将附加到新容器,并且数据不会丢失

由于这个原因,MySQL容器有一个连接到它的数据卷。它附加在容器存储MySQL数据的路径中


您可以将一个卷从本地主机连接到容器的任何路径。

对于可以在容器中运行的许多应用程序来说,首选模式是在本地不存储任何状态。如果我有一个Web应用程序,也许它接受一个配置文件作为输入,但它将其所有数据存储在一个外部数据库中,那么我不需要本地存储。反过来,这意味着我可以运行它的多个副本以实现冗余或支持更大的规模,并且如果需要替换容器,我不需要担心保存数据。如果我的容器实际上是无状态的,那么我就不需要
(或者在运行时将卷附加到我的容器)

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
即使您的容器具有本地状态,您也可能不想要
VOLUME
VOLUME
实际上的意思是,当容器运行时,如果命名的文件系统路径上没有装载任何其他内容,则创建一个匿名卷并将其装载到那里(让Docker从图像内容填充它)。实际上,这意味着:

  • 您可以使用
    docker run-v
    或docker Compose
    volumes:
    在任何容器文件系统路径上装载目录,而不管它是否声明为
  • 如果某个内容被声明为
    ,则以后的
    运行
    指令无法更改该目录树
  • 如果某个内容被声明为
    ,则您永远无法创建在该位置具有不同内容的派生映像(例如,您无法创建从postgresql派生的带有预加载数据的映像)
声明
VOLUME/tmp
(这在Java DockerFile中似乎很常见)或在应用程序代码的部分上声明
VOLUME
没有特别的意义

VOLUME
声明与映像的
WORKDIR

无关,如“”所示,a在容器内创建装入点

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
此Dockerfile生成一个映像,使docker run在
/myvol
处创建一个新的装载点,并将问候语文件复制到新创建的卷中

这最初是针对不同的容器完成的,以装载和访问来自其他容器的数据

这与数据持久化不同,在数据持久化中,您希望运行时会话数据持久化在磁盘上

为此,请参阅“”,其中您可以在运行时装载docker卷或主机文件夹(绑定装载)或tmpfs(仅用于在主机系统内存中写入大量非持久性状态数据,以提高性能,但无需持久性)

默认情况下,NGiNX不会与其他容器共享数据,因此不会在其Dockerfile中声明
VOLUME

NGiNX怎么样?我看到静态文件位于
/usr/share/nginx/html
,但是当我从主机cli cd到这个位置时,它表示找不到目录,但是当我从bash模式cd时,在交互模式下执行容器时,会显示这个路径

它旨在通过绑定装载从主机接收数据:

docker run --name mynginx \
  -v /var/www:/usr/share/nginx/html:ro \
  -v /var/nginx/conf:/etc/nginx:ro 
-P -d nginx
这些数据是容器内的“
ro
”(只读)

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

/usr/share/nginx/html
是容器内的一个路径,这就是为什么,如果您在主机上使用
cd
,您将找不到它。

nginx如何?我看到静态文件位于/usr/share/nginx/html,但当我从主机cli cd到该位置时,它会显示“未找到目录”,但当我从bash模式cd到交互模式下执行容器时,会显示该路径。有什么解释吗?您可以将文件从主机装载到容器中您必须检查来自主机的路径是否装载到容器中的路径+1,回答得很好!实际上,解释
指令的缺点和“无用性”的在线参考资料似乎非常少…− 我只知道一个:@ErikMD谢谢你。我已相应地编辑了答案。