• 通过 Docker 部署 nodejs egg 项目


    常用的 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
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    JDBC 实例--JDBC通过工具类DBUtil连接到数据库,让我们不再恐惧操作数据库
    揭开JDBC的神秘面纱,让JDBC数据库的连接参数不再神秘
    实验六 最小代价生成树
    实验五 背包问题和带时限的作业排序
    实验四 图的遍历算法设计与实现
    实验三 跳表算法设计与实现
    实验二 伸展树算法设计与实现
    算法实例一 算法问题求解基础--欧几里得递归算法和递归算法
    2013年 蓝桥杯预赛 java 本科A 题目
    java常用开发工具类之 图片水印,文字水印,缩放,补白工具类
  • 原文地址:https://www.cnblogs.com/gaoyanbing/p/16599801.html
Copyright © 2020-2023  润新知