说来惭愧,写了好几个flask django项目都是在原型阶段直接python app.py 运行的,涉及到部署用nginx和gunicorn 都是让别人帮我部署的,据说好像说很麻烦的样子,我就没自己做。

现在自己有时间了,搞了一下,发现也没什么复杂的,花半天搞定。哞哈哈哈。

心得:

1 不要怕。(要么怕满屏洋文,要么怕新知识新技术一个坑接一个坑。其实比看论文/写论文容易多了吧!)因为怕而逃避,拖延,最要不得

2 不要自己zuan3。技术问题如果路数不对,可能很吃时间,搞N天搞不定;但其实都是一层窗户纸。

不是搞科研,犯不上自己再发明一遍轮子耽误时间。其实搞研究一样要多读别人的文献,技术就更需要多读多练了。空想空谈的“空疏”,比学了一堆技能的“支离”更要不得。

1 完全不懂的技术框架,有官方文档看官方文档和demo

2几种自己不太懂的技术配合的解决方案组合问题,如“OO+XX”这种:先去github找现成的solution

3 1和2照做中,遇到具体问题,先stackoverflow,没有再google

     要善于借助外网的力量,并形成习惯。

github上有现成的demo,还是比较容易的。我fork下来,又稍微修改了几点,厚脸皮pull request了。

dockerfile 使用python官方镜像

# nginx-gunicorn-flask with python3

FROM python
LABEL author=""
LABEL purpose = '' RUN apt update
RUN apt install -y nginx supervisor
RUN pip3 install gunicorn
RUN pip3 install setuptools ENV PYTHONIOENCODING=utf-8 # Build folder
RUN mkdir -p /deploy/app
WORKDIR /deploy/app
#only copy requirements.txt. othors will be mounted by -v
COPY app/requirements.txt /deploy/app/requirements.txt
RUN pip3 install -r /deploy/app/requirements.txt # Setup nginx
RUN rm /etc/nginx/sites-enabled/default
COPY nginx_flask.conf /etc/nginx/sites-available/
RUN ln -s /etc/nginx/sites-available/nginx_flask.conf /etc/nginx/sites-enabled/nginx_flask.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf # Setup supervisord
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY gunicorn.conf /etc/supervisor/conf.d/gunicorn.conf # run sh. Start processes in docker-compose.yml
#CMD ["/usr/bin/supervisord"]
CMD ["/bin/bash"]

和原作者不同的几处修改,说明一下:

官方源现在也可以apt update 也带了pip3了,只不过setuptools还是要手动装(MD都装利索了会死啊),就没必要自己用ubuntu装python3.6了

dockerfile语法有些过时了,改成LABEL author了

把gunicorn改成了用pip3安装,而不是apt安装,否则,用supervisord运行,会报错:

gunicorn gunicorn (exit status 1; not expected)

或者

FATAL Exited too quickly (process log may have details)

原作者是在build镜像的时候把代码全都COPY进去了,我改成只copy  requirements.txt 用于安装python包就可以了。代码之类的我还是喜欢用-v挂载。

结尾,把 supervisord 改成bash。因为难免要调试一下。这样起container之后,attach进去可以手动启动flask。

把自动的supervisord 放在docker-compose.yml里,更灵活一些。

几个配置文件,其实没有太多可说的:

nginx_flask.conf

server {
listen 80; location / {
proxy_pass http://localhost:5000/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
} location ^~ /static/ {
root /deploy/app/;
}
}

照着别人的demo增加static(其实不加的话,是不是也能缓存呢?)

注意^~ 有空格 和路径写法  root /deploy/app/  不要多写static

Gunicorn.conf

[program:gunicorn]
command=gunicorn --workers= app:app -b localhost:
directory=/deploy/app

supervisord.conf

[supervisord]
nodaemon=true [program:nginx]
command=/usr/sbin/nginx

然后,用docker-compose管理容器

docker-compose.yml

version: "3.3"

services:
api:
#restart: always
stdin_open: true
tty: true
build: ./dockerfile
image: nginx-gunicorn-flask:latest
volumes:
- ./app:/deploy/app
- ./nginx_flask.conf:/etc/nginx/sites-available/nginx_flask.conf
- ./gunicorn.conf:/etc/supervisor/conf.d/gunicorn.conf
- ./supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
ports:
- "80:80"
#command: '/bin/bash'
command: '/usr/bin/supervisord'

如果是调试,不希望自动运行,就把最后一句command注释了。启动之后attach进去

4个挂载点,第1个是全部代码;后面是3个conf文件,各挂到各自该去的地方。

唯一注意的是这种挂单文件的时候,冒号前后不能加空格,否则报错。(之前实验了绝对路径,加双引号。。。以为是yml版本太低…但都不对),现在这样写最简单。

现在这样启动之后,代码在host,用IDE修改代码后,容器里躲在Nginx和gunicorn之后的flask一样自动热更新,oyeah!

用docker部署flask+gunicorn+nginx的更多相关文章

  1. 基于docker部署flask+gunicorn+nginx

    nginx安装在/etc/下,项目映射在docker中的/var/www/下 1.创建docker容器将端口映射出来,将docker外的项目映射到docker中 #docker run -it -p ...

  2. Centeos7部署Flask+Gunicorn+nginx

    一.环境安装 pip3 install flask pip3 install gunicorn pip3 install nginx 二.模块介绍 1.Flask是一个使用 Python 编写的轻量级 ...

  3. CentOS7部署Flask+Gunicorn+Nginx+Supervisor

    1. Git客户端 Win10安装git for windows 1.1 设置Git全局参数 打开Git Bash $ git config --global user.name "Alic ...

  4. 基于flask+gunicorn+nginx来部署web App

    基于flask+gunicorn&&nginx来部署web App WSGI协议 Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求.Web框架和Web服务 ...

  5. 初次部署django+gunicorn+nginx

    初次部署django+gunicorn+nginx  博客详细地址  https://www.cnblogs.com/nanrou/p/7026802.html 写在前面,这只是我所遇到的情况,如果有 ...

  6. 【新手向】阿里云上ubuntu+flask+gunicorn+nginx服务器部署(二)项目部署

    本项目实现的是类似于ins的图片分享网站.继续(一),当nginx的配置已修改好后,要在远程服务器上部署网站,只需要几个步骤: 1 前期准备 2 将运行网站的代码从github上下载过来 3 下载依赖 ...

  7. 阿里云部署 Flask + WSGI + Nginx 详解

    抵不住朋友的诱惑,今天终于入手了一台阿里云服务器,是Ubuntu 1.4 32位版本,最初考虑是用来尝尝鲜只是买了个最低配的,价格算起来与在国外买个空间的价格相当吧(可能一年才贵100多),但用起来感 ...

  8. Docker部署Django项目+Nginx+Fluend日志收集 和redis、memcached、RabbitMQ、Celery

    前言 一.docker 1.docker是什么? Docker的英文本意是“搬运工”,Docker搬运的是集装箱(Container)可以成为容器,我可以把写的Django的WEB应用以及Python ...

  9. docker 部署 flask(一)配置环境及测试

    简介: flask也是要部署的.不能老在我们的pycharm里面跑测试服务器. 各种配置linux,我看就算了吧.我们用docker部署. 也就两三行命令. 一:选择基础镜像 GitHub repo: ...

随机推荐

  1. A+B+C问题

    这是一个非常简单的题目,意在考察你编程的基础能力.千万别想难了哦.输入为一行,包括了用空格分隔的三个整数 AA.BB.CC(数据范围均在-40−40 ~ 4040 之间).输出为一行,为“A+B+CA ...

  2. codeforces 461C

    这题说的是 给了一张长方形的纸 1*n 然后可以按照不同的做法去折这个纸张 他有两种操作,操作1 给了一个pi 点 然后将左边的纸往右边折,第2种操作是给了一个L 和 R 然后计算出 L和R 之间的纸 ...

  3. 持续集成之三:Maven私服Nexus使用

    环境 Red Hat Enterprise Linux Server release 7.3 (Maipo) jdk1.7.0_80 apache-tomcat-7.0.90 mysql-5.7.23 ...

  4. Linux命令: 向文件写内容,编辑文件,保存文件,查看文件,不保存文件

    1.找到要编辑的文件 2.敲  vi t1.txt ,显示文件内容(vim命令) 3.敲 i,最下面变成INSERT 4.编辑自己想要的内容 5a.敲ESC:wq回车 5b.如果不想保存文件在时敲ES ...

  5. Applying the Kappa architecture in the telco industry

    https://www.oreilly.com/ideas/applying-the-kappa-architecture-in-the-telco-industry Kappa architectu ...

  6. hibernate的实现原理以及延迟加载

    Hibernate是怎样实现呢?主要是依据反射机制. 现在以一次数据库查询操作分析Hibernate实现原理. 假设有一个用户表(tbl_user),表中字段有id,name,sex.同时有一个实体类 ...

  7. Python安装selenium,配置火狐浏览器环境

    想用Python去编写自动化脚本进行网页访问时,遇到了一些问题, File "C:\Python34\lib\site-packages\selenium-3.0.0b2-py3.4.egg ...

  8. QAQ的LIS树 QAQ的LIS树2 题解报告

    这两道题实际上考试的时候是一道题OwO 太可怕了,忙了我三个多小时,写了整整7K 这个题两个询问关联性不强,所以分开来考虑 QAQ的LIS树 考虑如何用dp求解答案 设dp(v)表示v到根的修改后的序 ...

  9. ELK+Kafka学习笔记之FileBeat日志合并配置输出到kafka集群

    filebeat.prospectors: - type: log               #日志输出类型   enabled: true                             ...

  10. c++ sleep(windows/linux)

    c标准中包含了一个sleep用以实现当前线程暂停执行n毫秒,如下所示: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); ...