React前端项目的Docker化


背景

之前的整个视频云项目都是直接部署在实验室的服务器上,前端直接通过Nginx进行部署(运用反向代理)。现在需要将开发完成的项目整体迁移到阿里云上进行部署,能够通过外网IP和域名进行访问。

为什么要前端Docker化

在进行选型的时候,选择了阿里云提供的Kubernetes容器计算服务,因为相比直接购买ECS云主机或者轻量云服务器,更适合我们项目前期的低使用率以及后期的可扩展性需求,不必花费几千元仅购买了个性能较强的云主机。并且将服务拆分为一个个小小的Docker中也更便于项目的运维和部署。

前端Docker化思路

1. 前端镜像形式
  • 以Nginx为基础镜像
  • 将前端打包完成后的build内容copy到镜像中
  • 将Nginx的配置文件Copy到镜像中的对应位置
  • 启动nginx服务,对外暴露80端口
2. 前端打包过程也要在构建中进行
  • 直接将打包完成的build文件Copy进镜像是可行的,但是如果想使用阿里云提供的容器镜像仓库的自动构建服务,需要将前端的打包过程也在镜像构建的过程中进行。
  • 我们知道,最终的前端镜像中不需要那些用于打包的各种依赖,并且实际上我们的代码仓库中,node_modules等依赖并没有添加到git仓库中。
  • Docker构建可以分阶段进行:也就是构建过程分为build环境和最终的production环境。
  • 而通过Dockerfile正好支持这样的构建方式

所使用的Dockerfile文件

# build environment
FROM       node as build
WORKDIR    /app
ENV        PATH /app/node_modules/.bin:$PATH
COPY       . /app
RUN        yarn
RUN       yarn build

# production environment
FROM       nginx
COPY      --from=build /app/build /usr/share/nginx/html
RUN       rm /etc/nginx/conf.d/default.conf
COPY       deploy/nginx.conf /etc/nginx/conf.d
EXPOSE     80
CMD       ["nginx", "-g", "daemon off;" ]

所使用的Nginx配置文件

# deploy/nginx.conf
server {
    listen 80;

    location / {
        root    /usr/share/nginx/html;
        index     index.html    index.htm;
        try_files $uri $uri/    /index.html;
    }

    error_page 500 502 503 504    /50x.html;

    location = /50x.html {
        root    /usr/share/nginx/html;
    }
}

问题与思考

1. 镜像的构建过程太漫长了
  • 主要时间大部分都用在了build环节,并且是依赖安装环节
  • 缩减构建时间很重要
  • 优化思路
    • 项目中有很多多余的依赖,去除这些未使用的依赖
    • 更换yarn依赖安装的源(阿里似乎已经帮我们更换了)
    • 区分依赖区分开发环境和生产环境,比如类似eslint这样的依赖,在生产打包中就不需要了。

总结

最后,由衷感受,Docker真是个好东西,搞技术的都应该学一下。


文章作者: ZWboy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZWboy !
评论
 上一篇
FFmpeg 技术基础 FFmpeg 技术基础
番外格式工厂居然被FFmpeg拉黑名单了,因为没有遵守开源协议,转身就把它卸载了。 一、FFmpeg基础1. FFmpeg处理音视频的流程 解复用(demuxer):带封装格式的输入文件->编码数据包(音频,视频,字幕等) 解码(de
2019-10-27
下一篇 
大脑Cahce系列--前端JavaScript系统梳理 大脑Cahce系列--前端JavaScript系统梳理
背景知识 本文依然按照以往的风格,更注重JavaScript技术的系统性梳理,不赘述技术细节,因为Google一下就好。 基础1. 基础知识 JavaScript:ES5/6 + DOM + BOM ECMAScript 5 201
  目录