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 showModalDialog 弹出对话框的简单实例(子窗体)
Jan 07 Javascript
jQuery侧边栏实现代码
May 06 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
JS产生随机数的几个用法详解
Jun 22 Javascript
关于iframe跨域POST提交的方法示例
Jan 15 Javascript
解决微信二次分享不显示摘要和图片的问题
Aug 18 Javascript
vue渲染时闪烁{{}}的问题及解决方法
Mar 28 Javascript
微信小程序websocket实现即时聊天功能
May 21 Javascript
详细教你微信公众号正文页SVG交互开发技巧
Jul 25 Javascript
微信小程序实现蒙版弹出窗功能
Sep 17 Javascript
JavaScript运动原理基础知识详解
Apr 02 Javascript
JavaScript 装逼指南(js另类写法)
May 10 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
php中$this-&amp;gt;含义分析
2009/11/29 PHP
php随机输出名人名言的代码
2012/10/07 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
扩展String功能方法
2006/09/22 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
Python中的fileinput模块的简单实用示例
2015/07/09 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python多任务之协程的使用详解
2019/08/26 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
中国高端家电购物商城:顺电
2018/03/04 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
公司寄语大全
2014/04/10 职场文书
体育课课后反思
2014/04/24 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
公务员处分决定书
2015/06/25 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法
2021/11/21 数码科技
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS