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基础语法、dom操作树及document对象
Dec 02 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
Dec 12 Javascript
jQuery插件StickUp实现网页导航置顶
Apr 12 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
Dec 14 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
快速实现jQuery多级菜单效果
Feb 01 Javascript
轻松理解JavaScript闭包
Mar 14 Javascript
PHP7新特性简述
Jun 11 Javascript
JS实现弹出下载对话框及常见文件类型的下载
Jul 13 Javascript
vue弹窗组件使用方法
Apr 28 Javascript
浅谈vuex中store的命名空间
Nov 08 Javascript
原生JS实现音乐播放器的示例代码
Feb 25 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
中国收音机工业发展史
2021/03/02 无线电
Linux下ZendOptimizer的安装与配置方法
2007/04/12 PHP
ExtJS DOM元素操作经验分享
2013/08/28 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
打印出python 当前全局变量和入口参数的所有属性
2009/07/01 Python
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
深入Python函数编程的一些特性
2015/04/13 Python
python format 格式化输出方法
2018/07/16 Python
Python实现Restful API的例子
2019/08/31 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
军训自我鉴定怎么写
2014/02/13 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
安全责任协议书
2014/04/21 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis