一个简单的docker打包python环境到服务器上运行的例子(flask 接口):
最近项目上遇到在跳转机里面没有docker,但代码需要在里面编写测试,最后上生产又需要打包docker镜像的情况,经过一番折腾后解决了问题:本地docker打包python环境到生产上,跳转机将代码打包到生产上,然后将代码挂载到docker容器里即可。
项目最终结构:
image.pngDockerfile
dockerfile 是用于执行docker build时执行里面命令构建镜像的文本文件。
我这里的文件编写如下:
image.png
- FROM :定制镜像,一般为python版本,或系统版本等
- WORKDIR:生成的镜像容器里面的项目目录,这个参数设置后生成的容器会将项目放到该目录下。
- COPY : 复制指定目录下的文件到容器内目录下,我这里的两个点代表复制dockerfile目录层级下所有文件到容器中workdir目录下。
- RUN :在build时执行,我这里是下载所有python依赖
此外还有CMD命令,用于docker run时启动,因为我这里只是打包python环境不需要用到。
一、项目生成
requirements.txt
image.pngpython所需库列表文件,可以使用
- pip freeze > requirements.txt 生成,但这种方法如果没有指定虚拟环境,会将整个python环境中的库加载进来。
我这里使用的是 - pipreqs ./ 这个方法能只生成当前目录下的python依赖,安装直接使用pip install pipreqs
gunicorn.conf.py
Gunicorn的配置文件,Gunicorn+flask是现在常见的部署服务方式,方便且操作简单。
Gunicorn 是一个 Python 的 WSGI HTTP 服务器,够与各种wsgi web框架协作。我这里就简单的使用几个参数。
image.png
Gunicorn以及开启异步的gevent直接pip install即可安装
start.py
这里如果能拿出服务器里的requirements.txt文件其实就没必要弄这个了,如果不行的话就需要手动把项目上需要的依赖import 加载出来,然后pipreqs ./生成requirements.txt文件。
二、环境镜像打包上传
- 打包镜像
先打包为镜像,在项目根目录下执行
docker build -t zqwy:v1 .
zqwy为镜像名,v1为版本号,注意后面的'.'代表当前目录
- 镜像打包
docker save zqwy:v1 > zqwy.tar
- 上传打包镜像
直接scp或者其它方式上传到服务器上
scp zqwy.tar hostname@服务器地址: path
把另一台机器上的代码也传上来。
三、解压环境镜像以及挂载代码
- 解压镜像
docker image load <zqwy.tar
- 直接运行
进入到代码目录
docker run -rm -d --name pytest -v `pwd`:WORKDIR zqwy:v1 gunicorn start:app -c gunicorn.conf.py
- 代码上传到容器打包成镜像再运行
先挂载代码到容器里,用 -v命令
docker run -d --name pytest -v `pwd`:WORKDIR zqwy:v1 bash
再用commit命令将容器打包为镜像
docker commit -a "xy" -m "my python test" pytest zqwy:v2
然后再run
docker run -rm -d zqwy:v2 gunicorn start:app -c gunicorn.conf.py
网友评论