原文转载自《刘越的技术博客》https://v3u.cn/a_id_179随着现代产品的发展随着我们的不断推进,我们会发现几乎每一个产品线都会包含不同功能的服务,服务之间会存在错综复杂的依赖和依赖关系,这会带来一个世界性的问题。在部署时运维需要手动配置服务之间的通信协议和地址。稍有不慎就会导致服务异常。同时,如果由于坏道或其他原因更换服务器,重新部署新环境的成本也会增加。很高。所以,我们会希望Docker这样的容器技术能够让我们能够快速快速地重新部署我们构建产品所需要的所有服务,并且能够按需横向扩展,并且能够保证稳定的容灾。当出现问题时,守护进程可用于自动重启或启动灾难恢复备份。本次我们将利用Docker容器技术,将前后端分离项目Django+Vue.js打包在Win10环境下,并定制相应的项目镜像,以满足快速部署和高扩展的需求。首先当然是安装Docker。可以参考这个视频教程:win10安装配置Docker和替换国内源。然后在主机上安装gunicorn。在容器中,我们使用异步方式启动Djangopip3isntallgunicorngeventDjango项目配置settings.py对应的应用:contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','corsheaders','rest_framework','myapp','dwebsocket','gunicorn']然后写下Django项目根目录下的gunicorn配置文件:gunicorn.conf.pyimportmultiprocessingbind="0.0.0.0:8000"#绑定ip和portworkers=1#这里的进程数注意,ip必须是0.0。0.0,不要写成127.0.0.1,否则外部环境将无法访问容器中的服务,然后在项目根目录写一个依赖列表:requirements.txtDjango==2.0.4django-cors-headers==2.5.3djangorestframework==3.9.3celery==4.4.2dwebsocket==0.5.12redis==3.3.11pymongo==3.8.0PyMySQLPillowpyjwtpycryptodomeseleniumqiniugunicorngevent需要注意的是,有些依赖最好使用==来标记库的次要版本,因为在通过pip安装的时候在容器,系统可能会自动为你安装最新版本,导致一些依赖错误。下面是老套路,在根目录写一个DockerFile文件:FROMpython:3.7WORKDIR/Project/mydjangoCOPYrequirements.txt./RUNpipinstall-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/简单COPY..ENVLANGC.UTF-8CMD["gunicorn","mydjango.wsgi:application","-c","./gunicorn.conf.py"]这个基础镜像我们选择3.7,毕竟2020年了,还是要与时俱进。ok,万事备备,运行命令对项目进行打包:liuyue@DESKTOP-NVU6CCVMINGW32~/www/mydjango(master)$dockerbuild-t'mydjango'.将构建上下文发送到Docker守护进程17.57MB第1/7步:FROMpython:3.7--->5b86e11778a2第2/7步:WORKDIR/Project/mydjango--->使用缓存--->72ebab5770a2第3/7步:复制要求.txt./--->使用缓存--->b888452d1cad第4/7步:运行pipinstall-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple--->使用缓存--->a576113cff5a步骤5/7:复制。.--->5c5247d5a743步骤6/7:ENVLANGC.UTF-8--->在af84623622a6中运行删除中间容器af84623622a6--->f3d876487dab步骤7/7:CMD["gunicorn","mydjango.wsgi:application","-c","./gunicorn.conf.py"]--->在d9392807ae77中运行删除中间容器d9392807ae77--->c3ffb74ae263成功构建c3ffb74ae263成功标记mydjango:latest安全警告:您正在针对非WindowsDocker主机从Windows构建Docker映像。添加到构建上下文的所有文件和目录都将具有“-rwxr-xr-x”权限。建议对敏感文件和目录仔细检查并重置权限。这里需要注意的是进入项目目录并执行dockerbuild-t'mydjango'。这里我的项目目录是mydjango第一次打包编译的时候,时间可能会稍微长一点,耐心等待一会儿即可。如果中途遇到网络错误导致的失败,重复执行打包命令即可。这时运行命令:dockerimages可以看到编译好的镜像大约1g:liuyue@DESKTOP-NVU6CCVMINGW32~$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmydjangolatestc3ffb74ae26324hoursago1.04GB然后启动镜像服务:dockerrun-it--rm-p5000:8000mydjango这里我们使用端口映射技术将宿主机的5000端口映射到容器中的8000端口,访问Django服务,http://containerip:5000backend是大功告成,接下来就轮到我们在前端服务vue.js了,首先打开vue项目的打包配置文件config/index.js:build:{//index.html的模板index:path.resolve(__dirname,'../dist/index.html'),//路径assetsRoot:路径。resolve(__dirname,'../dist'),assetsSubDirectory:'static',assetsPublicPath:'./',/***源地图*/productionSourceMap:true,//https://webpack.js.org/configuration/devtool/#productiondevtool:'#source-map',//默认关闭Gzip,因为许多流行的静态主机如//Surge或Netlify已经为您压缩了所有静态资产。//在设置为`true`之前,确保://npminstall--save-devcompression-webpack-pluginproductionGzip:false,productionGzipExtensions:['js','css'],//运行构建命令//构建完成后查看包分析器报告的额外参数://`npmrunbuild--report`//设置为`true`或`false`以始终打开或关闭它bundleAnalyzerReport:process.env.npm_config_report}}将打包目录改成相对路径,注意路由配置。如果已经改成了history模式,记得改回hash:exportdefaultnewRouter({routes:routes,//mode:'history'/*hash*/})准备工作完成后,写一个Dockerfile在vue项目的根目录中:FROMnode:lts-alpine#安装用于提供静态内容的简单http服务器RUNnpminstall-ghttp-server#将“app”文件夹设为当前工作目录WORKDIR/app#copyboth'package.json'和'package-lock.json'(如果可用)COPYpackage*.json./#installprojectdependenciesRUNnpminstall#将项目文件和文件夹复制到当前工作目录(即“app”文件夹)COPY..#为生产环境构建应用程序RUNnpmrunbuildEXPOSE8080CMD["http-server","dist"]这里我们选择较小的alpine镜像然后进入项目根目录,执行打包命令:dockerbuild-tmyvue。我这里的前端目录是myvueliuyue@DESKTOP-NVU6CCVMINGW32~/www/myvue(master)$dockerbuild-tmyvue。SendingbuildcontexttoDockerdaemon202.1MBStep1/9:FROMnode:lts-alpinelts-alpine:Pullingfromlibrary/nodecbdbe7a5bc2a:Pullcomplete4c504479294d:Pullcomplete1e557b93d557:Pullcomplete227291017118:PullcompleteDigest:sha256:5a940b79d5655cc688cfb319bd4d0f18565bc732ae19fab6106daaa72aeb7a63Removing中间容器5317abe3649b--->2ddb8a0e3225成功构建2ddb8a0e3225成功标记myvue:latest安全警告:您正在针对非WindowsDocker主机从Windows构建Docker映像。添加到构建上下文Imitsion中的所有文件和目录都将具有-rwxr,建议仔细检查和重置敏感文件和目录的权限。系统会根据脚本自动安装依赖,第一次安装需要一段时间。打包完成后,执行:dockerimages可以看到前端镜像的大小变小了一点:liuyue@DESKTOP-NVU6CCVMINGW32~$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmyvuelatest917d1c69f10f23hoursago539MBRun前端服务:dockerrun-it--rm-p8081:8080myvue也使用了端口映射,这次宿主机使用的是8081,当然如果需要可以根据自己的喜好修改。访问Vue.js服务,http://containerip:8081至此,我们已经通过Docker容器技术分别部署了前后端服务。过程并不复杂,但意义却是一个里程碑。Portable这两个镜像左边是Django,右边是Vue.js。如果哪天我们需要横向扩展,几分钟就可以在新服务器上“打卡”,灵活方便。最后附上项目文档给大家鼓励一下:https://gitee.com/QiHanXiBei/...https://gitee.com/QiHanXiBei/myvue原文转载自“刘越的技术博客”https:///v3u。cn/a_id_179
