我有一个在MongoDB,Node JS Api,React前端,Nginx代理等上运行的应用程序。我将所有这些设置作为单独的图像并在本地运行(OSX)在单独的链接容器中,我使用Docker Compose运行。在生产方面,我目前在Digital Ocean上设置了一个(一个)Ubuntu服务器,并期望根据需要快速扩展到多个服务器。
我的问题是为每个容器处理底层Linux基本映像的最佳方法是什么?
1)Linux机器和Docker之外是否存在所有Linux设置(apt-gets,node / mongo安装等),并且可以简单地创建该映像的快照,启动新的服务器实例,如果需要快速缩放,则运行所需的Docker容器,或
2)所有的Linux设置都应该存在于“基础”Ubuntu映像中,mongo,node和nginx映像构建在它之上。这导致每个图像的大小显着增长,因为它们每个都有一个单独的Ubuntu实例,加上运行mongo,node和nginx的所有包依赖项,或者
3)每个进程(mongo,node,nginx)是否都有一个单独的Linux基础Docker镜像,因为它们各自都有独立的依赖关系?同样,每个图像都会增长,因为它们每个都会运行一个Ubuntu实例。
使用Docker处理此问题的正确方法是什么?
答案 0 :(得分:3)
答案是#2,但我怀疑你可能不完全理解容器和图像之间的关系。
首先来自Docker docs的图片:
容器是从图像创建的。图像仅在本地下载和缓存。图像通过注册表分发。
Docker镜像与虚拟机镜像的不同之处在于它们是如何构建和存储的。再次来自文档:
每个图像由一系列图层组成。 Docker使用union文件系统来组合这些 将图层分成单个图像。联合文件系统允许文件和 单独的文件系统的目录,称为分支 透明地覆盖,形成一个连贯的文件系统。
Docker如此轻量级的原因之一就是因为这些原因 层。当您更改Docker镜像时 - 例如,更新一个 应用到新版本 - 构建新图层。因此,相反 而不是替换整个图像或完全重建,就像你可能做的那样 使用虚拟机,只添加或更新该层。轮到你了 不需要分发全新的图像,只需要更新,制作 更快更简单地分发Docker镜像。
因此,您的mongo,node和nginx图像将是包含基本Linux设置的基本映像顶部的薄层。该基本图像将仅下载一次,并将被其他图像重新用作组件层。