网上大部分关于Docker部署Flask项目的教程,都没告知需要在Linux环境下部署,所以会导致整个教程看下来,在windows系统实操,都是失败的。
第一步,在自己的windows系统安装个linux虚拟机。(具体教程自行网上搜索)
第二步,在linux系统安装docker
Centos安装docker的教程:Linux CentOS安装docker
Debian安装docker的教程:Debian Docker 安装
第三步,将本地创建的flask项目上传到linux,建议先在windows环境下运行,看看跑的通不。项目创建参考:
Flask搭建登录注册项目(全网最详细教程)
我是在linux下新建了一个flask01的文件夹,再把我在windows的项目内容复制过去。项目内容有:
关于Dockerfile文件,内容如下:
# 基于的基础镜像,这里使用python,开发版本是 3.9.2 ,基础镜像也写3.9.2
FROM python:3.9.2
# /app 是要部署到服务器上的路径
WORKDIR /app
# Docker 避免每次更新代码后都重新安装依赖,先将依赖文件拷贝到项目中
COPY requirements.txt requirements.txt
# 执行指令,安装依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# COPY指令和ADD指令功能和使用方式类似。只是COPY指令不会做自动解压工作。
# 拷贝项目文件和代码
COPY . .
# 执行指令,字符串间是以空格间隔
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]
解读下Dockerfile:
FROM python:3.9.2
①第一行的版本号,是linux下python的版本号,可以通过linux命令python - version查询获取。如果找不到,那么要先安装python包,安装教程自行查找。我查到我安装的版本号是3.9.2
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]
②最后一行的第一个app,是你项目的启动文件名,因为我的启动文件是app.py,所以这里就是app,如果你是其他名字,如start.py,那么这里就应该是“start:app”。第二个app表示创建的flask对象。
gunicorn.conf.py的内容如下。注意,这里我把端口设置为80
workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:80" #设置端口80,这里注意要设置成0.0.0.0,如果设置为127.0.0.1的话就只能本地访问服务了
requirements.txt的内容如下。这个文件的意思就是你这个项目要导入的包。最开始照搬其他博主的,忘记根据自己的项目情况来,没有导入项目需要的pymysql,导致报错了。
gunicorn
gevent
flask
pymysql
我们要保证项目跑起来,要在linux下安装flask、gunicorn 、geven。安装又依靠pip,所以要先安装pip(linux安装pip的方式自行百度),再安装对应的包,我的系统安装的是pip3,所以命令如下:
pip3 install flask
pip3 install gunicorn
pip3 install gevent
3个包安装下来,gevent这个包会报错。可以参考这个教程修正:
pip install gevent 安装失败的解决办法
第四步,在linux运行下我们的启动文件,因为我安装的是python3,命令如下:
python3 app.py
终端出现这个界面,一般就是运行成功了,可以在linux的浏览器输入这个地址看看效果
第五步,通过gunicorn启动flask服务,输入命令:
gunicorn app:app -c gunicorn.conf.py
终端出现这个界面,一般就是运行成功了,可以在linux的浏览器输入这个地址看看效果
第六步,创建镜像
docker build -t 'zhuzhu' .
zhuzhu是镜像名,注意后面有个空格和.
验证下是否创建成功,用以下命令查看镜像:
docker images
第七步,启动容器运行docker镜像(80是前面gunicorn.conf.py设置的端口号)
docker run -d -p 3000:80 zhuzhu
第八步,推送到镜像仓库,如harbor
第九步,部署到服务器,如Rancher
另外,附上docker常用的命令
列出所有的容器,可查询到容器id
docker ps -a
停止运行中的容器
docker stop CONTAINER ID
删除容器
docker rm container_id
删除镜像
docker rmi image_id