|
tips: 背景Flask自帶的服務(wù)啟動,非常方便在開發(fā)環(huán)境中調(diào)試使用,但是用于生產(chǎn)環(huán)境卻不是好的選擇。 一般生產(chǎn)環(huán)境中部署Flask都是基于WGSI容器。 生產(chǎn)環(huán)境可以用python的虛擬環(huán)境來部署Flask,但是部署方式比較麻煩,且不易移植。
GunicornGunicorn "綠色獨(dú)角獸"是一個(gè)Python WSGI UNIX的HTTP服務(wù)器。這是一個(gè)預(yù)先叉工人模式,從Ruby的獨(dú)角獸(Unicorn )項(xiàng)目移植。Gunicorn服務(wù)器大致與各種Web框架兼容,只需非常簡單的執(zhí)行,輕量級的資源消耗,以及相當(dāng)迅速。Gunicorn直接用命令啟動,不需要編寫配置文件,相對uWSGI要容易很多。官網(wǎng) DockerDocker 是一個(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服務(wù)器(ubuntu)中新建文件夾 sudo mkdir /projects/FlaskTest。 進(jìn)入文件夾 cd /projects/FlaskTest。 新建文件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,)
新建文件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.WORKDIRWORKDIR指令可以來指定工作目錄(或者稱為當(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)建并啟動容器控制臺執(zhí)行命令sudo docker run -d -p 8000:80 flask-test:latest 控制臺執(zhí)行sudo curl http://127.0.0.1:8000 返回hello world 控制臺執(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
說明 -d后臺守護(hù)模式
-p指定容器與宿主機(jī)端口映射
六、更優(yōu)雅的啟動容器,使用docker-compose編寫docker-compose.yaml文件 version: "2"
services:
flask_test:
image: flask-test:latest
build: .
container_name: flask_test
restart: always
ports:
- "8000:80"
控制臺執(zhí)行命令docker-compose up -d啟動容器 控制臺執(zhí)行命令sudo docker ps驗(yàn)證容器flask_test是否啟動 說明 version:docker-compose的版本 services:需要管理的服務(wù) flask_test:FlaskApp服務(wù)名稱 image:FlaskApp服務(wù)鏡像來源 build:如果鏡像不存在,當(dāng)前位置構(gòu)建鏡像。存在則跳過 container_name:啟動的容器名稱 restart:容器啟動屬性, always一直重啟 ports:容器與宿主機(jī)的端口映射
Nginx配置安裝好nginx之后,執(zhí)行命令cd /etc/nginx/conf.d 進(jìn)入到conf.d目錄 新建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;
}
}
重啟nginx執(zhí)行命令 sudo service nginx reload 外網(wǎng)訪問配置好的url即可,例如:http://www.
總結(jié)
|