文章目录
- 前情提要
- 部署项目使用到的服务
- 项目目录结构 (示例)
- 编写
- 编写 supervisor_flask.conf
- 编写 Dockerfile
- 结论
前情提要
最近需要基于 python3.7 使用 Flask 编写一套对外提供服务的 Web 服务,在部署阶段使用了 Docker 方式,这里做一个记录。
Flask是一个使用 Python 编写的轻量级 Web 应用框架
部署项目使用到的服务
python:3.7-slim:Alpine版本镜像,看重其在空间上的效率,本身Web服务不需要过多包的支持,所以选择这个镜像
supervisor:进程管理
gunicorn:Python Web Server Gateway Interface,它所在的位置是在反向代理(如 Nginx)和 Flask 之间
注:这里只单纯实现 docker 镜像生成的记录,后续通过 Nginx 反代实现对外域名访问请自行配置。
项目目录结构 (示例)
.
├── app
│ ├── api
├── conf
│ └── supervisor_flask.conf
├──
├── Dockerfile
├──
└──
编写
# 一个最小的 Flask 应用
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello, World!"
编写 supervisor_flask.conf
[supervisord]
nodaemon=true
[program:flaskweb]
command=gunicorn -w 2 -b 0.0.0.0:5000 main:app
directory=/src
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/dev/stdout
编写 Dockerfile
FROM python:3.7-slim
WORKDIR /src
COPY . /src
# 时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 替换源
RUN sed -i s///g /etc/apt/ \
&& sed -i s///g /etc/apt/ \
&& apt-get update \
&& apt-get install -y default-libmysqlclient-dev gcc \
&& apt-get clean
RUN mkdir -p ~/.pip && mkdir -p /etc/supervisor
# pip源
RUN echo "[global]" >> ~/.pip/ \
&& echo "trusted-host=" >> ~/.pip/ \
&& echo "index-url=/pypi/simple/" >> ~/.pip/
# 升级pip
RUN python -m pip install --upgrade pip
# supervisor_conf 进程管理
RUN pip install supervisor flask gunicorn
RUN /usr/local/bin/echo_supervisord_conf > /etc/supervisor/ \
&& echo "[include]">>/etc/supervisor/ \
&& echo "files = /etc/supervisor/*.conf">>/etc/supervisor/
# 拷贝项目进程文件
COPY conf/supervisor_flask.conf /etc/supervisor
RUN pip install --no-cache-dir -r
COPY . .
#EXPOSE 5001
CMD ["supervisord","-n","-c","/etc/supervisor/"]
结论
上述只是简单实现了 flask 应用的 docker部署,如果对 docker 基础操作不熟悉,可参照我的另一篇笔记 :Docker操作命令小助手
项目中 只是拉取了其他基础服务,如nginx,mysql,redis等,这里不做详细叙述。