Docker 生产关键数据和非生产非关键数据应存储在何处?

Docker 生产关键数据和非生产非关键数据应存储在何处?,docker,docker-volume,Docker,Docker Volume,我在一次采访中被问到这个问题,我不确定答案是否正确,因此我想听听你的建议 有人问我,我们是应该将生产关键数据保存在docker实例内部还是外部?我的选择是什么?原因是什么 如果我们有非prod非关键数据,您的回答会有所不同吗 用理由支持您的答案。大多数数据应该在容器和容器映像外部进行管理。我倾向于将受限于容器的数据视为临时(中间的|可丢弃的)数据。否则,如果它被捕获但对我的业务不重要,为什么要创建它 “容器”的名称具有误导性。容器不像虚拟机那样在虚拟机之间有很强的屏障(隔离)。在单个主机上运行多

我在一次采访中被问到这个问题,我不确定答案是否正确,因此我想听听你的建议

有人问我,我们是应该将生产关键数据保存在docker实例内部还是外部?我的选择是什么?原因是什么

如果我们有非prod非关键数据,您的回答会有所不同吗


用理由支持您的答案。

大多数数据应该在容器和容器映像外部进行管理。我倾向于将受限于容器的数据视为临时(中间的|可丢弃的)数据。否则,如果它被捕获但对我的业务不重要,为什么要创建它

“容器”的名称具有误导性。容器不像虚拟机那样在虚拟机之间有很强的屏障(隔离)。在单个主机上运行多个容器时,可以在主机上使用
ps aux
枚举其所有进程

对于保持流程和数据之间的分离,以及在单个容器中同时运行这两者,都有很好的理由,这使得保持这种分离更具挑战性

与进程不同,容器层中的文件更加隔离。尽管层在主机操作系统上以文件的形式显示,但您不能简单地从主机操作系统
ls
a容器层的文件。这使得访问容器中的数据更加复杂。在另一个文件系统上有效运行一个文件系统也会带来性能损失

虽然在机器之间移动容器映像(即
docker push
docker pull
)很常见,但在机器之间移动容器并不容易。这通常不是移动进程的问题,因为这些进程(除配置外)是无状态的,易于移动和重新创建,但您的数据处于状态,您希望能够轻松地移动这些数据(用于备份、恢复),并越来越多地在对其执行处理的动态节点池中移动


不太重要但并非不重要的是,通过移除容器(
Docker container rm…
),从而删除应用程序和您的数据,可以相对容易地执行与Docker的
rm-rf*
等价的操作。

这里您应该考虑两个最基本的问题:

  • 每当删除容器时,容器文件系统中的所有内容都会丢失
  • 删除容器是非常常见的;需要更改许多启动选项或将容器更新为较新的映像
  • 因此,您实际上不想将任何内容保留在“容器中”作为其主要数据存储:它无法从容器外部访问,并且在下次出现关键的安全更新时将丢失,您必须删除容器

    在普通码头,我建议

    …在图像中:您的实际应用程序(编译的二进制文件或其解释的源文件,视情况而定;这不在卷中)

    …在容器中:
    /tmp

    …在绑定装载的主机目录中:启动时需要推入容器的配置文件;容器生成的日志文件目录(作为操作员需要直接与文件交互的内容)

    …在命名卷或绑定装载的主机目录中:容器在文件系统中记录的持久数据

    在最后一点,试着尽量避免这一层;将数据保存在“其他地方”(可能是另一个容器,如RDS等云服务)的数据库中可以简化备份等工作,并简化同一服务的多个副本的运行。主机目录更容易备份,但在某些环境(MacOS)中,备份速度慢得令人无法接受

    对于“生产”与“非生产”或“关键”与“非关键”,我的答案在这里没有变化,除了有限的例外情况,你可以通过说“如果我丢失这些数据没关系”(“因为它不是它的主副本”)来证明