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 相关文章推荐
JavaScript入门教程(3) js面向对象
Jan 31 Javascript
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
Javascript 面向对象 重载
May 13 Javascript
js进行表单验证实例分析
Feb 10 Javascript
javascript关于继承解析
May 10 Javascript
浅析jquery unbind()方法移除元素绑定的事件
May 24 Javascript
js仿iphone秒表功能 计算平均数
Jan 11 Javascript
原生Javascript插件开发实践
Jan 18 Javascript
微信小程序本作用域下调用全局JS详解及实例
Feb 22 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
基于layui实现高级搜索(筛选)功能
Jul 26 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 shell命令合并图片的代码
2011/06/23 PHP
20个PHP常用类库小结
2011/09/11 PHP
PHP读取PDF内容配合Xpdf的使用
2012/11/24 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
python之Socket网络编程详解
2016/09/29 Python
Python+Wordpress制作小说站
2017/04/14 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
技术学校毕业生求职信分享
2013/12/02 职场文书
大型会议接待方案
2014/03/01 职场文书
北京申奥口号
2014/06/19 职场文书
离婚协议书范本
2015/01/26 职场文书
订货会邀请函
2015/01/31 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL