首页 > 解决方案 > docker 如何检测哪些更改应该保存哪些不应该保存?

问题描述

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

只是为了简化:

所以,只是好奇:码头工人如何知道要保存什么,不保存什么?例如:在apt-get-install结束时,我们在系统中有新文件我上传新文件时也是如此。对于容器/图像没有区别,对吧?只是I/O 修改。那么当我们停止镜像时,docker 是如何知道应该保存哪些修改的呢?

标签: dockerdockerfiledocker-machine

解决方案


这里的基本规则:

  1. 您在容器外部显式存储的任何内容(数据库、S3)都将比容器寿命更长。

  2. 如果您在使用选项或 Docker Compose选项创建容器时将卷附加到容器,则写入该目录的任何数据都会比容器寿命更长。(如果它是一个命名卷,它会一直持续到你。)docker run -vvolumes:docker volume rm

  3. 一旦您docker rm使用容器,容器文件系统中的任何其他内容都会丢失。

如果您需要诸如应用程序源代码或安装在映像中的帮助工具之类的东西,请编写一个Dockerfile来描述如何构建映像并运行docker build. Dockerfile在您的应用程序旁边 检查源代码控制。

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

因此,对于您提出的问题,最明确的答案实际上是,如果您docker rm在停止容器时始终是一个容器,那么当您docker run是一个新容器时,它将具有基本映像以及已安装卷中的内容。Docker 永远不会自动保留除此之外的任何内容。

永远不应该运行docker commit:这会导致以后无法重新创建神奇的图像(在六个月内,当您发现一个可能导致您的站点崩溃的关键安全问题时)。同样,你不应该在正在运行的容器中安装软件,因为一旦容器退出它就会丢失;将其添加到您的Dockerfile并重建。


推荐阅读