码头工人如何检测应保存哪些更改,不保存哪些更改?

时间:2019-07-16 17:20:43

标签: docker dockerfile docker-machine

我知道,当我们停止docker时,我们的更改会丢失。如何避免这种情况,有很多答案-每次 commit 。想法是当docker运行时,它会根据图像旋转一个新的容器。另一方面,除非您开始使用-rm ,否则容器存在后会保留一些数据

只是为了简化:

  • 如果运行 apt-get install vim ,则必须 commit 保存更改
  • 如果您更改 nginx.conf 或将文件上传到HDFS,则不会丢失数据。

所以,很好奇: 码头工人如何知道要保存什么,什么不知道?例如:在 apt-get-install 的末尾,我们在系统中有新文件我上载新文件的时间相同。容器/图像没有区别,对吗?只是 I / O修改。那么,当我们停止映像时,docker如何知道应该保存哪个修改?

2 个答案:

答案 0 :(得分:2)

此处的基本规则:

  1. 任何您明确存储在容器外部的内容(数据库S3)都会使容器失效。

  2. 如果使用docker run -v选项或Docker Compose volumes:选项在创建容器时将卷附加到容器 ,则写入该容器的所有数据目录超过了容器。 (如果是命名卷,则一直持续到您docker volume rm为止。)

  3. 一旦docker rm容器,容器文件系统中的所有其他内容都会丢失。

如果您需要应用程序源代码或安装在映像中的帮助程序之类的东西,请编写Dockerfile来描述如何构建映像并运行docker build。将Dockerfile检查到应用程序旁边的源代码管理中。

使用Docker的一般理论是,您总是从零开始。 docker build映像时,从基础映像开始并将应用程序安装到其中;您永远不会尝试升级已安装的应用程序。同样,docker run容器时,您将从其映像的新副本开始。

因此,您所提问题的最明确答案实际上是,如果在停放容器时始终docker rm停放容器,docker run新容器时,该容器将具有基本图像和内容从已安装的卷中。 Docker永远不会自动保留任何超出此范围的内容。

您应该从不运行docker commit:这将导致无法在以后重新创建魔术图像(六个月内,当您发现严重的安全问题并可能导致您的网站瘫痪) 。同样,您永远不要在正在运行的容器中安装软件,因为一旦容器退出,它就会丢失。将其添加到您的Dockerfile中并重建。

答案 1 :(得分:0)

默认情况下,对于使用Docker平台的任何Container,所有生成的数据都是临时的,并且所有文件生成或数据生成都是临时的,并且如果您没有挂载文件系统部分(如果您没有将卷附加到其中),则不会保留任何数据。容器。

如果您发现即使更改后nginx.conf也将被重用,我建议尝试查找要尝试挂载或映射到docker卷的目录。 nginx的配置位于/etc/nginx/conf.d/*,您可能正在使用该目录映射该卷。因此,如果您在工作容器中进行了任何更改,然后删除了该容器,则数据仍将保留,因为数据已被写入可写层。如果以后使用相同的卷映射部署的新容器也将在较新的容器中反映出您在先前情况下最初所做的所有更改。