在Docker上使用MongoDB部署NodeJS

时间:2017-08-24 15:27:46

标签: node.js docker

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

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

(b)当我安装所有应用程序依赖项时,我的node_module大小会爆炸到接近250 MB。那么你会建议运行npm install(for dependencies)作为Docker步骤,这将增加我的图像的大小?或者您可以推荐其他替代方案吗?

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

思想/建议非常感谢。我相信,我可能会问你们所有人在某个时间点可能遇到过的问题,并采用了不同的方法,有利有弊。

2 个答案:

答案 0 :(得分:0)

  

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

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

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

  

当我安装所有应用程序依赖项时,我的node_module大小   爆炸到近250 MB。所以你会建议运行npm install   (对于依赖项)作为Docker步骤,这将增加我的大小   图片 ?或者您可以推荐其他替代方案吗?

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

  

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

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

答案 1 :(得分:0)

<强> A

在开发期间

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

生产/部署的Docker镜像

从git中提取代码是件好事。它运行起来比较重,但更容易部署。

<强>乙

在开发期间

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

生产/部署的Docker镜像

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

更多解释

开发时,您需要更改代码,使用新软件包,修改package.json,更新软件包......

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

部署应用时,您无需与npm模块进行互动。您希望打包的应用程序具有适当的版本号和发布日期,这些应用程序不会移动,您可以依赖它。

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

(抱歉英语!)

<强> C

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

有些命令可以帮助解决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