Docker部署Flask+Python3.9+Pipenv+Uwsgi+Nginx
前言
本文默认读者已经初步了解 Docker
以及 Dockerfile
的基本使用以及相关知识,以 Ubuntu18+ 与Debian9+ 作为例子。
如需要本机部署可以查阅: juejin.cn/post/684490…
一、更新依赖包
sudo apt update
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
二、Python3.9环境搭建
任意目录:
cd /srv/
下载方法一:
wget https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz
下载方法二:
curl -O https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz
解压Python-3.9.4.tgz:
tar -zxvf Python-3.9.4.tgz
编译:
cd Python-3.9.4
./configure --enable-optimizations
运行make以启动构建过程(为了缩短构建时间,请根据处理器修改-j标志。 如果你不知道处理器的核心数,可以通过键入
nproc
来找到它。 我的系统有1个内核,所以我使用-j1标志。)键入:
make -j 1
安装Python二进制文件:
sudo make altinstall
检查:
python3.9 --version
创建python与python3和pip软连接
查看python3.9的路径:
which python3.9
在环境变量中添加该软连接(把which python3.9的路径写到配置中):
vim ~/.bashrc
alias python='/usr/local/bin/python3.9' alias python3='/usr/local/bin/python3.9' alias pip3='/usr/local/bin/pip3.9'复制代码
wq保存并退出
生效配置文件:
source ~/.bashrc
检查python3.9:
分别键入
python
和python3
输出的版本均为python3.9Python 3.9.4 (default, Jan 17 2022, 14:22:53) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 复制代码
检查pip3
键入
which pip3
(显示路径与/usr/local/bin/pip3.9一致)root@iZwz9hokpg2hhzpa7pr3p3Z:/srv# which pip3 /usr/local/bin/pip3复制代码
键入
pip3 -V
(显示python3.9表示正确)root@iZwz9hokpg2hhzpa7pr3p3Z:/srv# pip3 -V pip 21.3.1 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)复制代码
三、安装:Pipenv
pip3 install Pipenv
可以先使用demo进行调试后在使用git拉取的项目
创建一个demo:
cd /srv/
mkdir myproject
cd myproject
vim run.py
from flask import Flask app = Flask(__name__) @app.route("/") def helloWorld(): return "Hello World" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)复制代码
使用
Pipenv
创建一个虚拟环境pipenv install
[root@centos7_template_v20211103 myproject]# pipenv install Creating a virtualenv for this project... Pipfile: /srv/myproject/Pipfile Using /usr/bin/python3 (3.9.4) to create virtualenv... ⠧ Creating virtual environment...created virtual environment CPython3.9.4.final.0-64 in 345ms creator CPython3Posix(dest=/root/.local/share/virtualenvs/myproject-oukWrxAT, clear=False, no_vcs_ignore=False, global=False) seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv) added seed packages: pip==21.3.1, setuptools==60.2.0, wheel==0.37.1 activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator ✔ Successfully created virtual environment! Virtualenv location: /root/.local/share/virtualenvs/myproject-oukWrxAT Creating a Pipfile for this project... Pipfile.lock not found, creating... Locking [dev-packages] dependencies... Locking [packages] dependencies... Updated Pipfile.lock (16c839)! Installing dependencies from Pipfile.lock (16c839)... ???? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00 To activate this project's virtualenv, run pipenv shell. Alternatively, run a command inside the virtualenv with pipenv run.复制代码
进入虚拟环境:
pipenv shell
安装包(例如Flask):
pipenv install flask
(如果是已经有的项目直接使用:
pipenv install
安装项目中的所有包)(Pipenv不作详细介绍)
四、安装:Uwsgi
注意不需要安装在pipenv虚拟环境中,安装是为了调试启动项目,最终会在docker中安装,下面会说到
pip3 install uwsgi
五、编写:Uwsgi启动文件
cd /srv/myproject
vim myproject.ini
http
:因为后面会用到nginx代理,连接方式使用http即可home
:本机调试时候使用虚拟环境 即pipenv --venv
在docker中不需要使用,注释该行即可chdir
:/srv/myproject
wsgi-file
:启动文件daemonize
:因为docker已经是后台运行,所以uwsgi不在需要后台运行,使用会无法启动,在docker中不需要使用,注释该行即可其他配置的参数这里不作详细介绍
[uwsgi] # 连接方式 # socket = /srv/myproject/myproject.sock http = 0.0.0.0:5000 # http-socket = 0.0.0.0:5000 # 基本配置 home = /Users/yangyuexiong/.local/share/virtualenvs/xxxxxx-MNTQRX14 chdir = /srv/myproject module = run callable = app processes = 2 threads = 4 master = true buffer-size = 32768 wsgi-file = /srv/myproject/run.py chmod-socket = 660 enable-threads = true vacuum = true # 处理(超时/请求/进程结束/虚拟内存) reload-mercy = 8 harakiri = 60 limit-as = 256 max-requests = 5000 listen = 120 # 日志 # daemonize = /srv/myproject/uwsgi.log # disable-logging = true log-maxsize = 50000000复制代码
本机调试uwsgi启动:
开启端口:
iptables -I INPUT -p tcp --dport 5000 -j ACCEPT
cd /srv/myproject
执行:
uwsgi --ini myproject.ini
调试完毕后
control+c
或killall -9 uwsgi
结束进程即可
六、安装:Nginx
apt-get install nginx
nginx -v
七、编写:Nginx配置
cd /etc/nginx/conf.d/
vim myproject.conf
按照以下配置删改对应参数即可,如
ip
,location
等
upstream flask_server { server 123.45.678.900:5000; # server 123.45.678.900:5001; # server 123.45.678.900:5002; # server 123.45.678.900:5003; } server { listen 80; server_name 123.45.678.900; charset utf-8; client_max_body_size 75M; # 前端页面 location / { add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; # 允许请求方法 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000; # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求 add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 200; } root /srv/dist; # 前端打包完成的文件路径 index index.html index.htm; try_files $uri $uri/ /index.html; # 官网介绍设置这条可以解决history路由的问题 expires -1; # 首页一般没有强制缓存 add_header Cache-Control no-cache; access_log /srv/logs/access.log; error_log /srv/logs/err.log; } # 后端接口 location /api { proxy_pass http://flask_server; } # 静态资源 location /static { alias /srv/dist/static; # 静态资源目录 autoindex on; # 开启静态资源列目录 autoindex_exact_size off; # on(默认)显示文件的确切大小,单位是byte;off显示文件大概大小,单位KB、MB、GB autoindex_localtime off; # off(默认)时显示的文件时间为GMT时间;on显示的文件时间为服务器时间 } }复制代码
检查配置:
nginx -t
重启:
nginx -s reload
或service nginx restart
八、安装:Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
docker -v
九、编写:Dockerfile
cd /srv/myproject
vim Dockerfile
Dockerfile
内容大致如下
FROM python:3.9.4 MAINTAINER YangYueXiong # 更新 apt RUN apt-get update RUN apt-get -y install net-tools # 更新pip RUN pip install --upgrade pip # 安装pipenv RUN pip install pipenv # 项目 WORKDIR /srv COPY . /srv/myproject # 安装项目依赖包 # --system标志,因此它会将所有软件包安装到系统 python 中,而不是安装到virtualenv. 由于docker容器不需要有virtualenvs # --deploy标志,因此如果您的版本Pipfile.lock已过期,您的构建将失败 # --ignore-pipfile,所以它不会干扰我们的设置 WORKDIR /srv/myproject RUN pipenv install --system --deploy --ignore-pipfile # 安装Uwsgi RUN apt-get install libpcre3 RUN apt-get install libpcre3-dev -y RUN pip install uwsgi --no-cache-dir # 启动 CMD uwsgi --ini myproject.ini复制代码
十、Dockerfile构建启动项目
进入目录跟目录:
cd /srv/myproject
构建:
docker build -t 'myproject' .
启动:
docker run -d -p 5000:5000 --name myproject myproject
作者:沙河顶战神
链接:https://juejin.cn/post/7054460759526342687