在Docker上用MongoDB部署NodeJS



我正在使用MongoDB作为数据库构建一个NodeJS应用程序。我认为,在不同平台之间的可移植性以及版本控制和比较方面,将应用程序部署在Docker中会更有意义。浏览互联网上的各种推荐,以下是我的具体问题:

(a) 我是否在Docker中复制我的应用程序代码(nodejs)?还是将源代码保留在主机上,并使用Volumes将代码库提供给Docker?(只是为了进行实验,我有docker文件指令,直接从映像中的存储库中提取代码。这很有效,但这是一个好的做法吗?还是我应该将代码从docker容器中提取出来,并使用Volumes/复制代码使其可用于docker容器)?

(b) 当我安装所有应用程序依赖项时,我的node_module大小会爆炸式增长到几乎250 MB。那么,你是否建议将npm安装(针对依赖项)作为Docker步骤运行,这会增加我的映像的大小?或者你可以推荐其他选择吗?

(c) 对于连接到数据库,建议是什么?您是否建议使用另一个带有MongoDB映像的docker容器,并使用docker定义web和数据库之间的依赖关系?此外,它还具有可配置的运行时属性,以便不同环境(PROD、STAGE、DEV)中的应用程序能够连接到不同的数据库(mongodb)。

非常感谢您的想法/建议。我确信,我可能会问一些问题,你们所有人可能在某个时候都会遇到这些问题,并采取了不同的方法,有利弊。

我是否在Docker中复制我的应用程序代码(nodejs)?还是我保留主机上的源代码,并具有可用于Docker使用Volumes?

容器中应该有nodejs代码。将源代码保留在您的机器上会使您的图像不可移植,因为如果您切换到另一台机器,则需要在那里复制代码。

如果在容器中安装了git,也可以将代码直接拉入容器中。但请记住删除.git文件夹以获得较小的图像。

当我安装所有应用程序依赖项时,我的node_module大小爆炸到几乎250 MB。所以你会建议运行npm安装吗(对于依赖项)作为Docker步骤,这将增加我的形象或者你可以推荐其他选择吗?

这是覆盖所有互联网的节点。你必须安装你的依赖项。但是,您应该在安装后运行npm cache clean --force来进行一些清理,以获得较小的图像

对于连接到数据库,建议是什么?将建议使用另一个带有MongoDB映像和使用docker定义web和db之间的依赖关系?沿着具有可配置的运行时属性,以便不同的环境(PROD、STAGE、DEV)能够连接到不同的数据库(mongodb)

最好为数据库创建一个新容器,并使用docker网络将您的应用程序连接到数据库。你可以同时拥有多个数据库,但最好在网络中保留一个数据库容器,如果你想使用另一个,只需删除旧的数据库并将新的数据库添加到网络中。

A

在开发过程中

在主机中使用目录很快。你修改你的代码,重新启动docker镜像,它会很快启动你的应用程序。

用于生产/部署的Docker映像

从git中提取代码是很好的。它运行起来更重,但部署起来更容易。


B

在开发过程中

不要在docker中运行npm install,您可以手动处理依赖关系。

用于生产/部署的Docker映像

在图像构建中制作一个npm i,因为它无论如何都应该是静态的。

更多解释

在开发时,您需要更改代码、使用新的包、调整package.json、更新包。。。

您基本上需要控制npm会发生什么。如果您可以直接执行命令行并访问文件(在本地目录的docker之外),那么与它交互会更容易。你做出改变,重新启动你的docker,它就开始了!

当您部署应用程序时,您不需要与npm模块进行交互。你想要一个有适当版本号和发布日期的打包应用程序,它不会移动,你可以依赖

因为npm不是100%可信的,所以使用完全相同的package.json,您在npm i中得到的某些东西会导致应用程序崩溃。因此,我不建议在每次重新启动或部署应用程序时都使用npm i,因为想象一下某个包被搞砸了,你必须赶紧找到解决方案。此外,根本不需要重新加载应该完全相同的包(它们应该!)。您不希望更新程序包!但在您的开发环境中,您可以安全地npm update并测试所有内容。

(对不起英语!)


C

使用两个docker镜像,并使用docker网络连接它们。因此,您可以在任何地方轻松部署您的应用程序。


一些命令可以帮助Docker网络!(我实际上在我的公司使用它)

// To create your own network with docker
sudo docker network create --subnet=172.42.0.0/24 docker-network
// Run the mondogb docker
sudo docker run -i -t --net docker-network --ip 172.42.0.2 -v ~/DIRECTORY:/database mongodb-docker
// Run the app docker
sudo docker run -i -t --net docker-network --ip 172.42.0.3 -v ~/DIRECTORY:/local-git backend-docker

最新更新