小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Flask后端實(shí)踐 連載八 Docker+Gunicorn+Nginx部署Flask后端

 看見就非常 2020-04-29

tips:

  • 本文主要介紹如何在docker中部署Flask APP

  • 代碼倉庫

背景

  1. Flask自帶的服務(wù)啟動,非常方便在開發(fā)環(huán)境中調(diào)試使用,但是用于生產(chǎn)環(huán)境卻不是好的選擇。

  2. 一般生產(chǎn)環(huán)境中部署Flask都是基于WGSI容器。

  3. 生產(chǎn)環(huán)境可以用python的虛擬環(huán)境來部署Flask,但是部署方式比較麻煩,且不易移植。

Gunicorn

Gunicorn "綠色獨(dú)角獸"是一個(gè)Python WSGI UNIX的HTTP服務(wù)器。這是一個(gè)預(yù)先叉工人模式,從Ruby的獨(dú)角獸(Unicorn )項(xiàng)目移植。Gunicorn服務(wù)器大致與各種Web框架兼容,只需非常簡單的執(zhí)行,輕量級的資源消耗,以及相當(dāng)迅速。Gunicorn直接用命令啟動,不需要編寫配置文件,相對uWSGI要容易很多。官網(wǎng)

Docker

Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及應(yīng)用運(yùn)行的上下文環(huán)境到一個(gè)可移植的鏡像中,然后發(fā)布到任何支持Docker的系統(tǒng)上運(yùn)行。 通過容器技術(shù),在幾乎沒有性能開銷的情況下,Docker 為應(yīng)用提供了一個(gè)隔離運(yùn)行環(huán)境。
Docker有以下幾個(gè)有點(diǎn):

  • 簡化配置

  • 代碼流水線管理

  • 提高開發(fā)效率

  • 隔離應(yīng)用

  • 快速、持續(xù)部署

Flask

一、測試Flask App

  1. 服務(wù)器(ubuntu)中新建文件夾 sudo mkdir /projects/FlaskTest。

  2. 進(jìn)入文件夾 cd /projects/FlaskTest。

  3. 新建文件app.py,寫入內(nèi)容。

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return 'hello world'
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=80,)
  4. 新建文件gun.conf

    # 并行工作進(jìn)程數(shù)
    workers = 2
    # 指定每個(gè)工作者的線程數(shù)
    threads = 4
    # 監(jiān)聽內(nèi)網(wǎng)端口80
    bind = '0.0.0.0:80'
    # 工作模式協(xié)程
    worker_class = 'gevent'
    # 設(shè)置最大并發(fā)量
    worker_connections = 2000
    # 設(shè)置進(jìn)程文件目錄
    pidfile = 'gunicorn.pid'
    # 設(shè)置訪問日志和錯(cuò)誤信息日志路徑
    accesslog = 'gunicorn_acess.log'
    errorlog  = 'gunicorn_error.log'
    # 設(shè)置日志記錄水平
    loglevel = 'info'
    # 代碼發(fā)生變化是否自動重啟
    reload=True

二、編寫Dockerfile

FlaskTest目錄中新建Dockerfile文件,寫入內(nèi)容。

FROM python:3
MAINTAINER "username<usereamil>"
ENV PIPURL "https://pypi.tuna./simple"
WORKDIR /projects

COPY app.py app.py
RUN pip --no-cache-dir install  -i ${PIPURL} --upgrade pip
RUN pip --no-cache-dir install  -i ${PIPURL} gunicorn==19.9.0
RUN pip --no-cache-dir install  -i ${PIPURL} flask==1.0.2
RUN pip --no-cache-dir install  -i ${PIPURL} gevent==1.4.0

CMD gunicorn  -c gun.conf app:app

說明

Dockerfile 文件是用于定義 Docker 鏡像生成流程的配置文件,文件內(nèi)容是一條條指令,每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建;這些指令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像,可以認(rèn)為用于快速創(chuàng)建自定義的Docker鏡像。

1.FORM

指定基礎(chǔ)鏡像(必須有的指令,并且必須是第一條指令)

2.MAINTAINER

用于提供信息的指令,用于讓作者提供本人的信息;不限制其出現(xiàn)的位置,但建議緊跟在FROM之后

格式:

MAINTAINER <name>

3.ENV

設(shè)置環(huán)境變量,可以在RUN之前使用,然后RUN命令時(shí)調(diào)用,容器啟動時(shí)這些環(huán)境變量都會被指定

格式:

ENV <key> <value>  一次定義一個(gè)變量
ENV <key>=<value> ...   一次可定義多個(gè)變量 

4.WORKDIR

WORKDIR指令可以來指定工作目錄(或者稱為當(dāng)前目錄),以后各層的當(dāng)前目錄就被改為指定的目錄,如果目錄不存在,WORKDIR會建立目錄

格式:

WORKDIR <工作目錄路徑>

5.COPY

格式:

COPY <源路徑>... <目標(biāo)路徑>
COPY ["<源路徑1>",... "<目標(biāo)路徑>"]

COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置

6.RUN

用于執(zhí)行命令行命令

格式:

RUN <命令>

7.CMD

類似于RUN指令,用于運(yùn)行程序;但二者運(yùn)行的時(shí)間點(diǎn)不同;CMD在docker run時(shí)運(yùn)行,而非docker build

三、構(gòu)建鏡像

FlaskTest目錄下執(zhí)行 sudo docker build . -t=flask-test:latest命令,該命令作用是創(chuàng)建/構(gòu)建鏡像,-t 指定名稱及版本號flask-test:latest,點(diǎn) . 構(gòu)建內(nèi)容為當(dāng)前上下文目錄。大致執(zhí)行內(nèi)容如下輸出

Sending build context to Docker daemon  4.096kB
Step 1/10 : FROM python:3
...
Step 2/10 : MAINTAINER "username<usereamil>"
...
Step 3/10 : ENV PIPURL "https://pypi.tuna./simple"
...
Step 4/10 : WORKDIR /projects
...
Step 5/10 : COPY . .
...
Step 6/10 : RUN pip --no-cache-dir install  -i ${PIPURL} --upgrade pip
...
Step 7/10 : RUN pip --no-cache-dir install  -i ${PIPURL} gunicorn==19.9.0
...
Step 8/10 : RUN pip --no-cache-dir install  -i ${PIPURL} flask==1.0.2
...
Step 9/10 : RUN pip --no-cache-dir install  -i ${PIPURL} gevent==1.4.0
...
Step 10/10 : CMD gunicorn  -c gun.conf wsgi_gunicorn:app
...
Successfully built 277d7a1a9f4e
Successfully tagged flask-test:latest

四、查看鏡像

控制臺執(zhí)行命令sudo docker images查看所有的鏡像,確認(rèn)構(gòu)建的 flask-test:latest 鏡像是否存在

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
flask-test          latest              277d7a1a9f4e        13 minutes ago      965MB
python              3                   59a8c21b72d4        2 weeks ago         929MB
...

五、創(chuàng)建并啟動容器

  1. 控制臺執(zhí)行命令sudo docker run -d -p 8000:80 flask-test:latest

  2. 控制臺執(zhí)行sudo curl http://127.0.0.1:8000 返回hello world

  3. 控制臺執(zhí)行sudo docker ps查看啟動的容器

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    47e55887d773        flask-test:latest   "/bin/sh -c 'gunicor…"   2 minutes ago       Up 2 minutes        0.0.0.0:8000->80/tcp                unruffled_zhukovsky
  4. 說明

    • -d后臺守護(hù)模式

    • -p指定容器與宿主機(jī)端口映射

六、更優(yōu)雅的啟動容器,使用docker-compose

  1. 編寫docker-compose.yaml文件

    version: "2"
    services:
        flask_test:
            image: flask-test:latest
            build: .
            container_name: flask_test
            restart: always
            ports:
                - "8000:80"
  2. 控制臺執(zhí)行命令docker-compose up -d啟動容器

  3. 控制臺執(zhí)行命令sudo docker ps驗(yàn)證容器flask_test是否啟動

  4. 說明

    • version:docker-compose的版本

    • services:需要管理的服務(wù)

    • flask_test:FlaskApp服務(wù)名稱

    • image:FlaskApp服務(wù)鏡像來源

    • build:如果鏡像不存在,當(dāng)前位置構(gòu)建鏡像。存在則跳過

    • container_name:啟動的容器名稱

    • restart:容器啟動屬性, always一直重啟

    • ports:容器與宿主機(jī)的端口映射

Nginx配置

  1. 安裝好nginx之后,執(zhí)行命令cd /etc/nginx/conf.d 進(jìn)入到conf.d目錄

  2. 新建flask_test.conf文件并填入以下內(nèi)容

    server {
        listen       80;
        server_name  www.;
    
        # api代理轉(zhuǎn)發(fā)
        location / {
            proxy_redirect  off;
            proxy_set_header    Host $host;
            proxy_set_header    X-Real-IP            $remote_addr;
            proxy_set_header    X-Forwarded-For      $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto    $scheme;
            proxy_pass http://127.0.0.1:8000;
        }
    }
  3. 重啟nginx執(zhí)行命令 sudo service nginx reload

  4. 外網(wǎng)訪問配置好的url即可,例如:http://www.

總結(jié)

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多