美文网首页
编写高可用的docker,node运行环境

编写高可用的docker,node运行环境

作者: 茶艺瑶 | 来源:发表于2019-11-13 23:16 被阅读0次

    因为笔者之前都是用docker来跑php的,这里的php用的还是php-fpm,只不过开启opchace,以前跑node.js的时候,我并没有用docker来运行,用的pm2.js。所以并没有在意这些。

    现在还在用node.js 8,不过现在看到node.js 13了,我是有点担心node.js的api兼容性问题,所以今天在部署环境的时候,还是考虑用docker来管理node.js版本,你会说,不是有node.js n nvm之类的管理吗?有是有,可是我个人感觉没有docker 直接用镜像的来区分更加方便。

    我在编写Dockerfile的时候,会先去github上浏览一下别人的代码,我找了一下,大致很多人的代码,都是Docker,并没有使用docker-compose,也有一些是用上的,不过他们是和他们的项目结构捆绑在一起的docker-compose。我想要的是

    image.png image.png

    类似自己编写的容器编排程序,nginx 做了负载均衡 代理 nginx_web
    和 varnish 静态缓存服务器。

    我需要把我的php程序放到我的app文件下就可以运行的docker-compose

    于是我就编写了而不是还要参考你项目结构的Dockerfile镜像,我只需要一个纯净的node.js和项目需要的node_models,而不是你项目原先已经规定好的项目结构和已经把我打包的node_models镜像。

    image.png

    首先我们docker-compose容器编排文件如下

    version: "3"
    services:
      app:
        build: .
        # image: myphp:latest
        ports:
          - 80:80
        volumes:
          - ./apisocket:/app
        environment:
          - TZ=Asia/Shanghai
    
    networks:
        frontend:
        backend:
    
    

    Dockerfile 如下

    FROM node:8.9-alpine
    
    RUN mkdir /app
    VOLUME [ "/app" ]
    
    WORKDIR /app
    
    RUN npm config set unsafe-perm true #如果在docker 不添加这个 会报Error: could not get uid/gid的错误
    
    RUN npm set registry https://registry.npm.taobao.org/
    
    RUN npm install -g pm2 typescript
    
    RUN npm install
    
    CMD ["pm2-docker","dist/app.js"]
    
    EXPOSE 80
    
    

    可是笔者在运行的时候,发现一个问题,在build的镜像的过程中,死活不能build成功!!!

    他会在 npm install中报一个错误!,not cna't open package.json。

    由于我以前做的php 容器编排 都是这么处理的呀。怎么的到了编译形式语言就不能node.js就不能呢?

    我不是在docker-compose.yml 上把项目路径映射容器了吗???

    我对Dockerfile也没有深入了解,也就看来一下Dockerfile几个关键词而已。

    我经过半个小时的沉思之后,我猜测一个想法,就是docker-compose在运行的时候,的路径映射是不参与打包镜像里面的。

    所以npm install这一类的操作应当放在 docker-compose.yml的command属性中进行操作。

    所以后面我的两个文件有进行了修改

    # Dockerflie
    
    FROM node:8.9-alpine
    
    RUN mkdir /app
    VOLUME [ "/app" ]
    
    WORKDIR /app
    
    RUN npm config set unsafe-perm true
    RUN npm set registry https://registry.npm.taobao.org/
    
    RUN npm install -g pm2 typescript
    
    EXPOSE 80
    
    
    # docker-compose.yml 
    version: "3"
    services:
      app:
        build: .
        # image: myphp:latest
        ports:
          - 80:80
        volumes:
          - ./apisocket:/app
        environment:
          - TZ=Asia/Shanghai
        command:
          - sh
          - -c
          - |
              npm install
              npm run tsc
              pm2-docker dist/app.js
    
    networks:
        frontend:
        backend:
    
    

    这样之后,无论你什么node.js项目都好,只要你改名为app文件,
    并修改 pm2-docker dist/app.js这里,都可以愉快的运行
    只要 sudo docker-compose upsudo docker-compose down
    如果切换node.js 只需要去 Dockerfile中修改一下数字
    然后 sudo docker images && sudo docker rmi [imageId] 。
    之后再运行 sudo docker-compose up 从新制作新的容器镜像。

    相关文章

      网友评论

          本文标题:编写高可用的docker,node运行环境

          本文链接:https://www.haomeiwen.com/subject/dptlictx.html