一步步教你利用Docker设置Node.js

docker是一个开源的应用容器引擎,可以为我们提供安全、可移植、可重复的自动化部署的方式。docker采用虚拟化的技术来虚拟化出应用程序的运行环境。如上图一样。docker就像一艘轮船。而轮船上面的每个小箱子可以看成我们需要部署的一个个应用。使用docker可以充分利用服务器的系统资源,简化了自动化部署和运维的繁琐流程,减少很多因为开发环境中和生产环境中的不同引发的异常问题。从而提高生产力。

docker三个核心概念如下:

镜像(images):一个只读的模板,可以理解为应用程序的运行环境,包含了程序运行所依赖的环境和基本配置。相当于上图中的每个小箱子里面装的东西。

仓库(repository):一个用于存放镜像文件的仓库。可以看做和gitlab一样。

容器(container):一个运行应用程序的虚拟容器,他和镜像最大的区别在于容器的最上面那一层是可读可写的。 相当于上图中的每个小箱子里。

本文主要是教大家了解如何在Docker容器中设置Node JS:

有一个可运行工作的NodeJS应用程序

通过确保进程在出错时不退出,使节点应用程序具有弹性

通过在代码更改时自动重新启动服务器,使Node应用程序易于使用

利用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('https://www.jb51.net/', (req, res) => res.send('Hello World!')) app.listen(port, () => {console.log(`Example app listening on port ${port}!`))

启动一个侦听端口3000并使用Hello World响应的"https://www.jb51.net/"这个URL路由。

2.设置Docker以运行我们的Node应用程序

我们将使用docker-compose.yml文件来启动和停止我们的Docker容器,而不是键入长长的Docker命令。您可以将此文件视为多个Docker容器的配置文件。

docker-compose.yml:

version: "3" 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 this case the tag version aligns with the version of node user: node # The user to run as in the container working_dir: "/app" # Where to container will assume it should run commands and where you will start out if you go inside the container networks: - app # Networking can get complex, but for all intents and purposes just know that containers on the same network can speak to each other ports: - "3000:3000" # <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> this says map the current directory from your system to the /app directory in the docker container command: "node src/index.js" # The command docker will execute when starting the container, this command is not allowed to exit, if it does your container will stop networks: app:

让我们用这个命令启动docker容器。在后台运行(-d)

docker-compose up -d

在浏览器中访问: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:

const path = require('path') module.exports = { apps: [{ name: 'app', script: 'src/index.js', // Your entry point instances: 1, autorestart: true, // THIS is the important part, this will tell PM2 to restart your app if it falls over max_memory_restart: '1G' }] }

现在我们应该更改docker-compose.yml文件以使用PM2启动我们的应用程序,而不是直接从index.js启动它。

docker-compose.yml(仅更改了的选项)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8e8f6e33d9b134baea5f098f35edcbc0.html