docker - docker 如何检测哪些更改应该保存哪些不应该保存?
问题描述
我知道当我们停止 docker 时,我们的更改就会丢失。如何防止这种情况有很多答案 -每次都提交。想法是,当 docker 运行时,它将根据图像启动一个新容器。另一方面,除非您开始使用--rm ,否则容器会在存在后保留一些数据。
只是为了简化:
- 如果您运行apt-get install vim,则必须提交以保存更改
- 但是如果您更改nginx.conf或将新文件上传到 HDFS,您不会丢失数据。
所以,只是好奇:码头工人如何知道要保存什么,不保存什么?例如:在apt-get-install结束时,我们在系统中有新文件。当我上传新文件时也是如此。对于容器/图像没有区别,对吧?只是I/O 修改。那么当我们停止镜像时,docker 是如何知道应该保存哪些修改的呢?
解决方案
这里的基本规则:
您在容器外部显式存储的任何内容(数据库、S3)都将比容器寿命更长。
如果您在使用选项或 Docker Compose选项创建容器时将卷附加到容器,则写入该目录的任何数据都会比容器寿命更长。(如果它是一个命名卷,它会一直持续到你。)
docker run -v
volumes:
docker volume rm
一旦您
docker rm
使用容器,容器文件系统中的任何其他内容都会丢失。
如果您需要诸如应用程序源代码或安装在映像中的帮助工具之类的东西,请编写一个Dockerfile
来描述如何构建映像并运行docker build
. Dockerfile
在您的应用程序旁边 检查源代码控制。
使用 Docker 的一般理论是你总是从头开始。当你docker build
创建一个镜像时,你从一个基础镜像开始并将你的应用程序安装到其中;您永远不会尝试升级已安装的应用程序。同样,当您docker run
使用容器时,您将从其映像的新副本开始。
因此,对于您提出的问题,最明确的答案实际上是,如果您docker rm
在停止容器时始终是一个容器,那么当您docker run
是一个新容器时,它将具有基本映像以及已安装卷中的内容。Docker 永远不会自动保留除此之外的任何内容。
您永远不应该运行docker commit
:这会导致以后无法重新创建神奇的图像(在六个月内,当您发现一个可能导致您的站点崩溃的关键安全问题时)。同样,你不应该在正在运行的容器中安装软件,因为一旦容器退出它就会丢失;将其添加到您的Dockerfile
并重建。
推荐阅读
- machine-learning - CRF和全连接CRF的区别?
- python - Django过滤大型数据集花费太长时间
- javascript - 如何使用 JavaScript 计算 div 类的出现次数,并在没有 jQuery 的情况下将数字打印到屏幕上?
- java - 比较超过 3 个 HashMap 的 Key
- python - root = tkinter.Tk() 还是 root = Tk()?
- grafana - Grafana Table 下一个/上一个/每页可能的数量?
- javascript - Vue.Draggable 不同的行为取决于放置位置
- reactjs - 这个 React 语法是什么:inputRef?.current?.current
- qt - 来自互联网的ini文件的QSettings
- mysql - 如何使用 typeORM 在 Nestjs 中创建类型为 Date 的列并键入 DateTime?