在面试中有人问我这个问题,我不确定答案是否正确,因此我希望得到您的建议。
有人问我是否应该将生产关键数据持久化在docker实例内部还是外部?我的选择是什么,选择它的原因。
万一我们有非生产性非关键数据,您的答案会有所不同吗?
根据原因返回您的答案。
答案 0 :(得分:1)
大多数数据应在容器和容器映像的外部进行管理。我倾向于将受限于容器的数据视为临时(中间)数据。否则,如果它被捕获但对我的业务不重要,为什么要创建它?
名称“容器”具有误导性。容器不像VM,VM之间存在强大的屏障(隔离)。在单个主机上运行多个容器时,可以使用主机上的ps aux
枚举其所有进程。
维护进程和数据之间的分隔并在单个容器中运行这两个方面有很好的论据,因此保持这种分隔更具挑战性。
与进程不同,容器层中的文件更隔离。尽管这些层在主机OS上显示为文件,但是您不能简单地从主机OS ls
docker push
容器层的文件。这使得访问容器中的数据更加复杂。有效地在另一个文件系统之上运行文件系统也有性能损失。
尽管在机器之间移动容器映像(即docker pull
和rm -rf *
)是常见且琐碎的,但在机器之间移动容器却不那么容易。这对于移动进程通常不是问题,因为这些进程(配置不计)是无状态的,并且易于移动和重新创建,但是您的数据处于状态,并且您希望能够轻松移动此数据(对于备份,恢复),并越来越多地在动态节点池中进行处理。
重要但并非不重要,通过删除容器(docker container rm ...
)并删除应用程序和您的数据,与Docker等效于 void _getMarker() {
StreamBuilder(
stream: Firestore.instance
.collection('contentislamis')
.where('kategori', isEqualTo: 'Landmark')
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Colors.green)));
} else {
for (int i = 0; i < snapshot.data.documents.length; i++) {
_addMarkers(snapshot.data.documents[i]);
print("${snapshot.data.documents.length} markers added");
}
}
});
}
相对容易。
答案 1 :(得分:1)
您应该在这里有两个最基本的注意事项:
因此,您实际上并不想将任何内容保留在“容器”中作为其主要数据存储:无法从容器外部访问它,并且在下次进行关键的安全更新时将丢失它,并且您必须< / em>删除容器。
在普通Docker中,我建议保留
...在图像中:您的实际应用程序(已编译的二进制文件或相应的经解释的源文件;该文件不存在)
...在容器中:/tmp
...在绑定安装的主机目录中::您需要在启动时将配置文件推送到容器中;容器产生的日志文件目录(您作为操作员需要直接与文件进行交互的地方)
...在命名卷或绑定安装的主机目录中:容器记录在文件系统中的持久数据
关于最后一点,请考虑完全避免使用该层;将数据保存在“在其他地方”运行的数据库(可能是另一个容器,RDS之类的云服务等)中,可以简化备份之类的事情,并简化同一服务的多个副本的运行。主机目录更易于备份,但是在某些环境(MacOS)上,它慢得令人无法接受。
对于“生产”还是“非生产”还是“关键”还是“非关键”,我的答案在这里不会改变,只有少数例外,您可以说“如果我丢失此数据也可以”来证明这一点(“因为它不是它的主副本”)。