gitee地址
需要项目自行提取
docker打包flask + gunicorn 部署, 挂载日志跟暴露端口
软件架构说明
python3.7 + Flask + gunicorn
将Python的依赖包导出
pip freeze > req.txt
click==8.1.3
colorama==0.4.5
Flask==2.1.3
importlib-metadata==4.12.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.1
typing_extensions==4.3.0
Werkzeug==2.2.1
zipp==3.8.1
gevent==21.12.0
gunicorn==20.0.4
编写gunicorn文件
workers = 1
worker_class = "gevent"
bind = "0.0.0.0:5002"
# 保存的进程id
pidfile = './g.pid'
# 设置日志记录水平
loglevel = 'info'
# 设置错误信息日志路径
errorlog = './log/error.log'
# 设置访问日志路径
accesslog = './log/access.log'
编写Dockerfile
FROM python:3.7
WORKDIR /Project/demo
COPY req.txt ./
RUN pip install -r req.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
# 这句其实就是 gunicorn run:app -c gunicorn.conf.py 可以先在linux启动, 测试gunicorn是否能正常启动项目
CMD ["gunicorn", "run:app", "-c", "gunicorn.conf.py"]
# 暴露端口
EXPOSE 5000 5001 5002
执行命令(在Dockerfile目录下执行)
docker build -t ‘testflask’ .

显示
Successfully built 565e620a3eb1
Successfully tagged testflask:latest
则打包成功
这时候你可以查看docker images 里面有一个testflask镜像
docker run -v /data/docker-flask/log:/Project/demo/log -it --rm -p 5002:5002 testflask
命令说明:
-v /data/docker-flask/log:/Project/demo/log 挂载linux本机地址: 容器内地址
-it 以交互模式运行容器
-d 后台运行(需要自己加上)
-p linux端口: 容器内部端口
–rm 停止容器就删除容器(一般只在测试用, 不需要自己删除)
其他命令请查看
其他你可能使用到的命令
lsof -i:5000 # 查看端口占用
docker images # 查看所有镜像
docker ps # 查看正在运行的容器
docker ps -a # 查看所有启动过的容器(启动失败也会占用--name, 所以有时候报name save 就需要你用docker rm 容器id)
docker rm 容器id # 删除stop的容器
docker rmi 镜像id # 删除镜像
docker restart 镜像id # 重启容器
gunicorn run:app -c gunicorn.conf.py # 启动gunicorn
ps -ef|grep run.py # 查看启动的run.py的进程(grep 搜索名称)
启动gunicorn一直启动woker或者 RuntimeWarning: greenlet.greenlet size changed
愿因: gunicorn 跟gevent不兼容, 可参考上面的req.txt的版本

未上传到docker仓库