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

时间:2019-03-23 22:05:12

标签: docker alpine

晚上好。

我们了解到Docker容器是无状态的,但是看起来Alpine Linux容器违反了此规则:

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

当我们说“ Docker容器是无状态的”时,我们并不是指根据定义它们是无状态的,而是针对最佳实践以及有关如何使用容器的指南。无状态是使用容器的一种模式,它可以将它们视为一次性实体,例如:

  • 如果您由于应用程序崩溃或系统/硬件故障而丢失了无状态容器,则无需理会,而只需创建一个新容器即可继续工作。
  • 如果要将某个容器化的应用程序从一台非常繁忙的服务器上卸载到另一台利用率低下的服务器上(例如,您刚刚购买并安装了新硬件),请在原始服务器上终止该容器,然后在新服务器上重新创建该容器。
  • li>

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

因此,回答最初的问题-阿尔卑斯山没有什么特别的。您将文件添加到容器中-直到容器被销毁为止,您都可以在其中保存文件。这对于任何容器都是如此,不仅是对于根据Alpine映像创建的容器。

答案 1 :(得分:2)

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

(只有在宽限期之后才会被杀死)