Docker基础图像和缩放体系结构

我有一个运行在MongoDB,Node JS Api,React前端,Nginx代理等上的应用程序。我将所有这些设置都作为单独的映像运行在单独的链接容器中,我使用Docker Compose运行本地(OSX)。 在生产中,我现在已经在Digital Ocean上安装了一个Ubuntu服务器,并且希望能够根据需要快速扩展到多个服务器。

我的问题是处理每个这些容器的底层Linux基础映像的最佳方式是什么?

1)如果所有的Linux设置(apt-gets,node / mongo安装等)都存在于Linux机器和Docker之外,并且可以简单地创build这个映像的快照,则启动一个新的服务器实例并运行所需的docker集装箱,如果你需要快速缩放,或

2)如果所有的linux设置都存在于基本的Ubuntu映像中,mongo,node和nginx映像将在其上build立。 这会导致每个图像的尺寸显着增长,因为每个图像都有独立的Ubuntu实例,以及运行mongo,node和nginx的所有程序包依赖项,或

3)每个进程(mongo,node,nginx)是否应该有一个单独的基于Linux的Docker映像,因为它们每个都有独立的依赖关系? 同样,每个图像都会增长,因为它们每个都会运行一个Ubuntu实例。

Docker处理这个问题的正确方法是什么?

答案是#2,但我怀疑你可能不完全理解容器和图像之间的关系。

Docker如何使用图像

首先来自Docker文档的图像:

在这里输入图像说明

容器是从图像创build的。 图像只能在本地下载和caching。 图像通过注册机构分发。

图像层

什么使得Docker镜像与虚拟机映像不同的是它们是如何构build和存储的。 再次从文档:

每个图像由一系列图层组成。 Docker使用联合文件系统将这些图层合并为一个图像。 联盟文件系统允许单独的文件系统(称为分支)的文件和目录被透明地覆盖,形成一个统一的文件系统。

Docker轻量级的原因之一是因为这些层。 当您更改Docker镜像时(例如,将应用程序更新为新版本),将会构build一个新的图层。 因此,与使用虚拟机一样,不是replace整个映像或完全重build,而只是添加或更新该层。 现在,您不需要分发全新的映像,只需更新即可,从而更快,更简单地分发Docker映像。

所以,你的mongo,node和nginx图像将成为包含基本Linux设置的基本图像的薄层。 该基础图像将只被下载一次,并将被其他图像重新用作组件层。