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学习笔记(四) Number 数字类型
Jun 19 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
基于jquery编写的横向自适应幻灯片切换特效的实例代码
Aug 06 Javascript
JavaScript加强之自定义event事件
Sep 21 Javascript
js与jquery获取父元素,删除子元素的两种不同方法
Jan 09 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
Aug 10 Javascript
整理Javascript基础语法学习笔记
Nov 29 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
Oct 24 Javascript
html5+canvas实现支持触屏的签名插件教程
May 08 Javascript
微信小程序倒计时功能实现代码
Nov 09 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
Apr 22 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邮件专题
2006/10/09 PHP
关于页面优化和伪静态
2009/10/11 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
解放web程序员的输入验证
2006/10/06 Javascript
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
小程序自定义日历效果
2018/12/29 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python实现telnet服务器的方法
2015/07/10 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Python大数据之使用lxml库解析html网页文件示例
2019/11/16 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
夜大毕业自我鉴定
2013/10/11 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
公证委托书大全
2014/04/04 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年财务部工作总结
2014/11/11 职场文书
个人学习总结范文
2015/02/15 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
党委工作总结2015
2015/04/27 职场文书
小学远程教育工作总结
2015/08/13 职场文书
小学数学国培研修日志
2015/11/13 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA