docker 部署 node.js(express) 服务

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.hqwc.cn/news/107448.html

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

相关文章

第6章_freeRTOS入门与工程实践之创建FreeRTOS工程

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id724601559592 配套资料获取:https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

深入学习 GC 算法 - 标记清除算法

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法…

骨传导耳机的危害有哪些?会损害听力吗?

如果正常的使用,骨传导耳机是没有危害的,由于骨传导耳机独特的传声方式,所以并不会对人体造成损伤,还可以在一定程度上保护听力。 如果想更具体知道骨传导耳机有什么危害,就要先了解什么是骨传导耳机,骨传…

科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画

近日,美国专利商标局正式授予苹果一项与虚拟纸张相关的专利。这是与虚拟纸张这项发明相关的第二项专利,鉴于苹果 Vision Pro 将于明年上市,那么我们离苹果实现虚拟纸张的发明又近了一步。 虚拟纸张将能够包含 2D、3D 和动画等 MR内容&#…

视频监控系统/视频云存储EasyCVR接入国标GB28181设备无法播放设备录像,是什么原因?

安防视频监控平台EasyCVR支持将部署在监控现场的前端设备进行统一集中接入,可兼容多协议、多类型设备,管理员可选择任意一路或多路视频实时观看,视频画面支持单画面、多画面显示,视频窗口数量有1、4、9、16个可选,还能…

centos通过docker安装rabbitMq和延迟队列说明

安装步骤 首先进行docker安装可参考docker官网 下载镜像启动rabbitmq下载rabbitMq插件进入docker命令安装插件重新启动rabiitmq 1.下载镜像 docker pull rabbitmq:3.9.152.启动镜像 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USERad…

初识Java 8-1 接口和抽象类

目录 抽象类和抽象方法 接口定义 默认方法 多重继承 接口中的静态方法 作为接口的Instrument 本笔记参考自: 《On Java 中文版》 接口和抽象类提供了一种更加结构化的方式分离接口和实现。 抽象类和抽象方法 抽象类,其介于普通类和接口之间。在构…

C++信息学奥赛1170:计算2的N次方

#include <iostream> #include <string> #include <cstring>using namespace std;int main() {int n;cin >> n; // 输入一个整数nint arr[100];memset(arr, -1, sizeof(arr)); // 将数组arr的元素初始化为-1&#xff0c;sizeof(arr)表示arr数组的字节…

零极点分析的基本原理、应用和意义

零极点分析的基本原理、应用和意义 在信号处理和系统理论领域&#xff0c;零极点分析是一项重要的技术&#xff0c;用于研究和分析滤波器的特性和行为。通过观察滤波器的零点和极点在复平面上的分布情况&#xff0c;我们可以揭示滤波器的频率响应、稳定性和传输特性等关键信息。…

LabVIEW以编程方式查找系统中DAQ设备的设备名称

LabVIEW以编程方式查找系统中DAQ设备的设备名称 使用DAQmx VI&#xff0c;“创建虚拟通道”函数&#xff0c;这个函数需要物理通道输入端。当使用相同型号的新设备&#xff08;例如&#xff0c;两个不同的USB-6210&#xff09;运行可执行文件时&#xff0c;代码会中断&#xf…

【C++】反向迭代器精讲(以list为例)

目录 二&#xff0c;全部代码 三&#xff0c;设计思路 1. 讨论 2. 关于迭代器文档一个小细节 结语 一&#xff0c;前言 如果有小伙伴还未学习普通迭代器&#xff0c;请参考这篇文章中的普通迭代器实现。 【STL】list用法&试做_底层实现_花果山~~程序猿的博客-CSDN…

Java从入门到精通-类和对象(二)

0. 类和对象 3. 类的构造方法 构造方法是一种特殊的方法&#xff0c;用于创建和初始化对象。构造方法的名称必须与类名相同&#xff0c;它没有返回值&#xff0c;并且在创建对象时自动调用。构造方法的主要作用是确保对象在创建时具有合适的初始状态。 以下是构造方法的基本概…