一步步使用Docker设置Node.js

栏目: Node.js · 发布时间: 5年前

内容简介:了解如何在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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂科学家大本营

疯狂科学家大本营

Bei Er Fei Ao Er / 本书翻译组 译、黄晓庆 周宇煜 张为民 审译 / Science Press / 2012-1-5 / 48.00元

美国最棒的创意工场不是贝尔实验室,不是硅谷,也不是麻省理工学院的媒体实验室,而是由五角大楼领导的绝密军事机构DARPA——国防高级研究计划局。DARPA是由美国前总统艾森豪威尔建立的军事部门,创建的目的是为了回应苏联的太空计划。 虽然DARPA属于政府机构,但是没有冷冰 冰的氛围和官僚做派,那里的科学家偏爱牛仔裤和运动鞋。不过他们最爱的还是在各个领域寻找颠覆性创意。从航空航天、IT,到能源领......一起来看看 《疯狂科学家大本营》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具