参考文章(非常感谢大佬记录的文章):https://blog.csdn.net/u013282737/article/details/85233408
实验环境:vmware 中的 centos 7.2
软件版本:Docker Engine 18.09.5 和 python 3.6
序:介绍python项目包背景
运行的时候直接在pycharm终端里面执行manage.py即可
插曲:
这里领导在给我包的时候,环境所需插件并没有一起打包给我,为了保守起见,我先用windows 7 安装了pycharm (后安装)和python解释器 3.6版本(先安装)装上试下效果,pycharm里面终端显示没有该命令,但是cmd窗口里面却有,这个跟我先安装了pycharm有关系,后来两个都卸载,先装了解释器,再装pycharm解决该问题。
python此命令需要设置环境变量,可参考该链接===》https://jingyan.baidu.com/article/b2c186c811d1a5c46ef6ff89.html
初次安装pycharm在运行项目包的时候一定要让给你发包的人将他上面的插件一并截图发你,再逐一安装,这里需要提一嘴的是在后面执行pip命令时为防止生成的requirement.txt文件为0KB所需要执行的步骤,如图:
这里要安装项目包所需要运行的一些插件环境,不然项目包会无法正常运行
添加搜索相关插件安装
搜索点击安装即可
安装完相关插件以后,执行python命令运行中报错
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
如图所示:
网上搜索,查询资料是要修改python解释器安装路径中的两个文件,
参考文章:https://blog.csdn.net/qq_42992919/article/details/94477118
虽然此文是在ubuntu的linux版本上面,windows修改base.py和operations.py两个文件亦可行
我的安装路径是在E:\Python\Python36\Lib\site-packages\django\db\backends\mysql 下面
修改完成以后,windows端可以正常运行该项目包后,执行效果如图:
打开浏览器可以正常访问。
========================================================================
前期步骤准备完以后,开始部署项目到服务器上面,步骤如下:
docker_EF_NFCS是要打包上传到linux系统,生成Docerk镜像的文件夹(这里直接借用最开始参考文章的文件夹名,文字可以随意取,符合自己需求即可)
此文件夹下面有一个名为EF_NFCS的文件和一个Dockfile文件(无后缀名)
Dockerfile是一个文本文件,是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
Dockerfile文件内容如下:
#基于python的基础镜像
FROM python:3.6
#代码添加到code文件夹
ADD ./EF_NFCS /code
#将run.sh添加到code文件夹
ADD ./run.sh /code
#设置code文件夹是工作目录
WORKDIR /code
#安装支持
RUN pip install -r requirements.txt
**tip:**至于最后为什么不适用CMD命令,是涉及到后面的一个问题,放到文末说明
一个EF_NFCS(任意起的名字)文件夹:包含工程的代码,和运行工程所需要的环境列表
所以,EF_NFCS文件夹,有两个成员package和requirements.txt
package文件夹里面所包含的内容是python项目中整个源码所在的目录,也就是工程目录
requirements.txt 生成的方式直接在当前目录下按Shift+加鼠标右键
打开cmd命令窗口,执行
pip freeze > requirements.txt
在当前目录下会生成requirements.txt文件,如图所示:
2.1:docker_EF_NFCS文件夹,压缩成zip包,上传到Linux虚拟机系统中的某个路径下面
2.2:执行命令解压
#unzip docker_EF_NFCS.zip
2.3:进入解压后的文件夹并创建run.sh
执行命令:#cd docker_EF_NFCS && vim run.sh
脚本内容如图:
后面8080为指定端口来运行该项目,不接的话默认分配的是8000端口来运行服务
2.4:在当前目录下创建基础镜像
执行命令:docker build -t test.img ./
创建成功以后查看镜像
执行命令:#docker images
执行命令:docker run -it -p 8080:8080 --name test test.img:latest
-it:表示交互式终端的容器,非启动后立刻结束的容器
-p 8080:8080:表示将docker的8080端口,映射到Linux虚拟机的8080端口
也就是说,访问Linux虚拟机的8080端口,就是在访问docker容器的8080端口
–name test:给容器取个名字
test.img:容器是用哪个镜像启动的(一个容器,必须依赖一个镜像启动)
执行命令:docker ps -a
查看生成的容器(这里碰到一个问题,就是run后面会自动进去镜像,但是会直接进入python所运行的命令行里面,暂未找到方法解决该问题),只好先退出关闭容器再重新进去
如下图所示:
执行命令:
#docker start test 启动新创建好的容器
#docker exec -it test /bin/bash 进入容器内部,退出执行exit命令,容器依旧会在后台运行
测试运行脚本,看是否能正常运行该项目包
执行命令:bash run.sh
发现报了跟windows上面一样的错(唉,心累)
退出容器,按照之前参考的文章找在centos中安装的base.py与operation.py文件路径,刚刚前面提到的tips,原因就是会出现这种报错导致Dockfile中用CMD放命令的话无法正常执行,这是一个不可逆的过程……
再放一下参考文章:
https://blog.csdn.net/qq_42992919/article/details/94477118
https://blog.csdn.net/qq_35304570/article/details/79674449
执行命令:#find / -iname “base.py” | grep ‘/usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py’
进入里面找到base.py文件和operation.py改动相关代码即可
这里搜索应该是搜索“decode" ,我是之前已经改好了,现在整理时搜索的encode
改好以后,重启启动并进入容器,执行run.sh脚本文件
发现只能访问回环地址的8080端口,并不是最终想要达到的效果,网上搜索查询资料解决此问题
参考文章:https://blog.csdn.net/weixin_38570967/article/details/81812344
在项目包中找到settings.py文件,进入里面添加这一行命令
改动脚本,重新编写命令
这是之前已经改好的,执行命令:#python /code/package/mysite/manage.py runserver 0.0.0.0.8080
程序可以正常运行,测试用web浏览器打开看效果,这是之前搭建成功的效果图,这里整理时访问端口直接改成8080即可
部署成功后,直接按使用Ctrl + P + Q退出容器,就不会中断工程,等于退出容器后,还可访问容器的工程。
这里比较麻烦的是,需要进入容器启动后,再手动进入容器里面启动python服务,想要在启动容器时同时启动服务却不行,暂时没有找到解决的办法,也可能是跟这个项目包出现的报错有关系。后面在将该容器打包成镜像时又出现直接进入python命令行的情况,鉴于此,只能先手动部署该django框架,后续想到办法优化再对文章进行补充。
=========================================================================================================
名言:每一个不曾起舞的日子,都是对生命的辜负