在Docker上使用MongoDB部署NodeJS

我正在构build一个使用MongoDB作为数据库的NodeJS应用程序。 我认为,在不同平台之间的可移植性以及版本和比较方面,将会更有意义,从而将应用程序部署在Docker中。 通过互联网上的各种build议,这里是我的具体问题:

(a)我是否将我的应用程序代码(nodejs)复制到Docker中? 还是在主机上保留源代码,并使用Volumes将代码库提供给Docker? ( 只是为了试验,我有docker文件指令,直接从图像库中取出代码,它可以工作,但是这是一个好的做法,或者我应该把代码拉到Docker容器外部,并使用Volumes /复制代码 )?

(b)当我安装所有我的应用程序依赖项时,我的node_module大小爆炸几乎250 MB。 那么你会推荐运行npm install(作为依赖)作为Docker的一步,这将增加我的图像的大小? 还是有其他的select,你可以推荐?

(c)连接数据库的build议是什么? 你会推荐,使用MongoDB图像的另一个docker容器,并使用docker定义networking和数据库之间的依赖关系? 除此之外,还有可configuration的运行时属性,以便应用程序在不同的环境(PROD,STAGE,DEV)中可以连接到不同的数据库(mongodb)。

想法/build议非常感谢。 我相信,我可能会提出一些你可能在某个时候遇到的问题,采取不同的方法,有利有弊。

我在Docker中复制应用程序代码(nodejs)吗? 还是在主机上保留源代码,并使用Volumes将代码库提供给Docker?

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

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

当我安装所有我的应用程序依赖项时,我的node_module大小爆炸几乎250 MB。 那么你会推荐运行npm install(作为依赖)作为Docker的一步,这将增加我的图像的大小? 还是有其他的select,你可以推荐?

这是节点拉动所有的互联网。 你必须安装你的依赖关系。 但是,您应该在安装之后运行npm cache clean --force以进行一些清理以获得较小的映像

为了连接到数据库,会有什么build议? 你会推荐,使用MongoDB图像的另一个docker容器,并使用docker定义networking和数据库之间的依赖关系? 除此之外,还有可configuration的运行时属性,这样应用程序可以在不同的环境(PROD,STAGE,DEV)中连接到不同的数据库(mongodb)

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

一个

在发展中

在主机中使用目录很快。 您修改您的代码,重新启动泊坞窗图像,它会很快启动您的应用程序。

Docker镜像用于生产/部署

从git中取出代码是很好的。 运行更重,但更易于部署。


在发展中

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

Docker镜像用于生产/部署

在图像构build中制作一个单独的npm i ,因为它应该是静态的。

更多的解释

当你正在开发,你改变你的代码,使用一个新的包,适应你的package.json ,更新包…

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

当您部署应用程序时,您不需要与npm模块进行交互。 您需要一个打包的应用程序,其版本号和发行date不会移动,您可以依赖。

因为npm不是100%可信赖的,所以发生了一样的package.json你得到的一些东西,我npm i使得应用程序崩溃。 所以我不build议在每个应用程序重新启动或部署时都使用npm i ,因为想象一些包被搞砸了,你必须急于find一个soluce。 而且完全没有必要重新加载应该完全相同的应用程序(他们应该!)。 这不是在部署中,你想更新包! 但是在你的npm update开发环境中你可以安全地npm update和testing所有的东西。

(对不起,英文!)


C

使用两个docker图像,并使用dockernetworking连接它们。 所以你可以在任何地方轻松部署你的应用


一些命令可能帮助Dockernetworking! (我实际上是在我的公司使用它)

 // 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