Node.js web 应用如何封装到Docker容器中


Posted in Javascript onSeptember 01, 2020

小小又开始学习新的内容了。这次学习的是,把一个Node.js 应用封装到Docker容器,完成本教程的前提是拥有一个可以安装的,已经正常可以工作的Docker。以及对Node.js应用如何工作,有一个大致的了解。

本教程的第一部分,需要创建一个Web应用程序,然后为这个应用程序构建一个Docker镜像,最后把这个镜像作为容器进行运行。

Docker允许应用对依赖进行打包完成一个标准化的单元,这是一个容器,对于应用而言,Docker被称为一个标准的Linux操作系统,一个镜像是进行加载到容器的软件。

创建Node.js应用

首先,需要创建一个package.json文件,以及包含的依赖。

{
 "name": "docker_web_app",
 "version": "1.0.0",
 "description": "Node.js on Docker",
 "author": "First Last <first.last@example.com>",
 "main": "server.js",
 "scripts": {
 "start": "node server.js"
 },
 "dependencies": {
 "express": "^4.16.1"
 }
}

然后输入npm install 进行安装相关的依赖。

然后创建一个server.js 文件,创建一个web应用。

'use strict';

const express = require('express');

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
 res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);

这样就完成了一个标准的,最简单的web应用。

下面将需要创建一个镜像,用于对镜像进行封装。

创建一个 Dockerfile文件

touch Dockerfile

打开文件,输入相关的基础镜像

FROM node:12

创建相关的工作目录

# Create app directory
WORKDIR /usr/src/app

复制相关的包管理文件,并安装相关的依赖

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

复制相关的程序代码

# Bundle app source
COPY . .

绑定相关的端口号

EXPOSE 8080

创建持久化的命令,让系统在前台运行。

CMD [ "node", "server.js" ]

最后Dockerfile构建如下

FROM node:12

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

关于dockerignore文件

此文件,是防止复制到相关的文件,例如node_modules 不需要复制到docker镜像内部

node_modules
npm-debug.log

构建docker镜像

docker build -t <your username>/node-web-app .

输入如上的命令,构建docker镜像。

最后构建出的docker镜像如下

$ docker images

# Example
REPOSITORY      TAG  ID    CREATED
node       12   1934b0b038d1 5 days ago
<your username>/node-web-app latest  d64d3505b0d2 1 minute ago

运行相关镜像

此时镜像已经构建完成,这里需要对镜像进行运行。

docker run -p 49160:8080 -d <your username>/node-web-app

需要进入容器,输入如下的命令

# Enter the container
$ docker exec -it <container id> /bin/bash

测试

输入ps,可以看到docker的镜像的详细内容

$ docker ps

# Example
ID   IMAGE        COMMAND ... PORTS
ecce33b30ebf <your username>/node-web-app:latest npm start ... 49160->8080

使用curl可以访问网站

$ curl -i localhost:49160

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
Date: Mon, 13 Nov 2017 20:53:59 GMT
Connection: keep-alive

Hello world

以上就是Node.js web 应用如何封装到Docker容器中的详细内容,更多关于Node.js 应用封装到Docker容器的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js添加select下默认的option的value和text的方法
Oct 19 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
浅谈JavaScript字符串拼接
Jun 25 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
在页面中输出当前客户端时间javascript实例代码
Mar 02 Javascript
Bootstrap作品展示站点实战项目2
Oct 14 Javascript
vue+springboot实现项目的CORS跨域请求
Sep 05 Javascript
vue下使用nginx刷新页面404的问题解决
Aug 02 Javascript
vue 查看dist文件里的结构(多种方式)
Jan 17 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
Oct 30 Javascript
swiper实现导航滚动效果
Dec 13 Javascript
React实现todolist功能
Dec 28 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
Sep 01 #Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 #Javascript
vue路由切换时取消之前的所有请求操作
Sep 01 #Javascript
jQuery实现动态加载瀑布流
Sep 01 #jQuery
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 #Javascript
vue treeselect获取当前选中项的label实例
Aug 31 #Javascript
vue 监听 Treeselect 选择项的改变操作
Aug 31 #Javascript
You might like
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
Python引用模块和查找模块路径
2016/03/17 Python
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Python3标准库总结
2019/02/19 Python
python通过http下载文件的方法详解
2019/07/26 Python
python实现字典嵌套列表取值
2019/12/16 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
python 基于opencv操作摄像头
2020/12/24 Python
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
物业电工岗位职责
2013/11/20 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
趣味运动会赞词
2015/07/22 职场文书
k-means & DBSCAN 总结
2021/04/27 Python
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
redis中lua脚本使用教程
2021/11/01 Redis