当前位置: 首页 > 后端技术 > Node.js

使用docker高效部署前端应用

时间:2023-04-03 17:53:16 Node.js

docker越来越受欢迎。可以方便灵活的进行环境隔离,扩容,方便运维管理。也更方便开发者开发、测试和部署。最重要的是,当你面对一个不熟悉的项目时,你可以跟着Dockerfile甚至阅读文档(文档不一定完整,也不一定都是正确的),你可以很快让它在本地运行起来。现在我强调devops的概念。我把devops这五个字放在电脑桌面上,学了一天。突然之间,devops的意思就是写一个Dockerfile来运行应用(开玩笑的,下面是如何使用Docker部署前端应用,千里之行,始于足下。一步之遥的意思就是先让它跑起来原文地址:如何使用Docker高效部署前端系列文章:当我有云服务器的时候,我做了什么?如果能帮到你,可以帮我在shfshanyue/上点个starop-note让它先跑起来首先简单介绍一个典型的前端应用部署流程npminstall,安装依赖npmrunbuild,编译,打包,生成静态资源servicestaticresources介绍完部署流程,简单写下aDockerfileFROMnode:alpine#代表生产环境ENVPROJECT_ENVproduction#很多包会根据这个环境变量做出不同的行为#另外webpack中打包也会根据这个环境变量进行优化,但是create-react-app会打包时把环境变量写死ENVNODE_ENVproductionWORKDIR/codeADD./codeRUNnpminstall&&npmrunbuild&&npminstall-ghttp-serverEXPOSE80CMDhttp-server./public-p80现在前端服务运行起来了。然后您可以完成部署的其他阶段。总的来说,下面就变成了运维的工作。然而,扩大你的知识边界总是对的。使用nginx或traefik作为反向代理,使用kubernetes或compose进行编排。在使用gitlabci或者droneci做CI/CD的时候,镜像有两个问题,导致每次部署的时间很长,不利于产品的快速交付。构建映像时间太长。buildimagesize太大,dependencies和devDependencies1G+卢晓峰说,如果一个前端程序员每天工作八小时,至少要浪费两个小时。npminstall一个小时,npmrunbuild另一个小时。对于每次部署,如果能减少无用包的下载,就可以节省大量的镜像构建时间。eslint、mocha、chai等代码风格测试模块可以放在devDependencies中。使用npminstall--production在生产中安装包。两者的区别可以参考文档:https://docs.npmjs.com/files/...FROMnode:alpineENVPROJECT_ENVproductionENVNODE_ENVproductionWORKDIR/codeADD。/codeRUNnpminstall--production&&npmrunbuild&&npminstall-ghttp-serverEXPOSE80CMDhttp-server./public-p80似乎快了一点。我们注意到package.json与项目的源文件相比相对稳定。如果没有新的安装包下载,再次构建镜像时无需重新安装。然后你可以在npminstall上节省一半的时间。使用镜像缓存对于ADD,如果需要添加的内容没有变化,可以使用缓存。把package.json和源文件分开写镜像是个不错的选择。目前如果没有新的安装包更新,可以节省一半的时间FROMnode:alpineENVPROJECT_ENVproductionENVNODE_ENVproduction#http-server也可以不改RUNnpminstall-ghttp-serverWORKDIR/codeADD包使用缓存。json/codeRUNnpminstall--productionADD./codeRUNnpmrunbuildEXPOSE80CMDhttp-server./public-p80使用缓存的细节比较多,需要特别注意,比如RUN的缓存gitclone,请参考官方文档https://docs.docker.com/devel...由于缓存,多阶段构建现在具有更快的图像构建时间。但是镜像的体积还是太大了,会增加每次部署的时间。考虑每个CI部署的过程。在构建服务器上构建镜像,并将镜像推送到镜像仓库服务器。在生产服务器上拉取镜像。启动容器是显而易见的。体积过大导致传输效率低下,增加每次部署的延迟。即使构建服务器和生产服务器在同一个节点下,也不存在延迟问题。减小图像的大小也可以节省磁盘空间。图像的很大一部分大小是由于node_modules臭名昭著的大小,但最终我们只需要public文件夹中的内容。对于源文件和node_modules下的文件,体积过大且Unnecessary,造成浪费。这时候可以使用Docker的多阶段构建来提取编译后的文件。参考官方文档https://docs.docker.com/devel...FROMnode:alpineasbuilderENVPROJECT_ENVproductionENVNODE_ENVproduction#http-server没有改动可以使用缓存WORKDIR/codeADDpackage.json/codeRUNnpm安装--productionADD。/codeRUNnpmrunbuild#SelectasmallerbaseimageFROMnginx:alpineCOPY--from=builder/code/public/usr/share/nginx/html此时,镜像大小从1G??+变成了50M+。使用CDN分析50M+的图片大小。nginx:alpine的镜像大小为16M,其余40M为静态资源。如果静态资源上传到CDN,则不需要输入图片。这时候图片的大小会控制在20M以下。关于静态资源,可以分为/static两部分。此类文件直接引用项目中的根路径并打包。当复制到/public时,需要将其键入到图像/build中。此类文件需要被require引用,会被webpack打包并加上hash值,通过publicPath修改资源地址。可以将此类文件上传到cdn,并添加永久缓存,无需进入镜像FROMnode:alpineasbuilderENVPROJECT_ENVproductionENVNODE_ENVproduction#http-server也可以不改WORKDIR/codeADDpackage.json/codeRUN使用缓存npminstall--productionADD./code#npmrunuploadCdn是上传静态资源到CDN的脚本文件RUNnpmrunbuild&&npmrunuploadCdn#选择一个较小的基础镜像FROMnginx:alpineCOPY--from=buildercode/public/index.htmlcode/public/favicon.ico/usr/share/nginx/html/COPY--from=buildercode/public/static/usr/share/nginx/html/static欢迎关注公众号山月之旅,我会定期分享一些前后端和运维的文章,每天都会有关于技术和生活的回顾和总结。欢迎关注交流