docker 部署 node.js(express) 服务

news2024/10/5 14:26:11

1、在 express 项目根目录下新增 Dockerfile 文件,内容如下:

创建服务容器的方法,可以根据自己的情况选择:
1、以下示例为宿主机没有安装 node 环境的写法;
2、先在本地构建包含 nodeexpress 的基础镜像,再将构建好的镜像传到服务器直接基于构建好的镜像创建容器;
3、在宿主机安装 node 环境,将 express 工程源码上传到服务器,通过 sh 脚本在服务器构建镜像,再基于构建好的镜像创建容器。

Dockerfile

# 基础镜像为 Alpine Linux 版本 3.13, 使用 Alpine Linux 作为容器的基础操作系统
FROM alpine:3.13

# 容器默认时区为UTC,如需使用上海时间请启用以下时区设置命令
# RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

# 安装依赖包,如需其他依赖包,请到alpine依赖包管理(https://pkgs.alpinelinux.org/packages?name=php8*imagick*&branch=v3.13)查找。
RUN apk add --update --no-cache nodejs npm

# 指定工作目录
WORKDIR /app

# 拷贝包管理文件
COPY package*.json /app

# npm 源,选用国内镜像源以提高下载速度
RUN npm config set registry https://registry.npm.taobao.org/

# npm 安装依赖
RUN npm install

# 将当前目录(dockerfile所在目录)下所有文件都拷贝到工作目录下(.gitignore中的文件除外)
COPY . /app

# 执行启动命令.
# 写多行独立的CMD命令是错误写法!只有最后一行CMD命令会被执行,之前的都会被忽略,导致业务报错。
# 请参考[Docker官方文档之CMD命令](https://docs.docker.com/engine/reference/builder/#cmd)
# 执行 package.json 的 scripts 中约定的自定义命令时,格式必须为 CMD ["npm", "run", "命令"]
CMD ["npm", "run", "pro"]

2、在 express 项目根目录下新增 deploy.sh 部署脚本,内容如下:

# 停止正在运行的容器
docker stop container_name

# 删除正在运行的容器
docker rm -f container_name

# 删除已存在的镜像
docker rmi image_name:latest 

# 构建镜像
docker build -t  image_name:latest . 

# 基于构建的镜像创建容器,并将服务的日志目录挂载到宿主机,没有日志可以不挂,视自己情况挂载
docker run -d -p 3000:3000 -v /path/logs:/app/logs --name container_name image_name

3、在 express 项目根目录下新增 .dockerignore 文件,用于指定在构建 Docker 镜像时需要被忽略的文件和目录,内容如下:

Dockerfile
.dockerignore
node_modules
npm-debug.log

4、将 express 项目文件上传至服务器任意目录,进入项目根目录,执行如下命令,成功后会显示容器的标识符(长字符串)

sh ./deploy.sh

在这里插入图片描述

docker images  // 查看生成的镜像

在这里插入图片描述

docker ps -a // 查看已经创建的所有容器,包括失败的

如果 STATUSUP 则表示成功,失败的话可以执行 docker logs container_name 查看原因

在这里插入图片描述
5、配置 nginx 代理,主要内容如下:

没有 ssl 证书则可以不配 ssl_ 开头的参数

server {
    listen 80;
    listen       443 ssl;
    server_name  demo.com;
    ssl_certificate       /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key   /etc/nginx/ssl/privkey.key;
    ssl_session_timeout 5m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    # listen       80;
    # listen  [::]:80;

    client_max_body_size 10m;

    #access_log  /var/log/nginx/host.access.log  main;

    location /api/ {
      proxy_set_header HOST $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # 如果是腾讯云服务器,xxx只能是内网 ip,被卡(keng)了很久
      proxy_pass http://xxx:3000/; 
    }

    location / {
       root   /usr/share/nginx/html;
       index  index.html index.htm;
    }
    
    # ...
}

6、重启 nginx 服务后,就能正常使用了,如果是容器部署的 nginx,则直接重启容器就行

docker restart nginx

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

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

相关文章

【C++】day5学习成果:继承和六个特殊成员函数的代码应用、静态成员 继承 类的关系模型 类的继承步骤的思维导图。

1.代码题:实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有…

STC15/8单片机特有的PWM寄存器和普通定时器实现PWM输出

STC15/8单片机特有的PWM寄存器和普通定时器实现PWM输出 🌿主要针对STC15W4型号特有的6通道15位专门的高精度PWM。 🌿STC8系列 ✨STC15W4K32S4系列单片机具有6通道15位专门的高精度PWM(带死区控制)和2通道CCP(利用它的高速脉冲输出功能可实现11~16位PWM);(STC15F/L2K60S2系…

JAVA8接口使用问题

JAVA8接口使用问题 文章目录 JAVA8接口使用问题1、默认方法冲突问题(1)亲爹优先原则(2)左右为难 2、常量冲突问题 1、默认方法冲突问题 (1)亲爹优先原则 当一个类,既继承一个父类,…

助力智能化公路养护,基于YOLOv5s集成SPD-BIFPN-SE开发构建公路开裂检测识别系统

在前文中我们尝试构建了在隧道、涵洞尝尽下的自动智能化养护巡查相关的模型,进行了实地测试评估,感兴趣的话可以自行移步阅读即可: 《基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统》 本文的想法是相近的,核心…

Linkerd2初探

Linkerd2初探 部署环境Linkerd简介安装Linkerd客户端在k8s上安装Linkerd控制平面(服务端)实验:数据平面代理注入demo应用安装viz插件(可视化面板)部署grafana 其他 部署环境 k8s环境: KIND 模拟kubernetes 1.21.1 kub…

页面设计都有哪些好用的工具推荐?

对于设计师来说,方便的页面设计工具和稳定的页面设计灵感也同样重要。 在今天的信息爆炸中,很容易找到页面设计工具,网上搜索有很多建议,但找到合适的页面设计工具并不那么简单。 本文推荐不容错过的9款页面设计工具 即时设计 …

【DevOps核心理念基础】3. 敏捷开发最佳实践

一、敏捷开发最佳实践 1.1 项目管理 1.2 需求管理 1.3 技术架构 1.4 技术开发 1.5 测试 二、敏捷开发最佳实践 2.1 敏捷开发的执行细节 三、全面的DevOps工具链 四、版本控制和协作开发工具 4.1 集中式版本控制工具 4.2 分布式版本控制工具 一、敏捷开发最佳实践 …

mysql的一些知识点或者说踩过的坑和想记住的内容

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的,数据要整理成和表格一致,也就是说每条数据都是完整的一条,而不是一部分。 下面的示例我以***为分割符划分字段,以 \n来分割每条数据。 LO…

【atoi函数的功能介绍及使用与模拟实现——超详细版本】

atoi函数的功能介绍及使用与模拟实现——超详细版本 1.cplusplus网站介绍💻 1.1atoi函数的功能介绍💻 它的功能: 解析将其内容解释为整数的 C 字符串,该整数作为 类型的值返回。 该函数首先根据需要丢弃尽可能多的空格字符&…

java复习-eclipse开发工具使用

开发工具使用 项目文件结构 建立完成的项目目录中会自动创建有两个子目录: src:保存所有的 *.java 源文件bin:保存所有编译后的 *.class 程序文件,这些文件会自动进行编译处理 保存文件后,会自动进行编译。 快捷键…

无需专业技能,轻松创建个人博客:Cpolar+Emlog在Ubuntu上的搭建指南

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…

基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统

隧道内的定期检查与维护,对于及时发现和消除潜在的安全隐患有着重要的作用,基于人工的传统巡查方式不仅极为低效而且成本很高,将智能化的图像检测识别计数与实际的养护巡查场景相结合,开发构建智能AI检测识别系统是否可行&#xf…

C++QT day 5

实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半…

element-table 行的拖拽更改顺序(无需下载sortableJs

样例展示&#xff1a;vueelement 通过阅读element文档我们发现element并不提供拖拽相关的api 本博客通过element提供的行类名 注册函数 实现行与行的拖拽 1.设置el-table 的行样式类名 这里是用的是 function <el-table:data"outputData":row-class-name&qu…

Codeforces Round 896 (Div. 2)题解

前言: 3 solved of 7 A、B、C,太菜了&#xff0c;写B题的时候&#xff0c;常数设成1e5了&#xff0c;一直卡在Test 4,没想到一直提示我TLE&#xff0c;没有提示RE&#xff0c;导致我浪费了很多时间在B题上&#xff0c;最后时间太晚了交了TLE了一发睡觉去了 A-Make It Zero …

SpringCloud:Feign实现微服务之间相互请求

文章目录 &#x1f389;欢迎来到Java学习路线专栏~SpringCloud&#xff1a;Feign实现微服务之间相互请求 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java学习路线&#x1f4dc;其他专栏&#xf…

Sui Move智能合约提供更智能和简单的编程

编写区块链和其他计算环境的代码有很多相似之处&#xff0c;但区块链的重点大部分都集中在构建智能合约上。智能合约部署编译后的代码&#xff0c;本质上是在区块链上自动执行交易的apps。Sui网络本地的Sui虚拟机使用Sui Move编程语言编写智能合约。 术语“智能合约”意味着区…

Python之离线安装第三方库

1、场景介绍 在一些服务器上&#xff0c;我们搭建完Python环境之后&#xff0c;因为服务器的网络限制原因&#xff0c;不能直接通过pip命令下载安装Python的依赖包。 因此&#xff0c;我们需要在可以正常上网的服务器上下载好所需的依赖包文件&#xff0c;然后拷贝到目标服务器…

Screen的详细全面安装教程及Screen的用法

Screen可以大大提高终端使用效率&#xff0c;是Linux系统管理和运维的必备技能。当我们开启Screen后&#xff0c;只要Screen进程没有终止&#xff0c;其内部运行的会话都可以恢复。即使网络连接中断&#xff0c;用户也可以重新进入已开启的Screen中&#xff0c;对中断的会话进行…

Three.js-绘制矩形shader

绘制图中的嵌套矩形框 方法&#xff1a; vec3 drawRect(vec2 st,vec2 center,float width,float height,float thickness,vec3 fillColor, vec3 strokeColor) {vec3 color vec3(0);float halfWidth width * .5;float halfHeight height * .5;float halfTickness thicknes…