内容简介:了解如何在Docker容器中设置Node JS:先决条件
了解如何在 Docker 容器中设置Node JS:
- 有一个可运行工作的NodeJS应用程序
- 通过确保进程在出错时不退出,使节点应用程序具有弹性
- 通过在代码更改时自动重新启动服务器,使Node应用程序易于使用
-
利用Docker:
- 快速设置与生产相同的开发环境。
- 轻松地能够在本地和服务器上切换节点版本
- Docker的所有其他 好处
先决条件
- Docker已经安装好了
- 至少入门级节点知识和NPM
1.获取一个简单的Node应用程序
我们将使用Express,因为它的设置是容易的。
在一个干净的目录中,让我们从初始化NPM开始,继续运行此命令并按照提示进行操作:
npm init
安装Express:
npm install --save-prod express
编制代码src/index.js
<b>const</b> express = require('express') <b>const</b> app = express() <b>const</b> port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => {console.log(`Example app listening on port ${port}!`))
启动一个侦听端口3000并使用Hello World响应的"/"这个URL路由。
2.设置Docker以运行我们的Node应用程序
我们将使用docker-compose.yml文件来启动和停止我们的Docker容器,而不是键入长长的Docker命令。您可以将此文件视为多个Docker容器的配置文件。
docker-compose.yml:
version: <font>"3"</font><font> services: app: container_name: app # How the container will appear when listing containers from the CLI image: node:10 # The <container-name>:<tag-version> of the container, in <b>this</b> <b>case</b> the tag version aligns with the version of node user: node # The user to run as in the container working_dir: </font><font>"/app"</font><font> # Where to container will assume it should run commands and where you will start out <b>if</b> you go inside the container networks: - app # Networking can get complex, but <b>for</b> all intents and purposes just know that containers on the same network can speak to each other ports: - </font><font>"3000:3000"</font><font> # <host-port>:<container-port> to listen to, so anything running on port 3000 of the container will map to port 3000 on our localhost volumes: - ./:/app # <host-directory>:<container-directory> <b>this</b> says map the current directory from your system to the /app directory in the docker container command: </font><font>"node src/index.js"</font><font> # The command docker will execute when starting the container, <b>this</b> command is not allowed to exit, <b>if</b> it does your container will stop networks: app: </font>
让我们用这个命令启动docker容器。在后台运行(-d)
docker-compose up -d
在浏览器中访问http://localhost:3000并看到 Hello World!
3. 使得应用变得弹性
如果您之前使用过Node,那么您可能知道如果应用程序中发生错误(如未捕获的异常),那么它将关闭该Node进程。这对我们来说真的是个坏消息,因为我们的代码中肯定会有一个错误,并且无法保证我们的代码100%无错误。此问题的解决方案通常是另一个监视我们的Node应用程序并在其退出时重新启动它的过程。有这么多的解决方案,比如 linux 的supervisord,NPM包永远和PM2等......我们只需要为本指南选择一个。
将专注于 PM2, 因为我最熟悉它,除了进程管理之外还有一些其他功能,例如文件监视,这将在下一节中派上用场。
安装PM2
npm install --save-prod pm2
PM2可以通过命令行使用,但我们将设置一个简单的配置文件,就像我们使用docker-compose.yml文件一样,以防止我们重复输入长命令
ecosystem.config.js:
<b>const</b> path = require('path') module.exports = { apps: [{ name: 'app', script: 'src/index.js', <font><i>// Your entry point</i></font><font> instances: 1, autorestart: <b>true</b>, </font><font><i>// THIS is the important part, this will tell PM2 to restart your app if it falls over</i></font><font> max_memory_restart: '1G' }] } </font>
现在我们应该更改docker-compose.yml文件以使用PM2启动我们的应用程序,而不是直接从index.js启动它。
docker-compose.yml(仅更改了的选项)
version: <font>"3"</font><font> services: app: container_name: app # How the container will appear when listing containers from the CLI image: node:10 # The <container-name>:<tag-version> of the container, in <b>this</b> <b>case</b> the tag version aligns with the version of node user: node # The user to run as in the container working_dir: </font><font>"/app"</font><font> # Where to container will assume it should run commands and where you will start out <b>if</b> you go inside the container networks: - app # Networking can get complex, but <b>for</b> all intents and purposes just know that containers on the same network can speak to each other ports: - </font><font>"3000:3000"</font><font> # <host-port>:<container-port> to listen to, so anything running on port 3000 of the container will map to port 3000 on our localhost volumes: - ./:/app # <host-directory>:<container-directory> <b>this</b> says map the current directory from your system to the /app directory in the docker container command: </font><font>"npx pm2 start ecosystem.config.js --no-daemon"</font><font> # The command docker will execute when starting the container, <b>this</b> command is not allowed to exit, <b>if</b> it does your container will stop networks: app: </font>
更改docker-compose.yml文件不会影响已经运行的容器。为了进行更改,您应该重新启动容器:
docker-compose restart
4.使我们的应用程序易于开发
您可能已经注意到,一旦Node进程启动,那么在重新启动Node进程之前,更改代码实际上并没有做任何事情,对于我们而言,每次都会涉及重新启动Docker容器以激活我们做出的改变。如果我们在进行代码更改时自动为我们重新启动Node进程,那将是理想的选择。
在过去,我已经完成了诸如引入文件监视实用程序和使用该文件监视实用程序来重新启动Docker进行文件更改之类的操作,或者我会使用Nodemon但是在使用Docker时会有一些警告。
最近,当文件发生变化时,我一直在使用PM2来重新启动我的Node进程,而且由于我们已经从上一步中获取了它,因此我们不必安装另一个依赖项。
ecosystem.config.js(仅添加了watch选项):
const path = require('path')
module.exports = { apps: [{ name: 'app', script: 'src/index.js', instances: 1, autorestart: <b>true</b>, watch: process.env.NODE_ENV !== 'production' ? path.resolve(__dirname, 'src') : false, max_memory_restart: '1G' }] }
如果我们没有将NODE_ENV环境变量设置为production,则上面的配置文件现在将监视src目录。您可以通过更改index.js文件来测试它,除了Hello World之外还可以将其他内容打印到浏览器中!。在此之前,您需要重新启动Docker容器,因为您更改了PM2运行容器的方式:
docker-compose restart
重新启动Node进程可能需要一秒钟才能完成,如果你想观察它何时完成,你可以看到你的Docker日志告诉PM2何时完成重启你的Node Process:
docker-compose logs -f
总结
- 我们的目标之一是能够轻松更改Node版本,您可以通过更改docker-compose.yml文件中的image选项来完成此操作。
- 本地安装依赖项是使用本地NPM和Node版本完成的,如果您的本地版本与Dockers不同,有时可能会导致冲突。使用相同的Docker容器来安装依赖项更安全。您可以使用此命令来使用该容器来安装依赖项,然后将其删除
docker run --rm -i -v <absolute-path-to-your-project-locally>:/app -w /app node:10 npm install
- 如上所述,具有与Docker运行的Node不同的本地版本可能是有问题的。最好在容器内部运行命令以保持一致性。你可以进入一个容器
docker exec -it app bash
上面的命令将把你放到容器中,这样你就可以继续从里面运行命令,即npm run start或npm run test
如果您不想进入容器内部,可以运行这样的命令
docker exec -t app bash -c "npm run start"
以上所述就是小编给大家介绍的《一步步使用Docker设置Node.js》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 使用 keepalived 设置虚拟 IP 环境
- 一些 PyCharm 的使用和设置建议
- AndroidStudio基本设置,以及一些使用小技巧
- AndroidStudio基本设置,以及一些使用小技巧
- javascript – 使用jQuery设置和获取localStorage
- 如何使用jQuery设置输入框的默认值?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Scrum精髓
Kenneth Rubin / 姜信宝、米全喜、左洪斌、(审校)徐毅 / 清华大学出版社 / 2014-6-1 / CNY 79.00
短短几年时间,Scrum跃升为敏捷首选方法,在全球各地得以普遍应用。针对如何用好、用巧这个看似简单的框架,本书以通俗易懂的语言、条理清晰的脉络阐述和提炼出Scrum的精髓。全书共4部分23章,阐述了七大核心概念:Scrum框架,敏捷原则,冲刺,需求和用户故事,产品列表,估算与速率,技术债;三大角色:产品负责人,ScrumMaster,开发团队以及Scrum团队构成:Scrum规划原则及四大规划活动......一起来看看 《Scrum精髓》 这本书的介绍吧!