搭建 Docker + Flask 后端
使用 Docker + Flask + Gunicorn + Gevent + nginx 来搭建纯 API 后端
目标
使用 Docker 编排管理服务, 使用 Shell 脚本一键化部署流程
第一步
创建目录/文件, 结构如下:
site
|– flask
    |– Dockerfile
    |– server
        |– config
            |– gunicorn.conf.py
        |– app.py
        |– requirements.txt
|– nginx
    |– default.conf
|– docker-compose.yml
|– deploy.sh
第二步
flask/Dockerfile
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | FROM python:3.7
 COPY ./server /workspace
 WORKDIR /workspace
 
 RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip \
 && pip --no-cache-dir install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
 
 EXPOSE 5000
 
 CMD ["gunicorn", "app:app", "-c", "./config/gunicorn.conf.py"]
 
 | 
flask/server/requirements.txt
| 12
 3
 
 | Flask==1.0.2gunicorn==19.9.0
 gevent==1.4.0
 
 | 
flask/server/app.py
| 12
 3
 4
 5
 6
 
 | from flask import Flaskapp = Flask(__name__)
 
 @app.route('/')
 def hello_world():
 return 'Hello, World!'
 
 | 
flask/server/config/gunicorn.conf.py
| 12
 3
 4
 
 | workers = 5worker_class = "gevent"
 bind = "0.0.0.0:5000"
 loglevel = 'debug'
 
 | 
nginx/default.conf
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | server {listen 80;
 server_name api.site.com;
 listen [::]:80;
 server_tokens off;
 client_max_body_size 15M;
 
 access_log  /var/log/nginx/nginx.api.access.log;
 error_log   /var/log/nginx/nginx.api.error.log;
 
 location / {
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Host $http_host;
 proxy_set_header X-NginX-Proxy true;
 
 proxy_pass http://flask:5000;
 proxy_redirect off;
 }
 }
 
 | 
docker-compose.yml
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | version: "3"services:
 nginx:
 image: nginx:alpine
 volumes:
 - ./nginx:/etc/nginx/conf.d
 - /var/log/nginx:/var/log/nginx
 links:
 - flask
 ports:
 - 80:80
 flask:
 build:
 context: ./flask
 
 | 
deploy.sh
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | #!/bin/bash
 rm -rf 'tmp.tar'
 cd '..'
 tar cf 'tmp.tar' 'site'
 mv 'tmp.tar' 'site/tmp.tar'
 cd 'site'
 
 sftp 'root@api.norld.com' <<EOF
 cd '/root'
 put 'tmp.tar'
 exit
 EOF
 
 rm -rf 'tmp.tar'
 
 ssh 'user@api.site.com' <<EOF
 rm -rf 'site'
 tar xf 'tmp.tar'
 cd 'site'
 docker-compose down
 docker-compose up --build -d
 echo 'y' | docker image prune
 exit
 EOF
 
 | 
第三步
将部分参数替换成你需要的, 终端执行 deploy.sh, 开始访问 http://api.site.com, Hello, World!