构建自己的docker镜像node.js

学习资源:

构建自己的 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.namelogger.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:8080volumes:- ./:/appenvironment:- TZ=Asia/Shanghairedis:image: redis:5.0.13volumes:- redis:/dataenvironment:- TZ=Asia/Shanghaivolumes: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.0sView build details: docker-desktop://dashboard/build/default/default/rn5hv5c0x6m0r72ku001izv57What'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.mzph.cn/web/8447.shtml

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

相关文章

C++之QT文本处理QDir、QFileDialog、QStringList、QFile

一、相应的头文件 #include <QFileDialog> #include <QDir> #include <QStringList> 二、简介 1.QFileDialog 实际效果如下&#xff1a;比如需要选择打开的文件夹或者文件名&#xff0c;通过调用资源管理器的方式进行可视化操作。 代码示例为&#xff1a…

gitlab集群高可用架构拆分部署

目录 前言 负载均衡器准备 外部负载均衡器 内部负载均衡器 (可选)Consul服务 Postgresql拆分 1.准备postgresql集群 手动安装postgresql插件 2./etc/gitlab/gitlab.rb配置 3.生效配置文件 Redis拆分 1./etc/gitlab/gitlab.rb配置 2.生效配置文件 Gitaly拆分 1.…

五月加仓比特币

作者&#xff1a;Arthur Hayes Co-Founder of 100x. 编译&#xff1a;Liam 编者注&#xff1a;本文略有删减 (以下内容仅代表作者个人观点&#xff0c;不应作为投资决策的依据&#xff0c;也不应被视为参与投资交易的建议或意见&#xff09;。 从四月中旬到现在&#xff0c;当你…

flask框架的初步认识

flask框架的初步认识 这是一个轻量级的网页框架&#xff0c;在运行后&#xff0c;就相当于服务器&#xff0c;当用户输入URL就会触发对应的事件调用方法&#xff0c;返回给用户一个网页文件&#xff0c;并通过自动识别html标签&#xff0c;来为用户呈现对应的样式和效果&#…

小红书达人置换合作推广怎么做?

小红书作为国内领先的生活方式分享平台&#xff0c;已成为品牌与消费者沟通的重要桥梁。达人置换合作推广&#xff0c;即品牌与小红书上的意见领袖&#xff08;KOL&#xff09;合作&#xff0c;通过他们的影响力推广产品&#xff0c;已成为品牌营销的重要手段。本文伯乐网络传媒…

【光速上手 Hydra 】一行代码自动跑多次实验,Hydra 中的 Multirun 参数如何使用?

Hydra 是一个开源的 Python 框架&#xff0c;简化了研究和其他复杂应用的开发。其关键特性是能够通过组合动态地创建一个分层次的配置&#xff0c;并通过配置文件和命令行进行覆盖。Hydra 的名称来源于其能够运行多个类似的作业 - 就像一个有多个头的九头蛇一样。 主要特性&am…

TikTok 正式起诉美国政府;全新 iPad Pro 将搭载苹果 M4 芯片丨 RTE 开发者日报 Vol.199

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

机器学习 | 时间序列预测中的AR模型及应用

自回归模型&#xff0c;通常缩写为AR模型&#xff0c;是时间序列分析和预测中的一个基本概念。它们在金融、经济、气候科学等各个领域都有广泛的应用。在本文中&#xff0c;我们将探索自回归模型&#xff0c;它们如何工作&#xff0c;它们的类型和实际例子。 自回归模型 自回…

Rust读写CSV文件 一维Vec类型元素、二维Vec类型元素写入CSV文件

本文主要介绍Rust读写CSV文件方法&#xff0c; Vec类型元素基本操作方法&#xff0c;Rust把一维Vec类型元素、二维Vec类型元素写入CSV文件方法。 实例测试&#xff1a; 要求读“log.csv”文件数据&#xff0c;把“时间”列数据和“次数”列数据写入日志处理结果1.csv文件&…

五一 Llama 3 超级课堂 大完结

首先很感谢上海人工智能实验室和机智流等相关举办单位组织的这个活动&#xff0c;在Llama3发布不多时就让我们可以体验到大模型的进步&#xff0c;回顾整个活动&#xff0c;从内容上看是相当用心的。从A100的提供使用到大模型部署&#xff0c;微调&#xff0c;Agent功能应用和数…

Python中tkinter编程入门1

1 tkinter库简介 tkinter是Python的标准库&#xff0c;用来进行GUI&#xff08;Graphical User Interface&#xff0c;图形用户界面&#xff09;编程。 2 导入tkinter库 tkinter是Python默认的GUI库&#xff0c;因此&#xff0c;IDLE中已经包含了该库&#xff0c;使用时无需…

【网络编程】HTTPS协议详解

引言 HTTPS是HTTP协议的安全版本&#xff0c;通过使用SSL&#xff08;安全套接层&#xff09;或TLS&#xff08;传输层安全&#xff09;协议加密通信&#xff0c;为数据传输提供了保密性、完整性和身份认证。与传统的HTTP相比&#xff0c;HTTPS能够防止敏感信息被窃取、篡改和…

【HTTP下】总结{重定向/cookie/setsockopt/流操作/访问网页/总结}

文章目录 1.请求头2.cookie理解 3.vim跳转/搜索4.setsockopt被重用的意思 5.流操作5.1定位读取指针5.2ifstram::read() 6.总结6.1 百度搜索框搜索功能字符6.2请求uri请求和响应的第一行都有http版本请求内容里有GET /favicon.ico HTTP/1.1 6.3访问网页Fiddler抓包原理&#xff…

树莓派4b测量PM2.5

1.GP2Y1010AU0F粉尘传感器连接图 2. GP2Y1010AU0F工作原理 工作原理 传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。 3.源代码 main.py # coding=UTF-8 import RPi.GPIO as GPIO from ADC import ADS1015…

上传文件客户端签名直传

上传文件的客户端签名直传是一种常用的将文件直接上传到云存储服务如Amazon S3、阿里云OSS等云服务上的技术手段。这种方法通常用于减轻服务器负担&#xff0c;并提高上传效率。 以下是实现客户端签名直传的基本步骤&#xff1a; 1. 客户端请求上传权限 客户端&#xff08;如…

加速数据要素流通,“隐语杯”全国高校隐私计算大赛正式启动报名!

当前&#xff0c;我国数字经济正处在一个快速增长的阶段&#xff0c;数据要素逐渐成为促进社会经济繁荣的关键驱动力。随着国家对数据治理及隐私保护政策的不断完善&#xff0c;隐私计算技术的创新和实践应用变得愈发重要。面对数据安全与隐私保护的双重挑战&#xff0c;如何实…

高性价比开放式耳机有哪些?五大好评热卖开放式耳机推荐

近年来&#xff0c;开放式耳机凭借其独特的开放式声学设计&#xff0c;给用户带来了动态空间的音质享受。在佩戴等方面也带来了一定的舒适度。然而&#xff0c;面对满目的耳机品牌&#xff0c;新手小白往往会不知道如何挑选。那如何选择一款适合自己的产品呢&#xff1f;我整理…

了解如何有效地利用 Swagger UI

在讨论程序员职业生涯中的一些琐碎但必须的任务时&#xff0c;众所周知&#xff0c;编写和维护文档是他们最不喜欢的活动之一。程序员普遍不愿意编写注释和文档&#xff0c;同时又对那些没有留下适当文档的同事感到失望。这种矛盾主要是因为文档管理是一个繁琐的过程&#xff0…

Yolov8-pose关键点检测:卷积魔改 | 变形条状卷积,魔改DCNv3二次创新

💡💡💡本文独家改进: 变形条状卷积,DCNv3改进版本,小幅涨点的前提下相比较DCNv3大幅度运算速度 💡💡💡强烈推荐:先到先得,paper级创新,直接使用; 💡💡💡创新点:1)去掉DCNv3中的Mask;2)空间域上的双线性插值转改为轴上的线性插值; 💡💡💡如…

计算机毕业设计 | springboot+vue凌云在线阅读平台 线上读书系统(附源码)

1&#xff0c;绪论 随着社会和网络技术的发展&#xff0c;网络小说成为人们茶钱饭后的休闲方式&#xff0c;但是现在很多网络小说的网站都是收费的&#xff0c;高额的收费制度是很多人接受不了的&#xff0c;另外就是很多小说网站都会有大量的弹窗和广告&#xff0c;这极大的影…