阅读 139

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:

  • 分别键入pythonpython3输出的版本均为python3.9

    Python 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+ckillall -9 uwsgi 结束进程即可

六、安装:Nginx

  • apt-get install nginx

  • nginx -v

七、编写:Nginx配置

  • cd /etc/nginx/conf.d/

  • vim myproject.conf

  • 按照以下配置删改对应参数即可,如 iplocation

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 reloadservice 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


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐