构建自己的docker镜像node.js

news2025/1/15 17:43:46

学习资源:

构建自己的 Docker 镜像_哔哩哔哩_bilibili

针对其中的一些比较困难的点写篇文章。

以下是对app.js的注释:

// 使用 Koa 框架搭建 Node.js 应用的示例代码

// 这两行代码引入了 koa 模块,并创建了一个新的 Koa 应用实例,在node_modules文件夹中已经安装了koa库
// 正常自己创建一个项目时,运行npm install命令后,npm会查看package.json文件,然后下载所有需要的包到node_modules目录中。
// 一般不会分享node_modules文件夹(因为很大),一般会给出package.json文件,使用者自己npm install安装依赖
let Koa = require('koa');
let app = new Koa();

// 引入redis日志库(注释部分)
// const redis = require('redis');
// let rds = redis.createClient({url: "redis://redis:6379"});
// rds.on('connect', ()=> console.log('redis connect ok'))
// rds.connect();

// log4js用于配置日志
let log4js = require('log4js');
// 从log4js.json文件中读取配置信息
log4js.configure('./log4js.json');
// 所有级别为DEBUG或以上的日志都会被记录
log4js.level = 'DEBUG';
let logger = log4js.getLogger('app');

// 引入路由
let Router = require('koa-router');
let router = new Router;


// 定义路由
// 根路径 (/) 的所有 HTTP 方法 (GET, POST, PUT, DELETE 等) 的请求,都会执行这个异步函数
router.all('/', async ctx =>{
	// 记录一条日志信息,表示收到对根路径的请求
    logger.info('on index page')
	ctx.body = `index page`
});

// 对于 /hello/:name 路径的所有 HTTP 方法的请求,都会执行这个异步函数
router.all('/hello/:name', async ctx =>{
	let name = ctx.params.name
    logger.info('on hello page')
	ctx.body = `hello ${name ? name : 'world'}`
});
///

// router.all('/redis', async ctx =>{
// 	let count = await rds.incr("count")
// 	logger.info(`on test redis page, count ${count}`)
// 	ctx.body = `on test redis page, 44 count ${count} `
// });

app.use(router.routes());

let port = process.env.PORT || 8080;
try{
	app.listen(8080);
	logger.info('Server started successfully and listened on '+ port +'\n'+'http://localhost:'+port);
}catch(err){
	console.error(err);
}

使用了JavaScript的koa库框架搭建web服务器。从作者的github网站上下载项目后,之所以能直接在本地运行,是因为作者已经把node_modules文件夹(依赖安装)也一同放在了github的项目中了,因此不需要本地电脑上额外npm安装koa库,也可以直接在app.js中require库web框架koa。

整体代码比较简单,重点就是定义两个http方法的函数,检测到"/"任意http方法(GET, POST, PUT, DELETE 等),都将执行一个异步函数。最后就是容器的端口号为8080。

再看一下dockerfile:

#FROM:指定基础镜像。基础镜像是构建新镜像的基础,它包含了运行应用程序所需的操作系统和环境。
FROM node:11

#维护者信息
MAINTAINER easydoc.net

# 复制代码,将文件或目录添加到镜像中。
ADD . /app

# 设置容器启动后的默认运行目录
WORKDIR /app

# EXPOSE:指定容器对外暴露的端口。
# ENV:设置环境变量。

# 运行命令,安装依赖
# RUN 命令可以有多个,但是可以用 && 连接多个命令来减少层级。
# 例如 RUN npm install && cd /app && mkdir logs
RUN npm install --registry=https://registry.npmmirror.com

# CMD:指定容器启动后要执行的命令。
# CMD 指令只能一个,是容器启动后执行的命令,算是程序的入口。
# 如果还需要运行其他命令可以用 && 连接,也可以写成一个shell脚本去执行。
# 例如 CMD cd /app && ./start.sh,切换到app目录,./表明在当前目录下执行start.sh
CMD node app.js

FROM指定基础镜像,ADD将文件添加到镜像中,代码里的"."是添加了全部的文件,也可用COPY。其次WORKDIR设置默认运行目录。

由于是docker镜像,因此需要让docker安装依赖,RUN命令npm install安装package.json文件中的全部依赖,--registry指定国内镜像源加速。作者视频的taobao云证书过期,此处换成国内npm镜像站。

正常普通的js项目中,发布者一般不会把node_modules文件夹一并上传,因为依赖很大。一般会给出一个package.json文件,执行npm install命令就会自动安装package.json文件中的全部依赖,在dockerfile文件中的RUN npm install就已经实现了这一功能。

最后CMD指令执行文件运行。CMD 指令只能一个,指定容器启动后要执行的命令。例如 CMD cd /app && ./start.sh,切换到app目录,./表明在当前目录下执行start.sh。

看一下package.json文件中的依赖:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "dependencies": {
    "koa": "^2.13.1",
    "log4js": "^3.0.6",
    "redis": "^4.0.0-rc.3",
    "mongodb": "^3.6.9",
    "koa-websocket": "^6.0.0",
    "koa-router": "^7.4.0"
  },
  "scripts": {
    "start": "cross-env PORT=8080 node app"
  },
  "author": "",
  "license": "ISC"
}

可以看到koa等依赖包的版本都被写入。

看到docker-compose.yml文件中:

version: "3.7"

services:
  app:
    build: ./
    ports:
      - 80:8080
    volumes:
      - ./:/app
    environment:
      - TZ=Asia/Shanghai
  redis:
    image: redis:5.0.13
    volumes:
      - redis:/data
    environment:
      - TZ=Asia/Shanghai

volumes:
  redis:

port端口从本机80映射到容器8080,这与作者最后的命令相违背,可是也能运行成功:

 docker run -p 9090:8080 --name test-hello2 test:v1

可见作者是将本机9090端口映射到容器8080端口上。而这样也能成功的原因是:当你访问主机的9090端口时,请求将被转发到容器的8080端口上,因为已经指定了,因此没有影响。

再举个例子详细讲解端口的这一问题:

docker run -p 8080:80 my-node-app

此代码8080端口为宿主机端口,80端口为docker容器端口。

外部设备想访问docker容器上构建的应用,需要访问的是http://<宿主机IP地址>:8080,在通过宿主机上的配置,宿主主机将自己的8080端口映射到docker容器的80端口。

下面开始部署:

builid镜像,test是镜像的名字,v1是版本号:

docker build -t test:v1 .

可在docker中看到新的镜像test:

执行结果如下:

PS D:\docker project\javascript-json\test-docker-main> docker build -t test:v1 .
[+] Building 41.5s (9/9) FINISHED                                                                        docker:default
 => [internal] load build definition from dockerfile                                                               0.0s
 => => transferring dockerfile: 1.02kB                                                                             0.0s
 => [internal] load metadata for docker.io/library/node:11                                                        24.4s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 74B                                                                                   0.0s
 => [internal] load build context                                                                                  0.0s
 => => transferring context: 2.13kB                                                                                0.0s
 => CACHED [1/4] FROM docker.io/library/node:11@sha256:67ca28addce8ae818b144114a9376a6603aba09069b7313618d37b3858  0.0s
 => [2/4] ADD . /app                                                                                               0.0s
 => [3/4] WORKDIR /app                                                                                             0.1s
 => [4/4] RUN npm install --registry=https://registry.npmmirror.com                                               16.3s
 => exporting to image                                                                                             0.4s
 => => exporting layers                                                                                            0.4s
 => => writing image sha256:aaca618375e243ff3d75204c585bd3039d844af9c9ac0441dc922b5aca7d474c                       0.0s
 => => naming to docker.io/library/test:v1                                                                         0.0s

View build details: docker-desktop://dashboard/build/default/default/rn5hv5c0x6m0r72ku001izv57

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview
PS D:\docker project\javascript-json\test-docker-main>其次执行命令:

其次执行命令:

docker run -p 9090:8080 --name test-hello2 test:v1

原作者一开始忽略了8080:8080端口占用的情况,以及test-hello与自己上传的docker镜像相冲突名字重复的情况。

运行结果如下:

PS D:\docker project\javascript-json\test-docker-main> docker run -p 9090:8080 --name test-hello2 test:v1
[2024-05-08T11:34:15.500] [INFO] app - Server started successfully and listened on 8080
http://localhost:8080
[2024-05-08T11:35:44.270] [INFO] app - on index page
[2024-05-08T11:36:22.788] [INFO] app - on index page
[2024-05-08T11:36:59.060] [INFO] app - on index page
[2024-05-08T11:36:59.285] [INFO] app - on index page
[2024-05-08T11:36:59.491] [INFO] app - on index page
[2024-05-08T11:36:59.717] [INFO] app - on index page
[2024-05-08T11:37:00.425] [INFO] app - on index page
[2024-05-08T11:37:01.006] [INFO] app - on index page
[2024-05-08T11:37:01.504] [INFO] app - on index page

最后的很多条:[2024-05-08T11:37:01.504] [INFO] app - on index page是因为我不断在本地地址上访问localhost:9090并且不断刷新。在docker中也会被记录。

docker中的logs记录:

powershell中的记录:

docker搭建自己的镜像上传成功,使用成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1653946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2项目升级到vue3经历分享4

后端重构&#xff0c;如果接口做好抽象封装&#xff0c;只需要考虑jar之间的兼容性问题&#xff0c;jdk版本不变&#xff0c;基本不用做太大的调整&#xff0c;但是前端就不一样&#xff0c;除了vue框架本身&#xff0c;css的调整&#xff0c;改起来更是让人头疼。前面写了vue2…

如何让vim支持python3

首先删除旧的vim。 sudo apt-get remove vim //输入re按下tab直接显示remove sudo apt-get remove vim-runtime sudo apt-get remove vim -tiny sudo apt-get remove vim-common 然后下载vim8源码&#xff1a; git clone https://github.com/vim/vim.git 进行编译安装…

一键剪辑1000条视频的矩阵系统小魔推到底有多牛?

小魔推是一款短视频营销工具&#xff0c;主要针对想做短视频营销的实体商家与企业。通过BGC、PGC、UGC流量的打造&#xff0c;帮助更多实体行业实现流量裂变与转化。通过小魔推不需要做额外的拍摄剪辑创作动作&#xff0c;只需要通过小魔推宣传码&#xff0c;就能一键发布带有门…

20240508请问GTX2080TI的300和300A核心的差异?

20240508请问GTX2080TI的300和300A核心的差异&#xff1f; 在拼多多/淘宝上&#xff0c;GTX2080TI的300A核心的会比300核心的贵100&#xffe5;左右。 但是怎么区分呢&#xff1f; 300a核心和300请问怎么区分呢&#xff1f;[嘻嘻] devicr ID diviceid 1e07是300a 1e04是300 Gp…

2024 GESP6级 编程第一题 游戏

题目描述 你有四个正整数 &#xff0c;并准备用它们玩一个简单的小游戏。 在一轮游戏操作中&#xff0c;你可以选择将 减去 &#xff0c;或是将 减去 。游戏将会进行多轮操作&#xff0c;直到当 时游戏结束。 你想知道游戏结束时有多少种不同的游戏操作序列。两种游戏操作…

docker-compose部署gitlab

需要提前安装docker和docker-compose环境 参考&#xff1a;部署docker-ce_安装部署docker-ce-CSDN博客 参考&#xff1a;docker-compose部署_docker compose部署本地tar-CSDN博客 创建gitlab的数据存放目录 mkdir /opt/gitlab && cd mkdir /opt/gitlab mkdir {conf…

Python深度学习基于Tensorflow(6)神经网络基础

文章目录 使用Tensorflow解决XOR问题激活函数正向传播和反向传播解决过拟合权重正则化Dropout正则化批量正则化 BatchNormal权重初始化残差连接 选择优化算法传统梯度更新算法动量算法NAG算法AdaGrad算法RMSProp算法Adam算法如何选择优化算法 使用tf.keras构建神经网络使用Sequ…

【C++】二叉搜索树(手撕插入、删除、寻找)

一、什么是二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左…

【Linux】25. 网络基础(一)

网络基础(一) 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 其实本质上一台计算机内部也是一个小型网络结构(如果我们将计算机内部某个硬件不存放在电脑中&#xff0c;而是拉根长长的线进行连接。这其实也就是网…

【Arduino IDE 2】Windows平台安装ESP8266 NodeMCU LittleFS Uploader(文件上传插件)

在Arduino IDE 2&#xff08;2.2.1或更高版本&#xff09;上&#xff0c;如何安装基于ESP8266 NodeMCU的LittleFS文件系统上传插件&#xff0c;以及如何将文件上传到ESP8266 NodeMCU板文件系统。 一、LittleFS简介 LittleFS是一个为微控制器创建的轻量级文件系统&#xff0c;可…

五种算法(BWO、RUN、SO、HO、GWO)求解复杂城市地形下无人机路径规划,可以修改障碍物及起始点(MATLAB)

一、算法介绍 &#xff08;1&#xff09;白鲸优化算法BWO 参考文献&#xff1a;Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215. &#xff08;2&#xff09;龙格-库塔优化…

基于Springboot的校园招聘系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园招聘系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

6层板学习笔记1

说明:笔记基于6层全志H3消费电子0.65MM间距BGA 目的:掌握各类接口的布局思路和布线,掌握DDR高速存储设计 1、网表的导入是原理图的元件电气连接关系,位号,封装,名称等参数信息的总和 2、原理图文件包含(历史版本记录,功能总框图,电源树,GPIO分配,DDR功能,CPU,US…

渐进淡出背景个人导航页源码(火影版)

渐进淡出背景个人导航页源码&#xff08;火影版&#xff09; 效果图部分源码领取源码下期更新预报 效果图 部分源码 <!DOCTYPE html> <html> <head> <!--小K网 www.xkwo.com --><meta charset"UTF-8"><title>火影版个人主页<…

连接云服务器中部署的组件,如MySQL、nacos等

作者遇到的问题是在云服务器部署了nacos后&#xff0c;使用 弹性公网IP:8848/nacos来访问nacos中心&#xff0c;但是打不开页面。 解决了这个问题后将解决方法写下来希望帮到大家 这里以作者使用的华为云服务器为例。 首先明确安全组的概念&#xff1a; 系统为每个云服务器默…

内存卡突然罢工?数据恢复有高招!

内存卡作为我们日常生活中常见的存储设备&#xff0c;广泛应用于手机、相机等设备中。然而&#xff0c;有时我们会遇到内存卡损坏打不开的情况&#xff0c;这时该如何应对呢&#xff1f;本文将为您详细解析内存卡损坏的原因&#xff0c;并提供有效的数据恢复方案&#xff0c;帮…

Mysql 基础 - 常见 子句

算数运算符 > < > < !/<> 逻辑运算符 3i in is null is not null 2l limit like 2o or 、order by 1a and ib between and 1n not and、or 、not、 in、 orderby、 limit、 like、 between...and、 is null 、is not null

四级英语翻译随堂笔记

降维表达&#xff1a;中译英&#xff0c;英译英 没有强调主语&#xff0c;没有说明主语&#xff1a;用被动 但如果实在不行&#xff0c;再增添主语 不会就不翻译&#xff0c;不要乱翻译 以xxx为背景&#xff1a;against the backdrop of the xxx eg:against the backdrop of…

javax.net.ssl.SSLException: Received fatal alert: protocol_version已经解决

起因&#xff1a; 在帮别人讲解项目时&#xff0c;将项目的tomcat配置完&#xff0c;点击运行后&#xff0c;报错&#xff0c;信息如标题。 解决办法&#xff1a; 在csdn百度问题&#xff0c;得到的方法主要有几个&#xff1a; 1.jdk要配置在1.8以上&#xff1b; 2.数据库地…

关系型数据库MySQL开发要点之多表查询2024详解

多表查询 准备测试数据 -- 部门管理 create table tb_dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comment 修改时…