首页 > 编程语言 >通过 Docker 部署 nodejs -- egg 项目

通过 Docker 部署 nodejs -- egg 项目

时间:2022-08-18 19:12:42浏览次数:83  
标签:容器 name nodejs -- package 镜像 Docker docker

常用的 docker 命令

  • 安装 docker 环境
  • docker --help 查看 docker 命令提示
  • docker ps -a 查看所有运行的容器
  • docker images 查看所有的
  • 配置 Dockerfile 文件
  • 查看容器运行日志:docker logs -f [containerId]

Docker 打包 egg 镜像
  • 在项目根目录新建 Dockerfile 文件,编辑内容如下
# 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:10.13.0

# 配置环境变量
ENV NODE_ENV production

# 这个是容器中的文件目录
RUN mkdir -p /usr/src/app 

# 设置工作目录
WORKDIR /usr/src/app

# 拷贝package.json文件到工作目录
# !!重要:package.json需要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。
# 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块,这样木有必要。
# 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/app/package.json

# 安装npm依赖(使用淘宝的镜像源)
# 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。
RUN npm i --production --registry=https://registry.npm.taobao.org

# 拷贝所有源代码到工作目
COPY . /usr/src/app

# 暴露容器端口
EXPOSE 9000

CMD npm start

复制代码
  • 在 egg 项目的 package.json 文件中,在 start 启动项中,--daemon 是后台启动。如果使用 docker 容器,需要去除 --daemon .
  • 进入项目根目录,执行镜像打包命令: docker build -t image_name ./
  • 打包完成以后执行容器启动命令: docker run -itd --net=host --name container_name -p 8000:8000 image_name
  • -t 这个参数很重要,它代表不会进入到容器内部去执行命令,如果去掉它,会在容器内部执行启动 Dockerfile CMD 中的命令。
  • 执行完毕后,可以通过 docker ps 命令去查看,会显示正在运行的容器,如果发现容器没有正常启动,可以执行 docker logs -f containerID 命令,查看容器内的执行日志。

可能出现的问题


  1. 容器无法正常启动:出现这种情况,首先检查你的容器打包命令是否正确,docker ps -a 命令查看你打包的所有容器. 容器打包命令中的 -itd 中的 -d 相当于在容器内部执行了 Dockerfile 文件中的 CMD 命令,我们知道在 nodejs 中执行命令后控制台会有日志输出,可以通过 docker logs -f containerID 检查日志输出。
  2. 容器正常启动,但是容器中的程序无法正常连接本地宿主机中的数据库等本地服务,首先要搞清楚服务端口号,在容器运行命令中加上对应的端口映射,比如 docker run -itd --net=host --name container_name -p 8000:8000 -p 9999:9999 image_name 这个 --net=host 参数非常重要,这告诉容器和宿主机共享网络。这个时候,在容器内部可以通过你映射的端口号去正常访问本地服务。
  3. 如果前面两个步骤执行完以后,还是无法正常启动和访问服务,建议去 egg.js github 仓库中去查询相关问题的解决方案 egg.js issue

作者:工程师皮先生
链接:https://juejin.cn/post/6844904066640773133
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:容器,name,nodejs,--,package,镜像,Docker,docker
From: https://www.cnblogs.com/gaoyanbing/p/16599801.html

相关文章

  • jmeter-分布式压测
    jmeter为什么要做分布式压测一台压力机的Jmeter支持的线程数受限于Jmeter其本身的机制和硬件配置(内存、CPU、IO等)是有限的由于Jmeter是Java应用,对CPU和内存的......
  • 1013 [USACO 2007 Ope S]Catch That Cow bfs 剪枝
     链接:https://ac.nowcoder.com/acm/contest/26077/1013来源:牛客网题目描述FarmerJohnhasbeeninformedofthelocationofafugitivecow......
  • 基础知识与解压缩命令
    目录结构白色:表示普通文件蓝色:表示目录绿色:表示可执行文件红色:表示压缩文件浅蓝色:链接文件红色闪烁:表示链接的文件有问题黄色:表示设备文件灰色:表示其它文件打......
  • leetcode415_字符串相加
    字符串相加模拟手算:(1)注意对其最低项(2)注意进位publicStringaddStrings(Stringnum1,Stringnum2){inti=num1.length()-1;intj=num2.......
  • CF1625E1 Cats on the Upgrade (easy version)
    刚刚学完whk时无聊看了下提交记录,发现这道富有启发意义的题目。首先,注意到这实际上就是个序列的《括号树》,拿来做就行,\(f_i\)为以\(i\)结尾的合法括号串数量,\(f_i=f......
  • 彻底了解线程池的原理——40行从零开始自己写线程池
    彻底了解线程池的原理——40行从零开始自己写线程池前言在我们的日常的编程当中,并发是始终离不开的主题,而在并发多线程当中,线程池又是一个不可规避的问题。多线程可以提......
  • 二分法代码笔记
    二分法代码笔记最近复习二分法的题目,发现左右区间的二分写法总是无法第一时间写出正确的,故痛定思痛,通过写笔记的形式记录下来。这里需要说明的是,二分法多用于单调情况下......
  • 自动根据文件目录生成vue路由
    前言每创建一个新的页面需要手动添加路由虽然不是很麻烦的动作,但是也是很繁琐的动作,如果能够再创建文件的时候自动生成路由还是能省一些动作避免一些错误,比如导入路径不对......
  • con·tam·i·nate
    contaminate[fromcontamen'contact']→contaminant,contamination,pollutepollutant,pollutionIsThereADifferenceBetweenPollutionAndContamination?P......
  • html常用模板-附带样式
    <!DOCTYPEhtml><htmllang="zh-Hans-CN"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><metaname="rende......