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设置的基本图像的薄层。 该基础图像将只被下载一次,并将被其他图像重新用作组件层。