Node.js服务Docker容器化应用实践小结

yizhihongxing

当我们需要将一个Node.js应用部署到生产环境时,Docker容器化是一个非常好的选择。其主要优点是使得应用部署变得非常容易,同时也方便了应用的扩展及做负载平衡。下面我们将介绍一下如何将一个Node.js应用Docker化,并对相关知识进行一些说明。

前置知识

在开始学习Docker容器化应用实践前,需要掌握以下知识:

  • Docker基本术语和概念
  • Node.js应用的开发和部署
  • Linux系统的基本操作

如果对上面的知识还不太熟悉,建议先学习一下。

Docker的安装

在开始Docker容器化应用实践之前,需要先安装Docker。

MacOS

在MacOS上安装Docker比较简单,只需要访问Docker官网下载并安装。

Linux

在Linux系统上安装Docker比较麻烦,具体可以参考Docker官方文档,这里仅提供Ubuntu系统的安装方式:

  1. 首先,更新apt包列表

sudo apt-get update

  1. 安装Docker必要依赖

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

  1. 添加GPG秘钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  1. 添加Docker源

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

  1. 安装Docker

sudo apt-get update
sudo apt-get install docker-ce

Windows

在Windows上安装Docker也比较简单,只需要访问Docker官网下载并安装。

Node.js应用的Docker化

本篇文章以一较为简单的Node.js应用为例。

Node.js应用目录结构:

├── app.js
├── package.json
└── public
    ├── index.html
    └── style.css

Dockerfile

首先创建Dockerfile,将应用打包进镜像。Dockerfile内容如下:

# 设置基础镜像为Node.js(lts)环境, 版本为最新
FROM node:lts-alpine

# 将 当前 目录下的内容拷贝到 /usr/app/ 目录下
COPY . /usr/app/

# 切换工作目录到 /usr/app/
WORKDIR /usr/app/

# 安装 Node.js 应用依赖
RUN npm install --production

# 让容器监听 $PORT 环境变量 或者端口
# 这个变量由容器启动时通过 -e PORT=4000 传入
EXPOSE $PORT

# 当容器启动时运行应用
CMD ["npm", "start"]

Dockerfile解释:

  • 第一行:指定将要基于哪个镜像进行镜像构建。
  • 第二行:指定将制作的镜像挂载到 /usr/app/ 目录下。
  • 第三行:切换文件到 usr/app 目录下。
  • 第四行:安装应用依赖项。(npm i --production)
  • 第五行:设置暴露端口号$PORT(通常为80或8080)。
  • 第六行:设置Docker容器在启动时所要执行的命令。

构建镜像

在构建镜像之前,首先需要确保当下目录中存在Dockerfile文件。下面介绍用构建镜像的命令:

$ docker build -t sn-cli-docker .

其中 -t sn-cli-docker 表示命名决定为 sn-cli-docker. 指当前目录。

构建镜像会根据Dockerfile文件的指示,将我们的Node.js应用打包到一个名为 sn-cli-docker 的容器镜像中。该构建命令可能会花费一些时间。

运行容器

构建的下一步,将是使用 docker run 命令运行容器。再次强调,容器是镜像的 实例

$ docker run -dit -p 3000:80 sn-cli-docker

运行容器后,可以通过 http://localhost:3000 访问应用。

下面解释一下使用的指令:

  • docker run 后面三个参数;
  • -d 让容器在后台运行;
  • -p 将容器内部的80端口映射到本地的3000端口。(即容器端口在3000)

两个具体案例

使用nodemon开发模式

从Dockerfile的内容可以看出,它首先执行了 npm install --production 来安装依赖库,然后运行了 npm start 命令来启动应用。这种方式通常用于生产环境应用。

当开发 Node.js 应用的时候,我们通常需要一个自动重启机制来做到开发环境下的即时调试,这时 nodemon 是一个非常好的选择。下面给出一个使用nodemon重启机制的示例:

在生产模式的Dockerfile中,将CMD那一行修改即可(添加nodemon),如下:

# 运行 nodemon 
CMD ["npx", "nodemon", "app.js"]

示例Docker镜像构建语句:

$ docker build -t sn-cli-docker-nodemon .

启动命令:

$ docker run -it -v $(pwd):/usr/app -p 3000:3000 --name my-node-app sn-cli-docker-nodemon

命令解释:

  • -it 以交互式终端启动容器。
  • -v 挂载主机文件系统。
  • --name 指定名称,方便查找。

使用docker-compose多容器运行

通常情况下,我们的应用不能由单一的容器来管理。例如,在现实场景中,应该拆分微服务为一些可重用的组件,组件间的关系可能是复杂的。这时我们需要一个容器编排工具来解决这种问题。Docker本身提供了Docker Compose这样的工具来做这个事情。

假设有以下两个服务:

version: '3'

services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

开启命令:

$ docker-compose up

这样,docker-compose 将会启动两个容器:

  1. 包含 Flask 应用的 Web 容器
  2. 包含 Redis 容器

若希望在后台运行它们,只需将 docker-compose 命令改为 docker-compose up -d 即可。

总结

通过以上的内容,我们可以学会将一个 Node.js 应用Docker化。其中,我们需要掌握 Dockerfile 的基本语法和应用场景。对于较为复杂的应用场景,我们可以使用 Docker Compose 进行容器编排。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js服务Docker容器化应用实践小结 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 详解JavaScript中扁平与树形数据的转换

    我来为你详细讲解“详解JavaScript中扁平与树形数据的转换”的完整攻略。 前言 在前端开发中,我们经常需要把扁平数据转换为树形结构数据,或者将树形结构数据转换为扁平数据,这种数据格式转换操作在开发中很常见。本篇文章将对JavaScript中扁平数据和树形结构数据的转换进行详细介绍。 扁平数据与树形结构数据 扁平数据 扁平数据是指没有嵌套结构,所有数据都…

    node js 2023年6月8日
    00
  • 不得不分享的JavaScript常用方法函数集(上)

    让我来详细讲解一下“不得不分享的JavaScript常用方法函数集(上)”的完整攻略。 概述 在JavaScript的开发过程中,我们经常需要使用一些常用的方法和函数,比如获取URL参数、判断数据类型等等,这些方法和函数可以提高我们的开发效率和代码质量。而这篇文章就给大家介绍了一些常用的JavaScript方法和函数,包括字符串、数组、对象、日期等等,非常实…

    node js 2023年6月8日
    00
  • Node.js中 __dirname 的使用介绍

    当使用 Node.js 开发时,我们经常会用到 __dirname 变量,这个变量代表了当前执行脚本所在的目录的绝对路径。本文将详细介绍 __dirname 的定义、作用及使用场景,并给出两个代码示例来帮助大家更好地理解。 什么是 __dirname? __dirname 是 Node.js 中的一个全局变量,用于获取当前脚本文件所在目录的绝对路径。它的值是…

    node js 2023年6月8日
    00
  • Node.JS使用Sequelize操作MySQL的示例代码

    我来为你详细讲解一下“Node.JS使用Sequelize操作MySQL的示例代码”的完整攻略。 1.准备工作 在开始使用Sequelize操作MySQL之前,你需要安装以下两项组件: MySQL数据库:由于本文是以MySQL为例,所以我们需要安装MySQL数据库。如果你已经装好了MySQL数据库,可以跳过这一步; Node.js:Sequelize是一个基…

    node js 2023年6月8日
    00
  • node.js路径处理方法以及绝对路径详解

    让我们来讲解一下“node.js路径处理方法以及绝对路径详解”。 路径处理 在Node.js中,路径是很重要的概念。我们在创建Node.js应用时,经常需要引用文件、模块或者目录。Node.js提供了许多路径处理方法,使得我们可以轻松地操作文件和目录。 相对路径 相对路径是相对于当前文件所在的路径的路径名。可以使用 . 表示当前目录,.. 表示上一级目录,例…

    node js 2023年6月8日
    00
  • node.js中的querystring.stringify方法使用说明

    下面是关于node.js中的querystring.stringify方法的详细讲解。 一、什么是querystring.stringify方法? 在node.js中,querystring是一个用于解析和格式化URL查询字符串的模块。其中,querystring.stringify方法可以将JavaScript对象序列化为URL查询字符串。这个方法的使用方…

    node js 2023年6月8日
    00
  • npm出现Cannot find module ‘XXX\node_modules\npm\bin\npm-cli.js’错误的解决方法

    当我们使用/安装Node.js时,经常会用到一个著名的Node.js包管理器——npm。然而,在使用npm时,有时会出现“Cannot find module ‘XXX\node_modules\npm\bin\npm-cli.js’”的错误,这可能会非常影响我们的工作。下面是解决方法的攻略: 问题分析 首先,我们需要了解出现这个错误的原因。这个错误通常是由…

    node js 2023年6月8日
    00
  • node使用request请求的方法

    下面是关于“node使用request请求的方法”的完整攻略。 什么是request模块 request是一个基于Node.js的 HTTP 客户端请求模块,使用它可以发出 HTTP/HTTPS 请求,处理 API 返回的数据。 安装request模块 使用npm命令安装: npm install request request的使用方法 发送GET请求 下…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部