首页 > 编程语言 >docker启动node.js项目

docker启动node.js项目

时间:2023-06-08 10:47:29浏览次数:64  
标签:node 容器 WORKDIR pm2 js npm koa2 镜像 docker

原文链接:https://www.cnblogs.com/yalong/p/17463847.html

这里使用 koa2 做为演示项目,使用 Dockerfile 构建 Docker 镜像,项目 Git 地址: 仓库地址

安装Docker

网上都有教程可以自行查找,这里演示的环境是在mac下进行的

在node项目根目录下创建 Dockerfile 文件

项目目录如下:

Dockerfile 文件内容如下:

# FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。
# 如果不指定版本,会默认使用latest,就是最新版本
FROM node:14.3.0

# 创建文件夹 这个文件夹是node环境下的
RUN mkdir -p /app/koa2-demo/

# 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的文件夹下
COPY . /app/koa2-demo

# WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,
# 例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
# cd到 /app/koa2-demo
WORKDIR /app/koa2-demo

# 安装项目依赖包
RUN npm install --registry=https://registry.npm.taobao.org

# 容器对外暴露的端口号(这个3000 必须是当前node项目的端口)
EXPOSE 3000

# 容器启动时执行的命令,类似npm run start
CMD ["npm", "start"]

构建镜像

构建方法如下

docker build -t koa2-demo:1.0 .

-t 是 镜像名字
1.0 是镜像版本,不写版本,默认就是latest
. 指定镜像构建过程中的上下文环境的目录

构建成功后执行,查看镜像列表

docker image ls

如下图所示,就是构建成功了

运行容器

运行容器代码:

docker run -d -p 4000:3000 --name="koa2" koa2-demo:1.0

-d 是在后台执行
-p 是端口映射,这里4000:3000 意思是电脑的4000端口 映射到容器内的3000端口
--name 是容器的名字
最后是执行使用的镜像, 镜像必须指明版本,不然就默认 latest

执行 docker ps 可以查看运行中的容器,如下图所示

本地访问:http://localhost:4000/ 页面可以正常访问

Pm2项目下的Docker启动方式

大部分node.js项目都是用pm2 守护进程的,Dockerfile 改成如下方式

# FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。
# 如果不指定版本,会默认使用latest,就是最新版本
FROM node:14.3.0

# 创建文件夹 这个文件夹是node环境下的
RUN mkdir -p /app/koa2-demo/

# 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的文件夹下
COPY . /app/koa2-demo

# WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,
# 例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
# cd到 /app/koa2-demo
WORKDIR /app/koa2-demo

# 安装项目依赖包
RUN npm install --registry=https://registry.npm.taobao.org
RUN npm install pm2 -g --registry=https://registry.npm.taobao.org

# 容器对外暴露的端口号(这个3000 必须是当前node项目的端口)
EXPOSE 3000

# 容器启动时执行的命令,类似npm run start
# CMD ["npm", "start"]
# CMD ["pm2-runtime", "pm2.json"]
CMD ["pm2", "pm2.json"]

上面代码的启动方式就是执行了 pm2 start pm2.json
但是发现容器起不来,是因为pm2 的启动方式是在后台运行,Docker 会以为没有程序在运行,所以需要做下调整,新的Dockerfile 内容如下:

# FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。
# 如果不指定版本,会默认使用latest,就是最新版本
FROM node:14.3.0

# 创建文件夹 这个文件夹是node环境下的
RUN mkdir -p /app/koa2-demo/

# 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的文件夹下
COPY . /app/koa2-demo

# WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,
# 例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
# cd到 /app/koa2-demo
WORKDIR /app/koa2-demo

# 安装项目依赖包
RUN npm install --registry=https://registry.npm.taobao.org
RUN npm install pm2 -g --registry=https://registry.npm.taobao.org

# 容器对外暴露的端口号(这个3000 必须是当前node项目的端口)
EXPOSE 3000

# 容器启动时执行的命令,类似npm run start
# CMD ["npm", "start"]
CMD ["pm2-runtime", "pm2.json"]

就只是把 pm2 start pm2.json 改为 pm2-runtime start pm2.json 即可

Docker 常用命令

  • docker image ls # 查看本地镜像
  • docker images # 查看本地镜像
  • docker ps # 查看运行中的容器,停止状态的容器不展示
  • docker ps - a # 查看全部容器,包括停止状态的容器
  • docker logs 容器id # 查看容器的日志, 容器id不用输入全部,一般输入容器id的前三位就行
  • docker exec -it 容器id bash # 进入容器内部, 在容器内部 输入 exit 退出容器
  • docker stop 容器id # 关闭容器
  • docker rm 容器id # 删除容器
  • docker rmi 镜像id # 删除镜像

标签:node,容器,WORKDIR,pm2,js,npm,koa2,镜像,docker
From: https://www.cnblogs.com/yalong/p/17463847.html

相关文章

  • js 分页拆分数据
    splitData(data,pageSize,pageNum){ constresult=[]; constpageTotal=Math.ceil(data.length/pageSize);//计算总页数 //for(leti=0;i<pageTotal;i++){ //conststartIndex=i*pageSize;//计算本页数据的起始位置 //constendI......
  • Docker(五):部署Tomcat
    1.查找tomcatdockersearchtomcat[root@VM-8-4-centos~]#dockersearchtomcatNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDtomcatApacheTomcatisanopen......
  • docker搭建hadoop和hive集群
    一、安装docker并生成相关的镜像(1)安装docker安装docker教程https://www.runoob.com/docker/centos-docker-install.html只要在终端输入:sudodockerrunhello-world后出现如下图的内容就证明安装docker成功了(2)拉取CentOS镜像(Ubuntu镜像也行)在终端输入:sudodockerpullcent......
  • go json、yaml解码
    func GetFoo(ctx context.Context) (*T, error) {  req, err := http.NewRequest("GET", "http://foo/t.json", nil)  if err != nil {    return nil, err  }  req = req.WithContext(ctx)  res, err := http.DefaultClient.Do(req)  if e......
  • Docker(四):部署Nginx
    1.查找Nginx镜像dockersearchNginx 2.下载Nginx镜像dockerpullnginx 3.查看是否下载成功dockerimages 4.创建容器并启动dockerrun-d-p8081:80--nameNginx01nginx这里使用nginx镜像创建了一个名为Nginx01的容器,开放外主机端口8081映射到容器的80端......
  • 移动端预览PDF,pdf.js预览PDF文件流格式
     一开始使用了vue-pdf效果并不理想,满足不了要求还出现兼容问题,PDF.js似乎是一个完美的解决方案,号称兼容各种浏览器.快速且高效.界面按钮可以配置,而且也比原生iframe框架好看一些,但是一轮的使用下来,确确实实躺了不少的坑,特此记录一下全过程,希望以后使用的时候注意一点.以......
  • 使用THREEJS实现一个可调节档位、可摇头的电风扇
    夏天到了,用Three.js实现一个可以摇头和调节档位的电风扇。主要使用到Blender处理3D模型,用Vite+Typescript搭建项目框架。效果演示:一、处理模型1、从爱(bai)给(gei)网下载一个风扇的3D模型,在Blender中打开,给模型贴上图。2、拆解模型。将风扇模型拆解成按钮、底座、扇叶、头部......
  • JS 模拟 队列 结构
    Code:/***队列(基于动态数组)*@class*/varAQueue=(function(){/***栈容器*@type{DArray}*/letarr;/***@class*/class_AQueue{/***构造器*@constructor*@param{number}[capacity]*/con......
  • Docker(三):Docker的常用命令
    一、官方命令文档https://docs.docker.com/reference/二、基础命令1.查看docker版本信息dockerversion2.查看docker详细信息dockerinfo3.docker帮助命令docker--help三、镜像命令1.查看本机镜像dockerimages此命令能够查看本机上所有的镜像信息REPSOITO......
  • JS 中 使用 Uuid
    一、官方网站https://github.com/uuidjs/uuid二、安装uuidnpminstalluuid三、导入uuid注:官方文档里的示例只适用于服务端(nodejs),想在浏览器里使用,得换一种导入方法nodejs:import{v4asuuidv4}from'uuid';浏览器js:constuuidv4=require('uuid').v4;四、使用c......