Docker: Alpine Linux: 为什么 apk add <package> 持久化在容器中?

Docker: Alpine Linux: why is apk add <package> persistent in a container?

晚上好。

我们了解到 Docker 容器是无状态的,但 Alpine Linux 容器似乎违反了这条规则:

  1. 我们使用 docker run <containername> -it /bin/sh
  2. 启动 Alpine Linux 容器
  3. 我们安装缺少的 nano 编辑器:apk add nano

如果我们现在停止并启动这个容器,它仍然知道 nano 编辑器。

这是 Alpine Linux 中的一项特殊功能,还是听起来我们的 Docker 主机做了一些奇怪的事情?

非常感谢您的帮助!亲切的问候,
托马斯.

停止时容器仍然存在。 只有当您删除容器 (docker container rm <id>) 并通过 docker container run 再次启动它时,它才会成为指定图像之外的全新容器。如果你停止它然后重新运行它-它仍然是同一个。

(过了宽限期才会被kill掉)

这里的概念似乎存在根本性的误解:Docker 容器 本身并不是 无状态的。如果您对容器文件系统进行任何更改,只要容器存在,它就会一直存在。只有当容器被销毁(移除)时,它的文件系统可写层(包含自容器创建以来所做的所有更改)才会被删除。

当我们说 "Docker containers are stateless" 时,我们指的不是根据定义 它们是无状态的事实,而是指最佳实践和关于如何使用容器的指南应该使用。无状态是使用容器的一种模式,允许将它们视为一次性实体,例如:

  • 如果您因为应用程序崩溃或 system/hardware 失败而丢失了一个无状态容器,您不必在意这个,只需创建一个新容器,它继续作为其前身工作。
  • 如果您想将一些容器化应用程序从一台非常繁忙的服务器卸载到另一台未充分利用的服务器(例如,您刚刚购买并安装了新硬件),您可以终止原始服务器上的容器并在新服务器上重新创建它。

也就是说,您必须了解 Docker 不会 强制执行 无国籍状态 - ,的创建者和用户容器,必须关心它。您必须将所有持久应用程序数据存储在外部存储上,从外部安装到容器中,或网络存储中,例如在数据库中。

因此,回答最初的问题 - Alpine 没有什么特别之处。您将文件添加到容器中 - 在容器被销毁之前,它们一直存在。这适用于任何容器,不仅适用于从 Alpine 图像创建的容器。