原文转载自「刘悦的技术博客」https://v3u.cn/a_id_164

书接上回,之前一篇:Win10环境下使用Flask配合Celery异步推送实时/定时消息(Socket.io)/2020年最新攻略,阐述了如何使用Celery异步推送Websocket消息,现在我们利用Docker将这个完整项目部署起来,为什么用Docker呢?原因很简单,这种容器技术可以将整个项目用单个容器装起来,仅仅只需要维护一个简单的配置文件就告诉电脑每次部署要把什么东西装进容器,甚至把这个过程自动化,部署流程就会变得简单、方便。

简单理解就是Docker的镜像就类似《精灵宝可梦》中小智手里的精灵球,我们的项目就类似那些宠物小精灵,当我们开发完毕就可以利用DockerFile对项目进行打包制作成镜像(小精灵被吸入精灵球),部署时就可以理解为小精灵被释放出来进行战斗(通过打包好的镜像运行容器),而Docker的仓库则提高了镜像的便捷性,可以让我们随时随地只要联网就可以使用自己的镜像(相当于小智不用随身携带精灵球,而是通过网络随时下载需要的精灵球)。

同时Docker其强大的跨平台特性,可以让我们在任何系统下部署项目,包括经常令人诟病的Windows,值得一提的是本次在Win10下部署项目的流程同样适用于Centos、Mac os、Ubuntu等系统,其兼容性可见一斑。

关于Win10如何折腾和配置Docker,请参照这篇文章:win10系统下把玩折腾DockerToolBox以及更换国内镜像源(各种神坑)

首先简单看一下项目结构:

manage.py是项目的入口文件,这里我们利用Sockert.io让Flask支持Websocket

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask import request,jsonify
from flask_cors import CORS
from flask_socketio import SocketIO,send,emit,join_room, leave_room
import urllib.parse
import user_view from celery import Celery
from datetime import timedelta pymysql.install_as_MySQLdb() app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:root@localhost:3306/md"
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True app.config['BROKER_URL'] = 'redis://localhost:6379'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379'
app.config['CELERY_ACCEPT_CONTENT'] = ['json', 'pickle']
app.config['REDIS_URL'] = 'redis://localhost:6379'
app.config['JSON_AS_ASCII'] = False CORS(app,cors_allowed_origins="*") app.register_blueprint(user_view.user) db = SQLAlchemy(app) socketio = SocketIO(app,cors_allowed_origins='*',async_mode="threading",message_queue=app.config['CELERY_RESULT_BACKEND']) celery = Celery(app.name)
celery.conf.update(app.config) celery.conf.CELERYBEAT_SCHEDULE = { "test":{
"task":"get_cron",
"schedule":timedelta(seconds=10)
} } @celery.task(name="get_cron")
def get_cron(): get_sendback.delay() @celery.task()
def get_sendback(): socketio.emit('sendback','message',broadcast=True) @app.route('/task')
def start_background_task():
get_sendback.delay()
return '开始' @app.route('/',methods=['GET','POST',"PUT","DELETE"])
def hello_world():
#res = db.session.execute("insert into user (`username`) values ('123') ") # res = db.session.execute(" select id,username from user ").fetchall() # data = request.args.get("id") # #data = request.form.get("id") # print(data) # print(res) # #return 'Hello Flask'
# return jsonify({'result': [dict(row) for row in res]}) return jsonify({'message':'你好,Docker'}) @socketio.on('join')
def on_join(data):
username = 'user1'
room = 'room1'
join_room(room)
send(username + ' has entered the room.', room=room) @socketio.on('message')
def handle_message(message):
message = urllib.parse.unquote(message)
print(message)
send(message,broadcast=True) @socketio.on('connect', namespace='/chat')
def test_connect():
emit('my response', {'data': 'Connected'}) @socketio.on('disconnect', namespace='/chat')
def test_disconnect():
print('Client disconnected') @app.route("/sendback",methods=['GET'])
def sendback(): socketio.emit('sendback','message') return 'ok' if __name__ == '__main__': socketio.run(app,debug=True,host="0.0.0.0",port=5000)

接下来使用Gunicorn+gevent来运行Flask项目,Gunicorn服务器作为wsgi app的容器,能够与各种Web框架兼容(flask,django等),得益于gevent等技术,使用Gunicorn能够在基本不改变wsgi app代码的前提下,大幅度提高wsgi app的性能。那到底怎么提升性能?说简单点,Gunicorn 默认的网络模型是 select ,当我们把worker 替换成 gevent 后,则改为 epoll 监听模型,关于select、poll、epoll请参照这篇文章:关于Tornado:真实的异步和虚假的异步,这里不再赘述。

安装相应的库

pip install gunicorn gevent --user

编辑项目目录下的gunicorn.conf.py

workers = 3    # 进程数
worker_class = "gevent" # 异步模式
bind = "0.0.0.0:5000"

由于Gunicorn并不支持Windows环境,所以只需要写好配置,不需要运行。

编辑项目目录下的requirements.txt文件,这里面都是我们项目所依赖的库

flask==1.0.2
flask-cors
flask-socketio
flask-sqlalchemy
pymysql
celery
gunicorn
gevent
redis==3.3.11

随后在项目目录下创建一个 Dockerfile 文件,这个文件可以理解为打包镜像的脚本,你需要这个镜像做什么,就把任务写到脚本中,Docker通过执行这个脚本来打包镜像

FROM python:3.6
WORKDIR /Project/myflask COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY . . ENV LANG C.UTF-8 CMD ["gunicorn", "manage:app", "-c", "./gunicorn.conf.py"]

可以看到,我们项目的镜像首先基于python3.6这个基础镜像,然后声明项目目录在/Project/myflask中,拷贝依赖表,之后安装相应的依赖,这里在安装过程中我们指定了国内的源用来提高打包速度,最后利用gunicorn运行项目,值得一提的是,ENV LANG C.UTF-8是为了声明Docker内部环境中的编码,防止中文乱码问题。

最后我们就可以愉快的打包整个项目了,在项目根目录下执行

docker build -t 'myflask' .

此时看到Docker通过读取Dockerfile文件来下载所需的基础镜像和依赖库,这里一定要指定Docker的下载源,否则速度会非常缓慢,打包好的镜像文件大概有1g左右。

下载结束之后,可以看到myflask这个镜像已经静静躺在镜像库中了,运行

docker images

命令来查看

然后我们就可以利用这个镜像来通过容器跑Flask项目了,运行命令

docker run -it --rm -p 5000:5000 myflask

这里的命令是通过端口映射把docker内部的端口5000映射到宿主机的5000端口上,后面的参数是镜像名称。我们看到,在Win10下,已经不可思议的通过Gunicorn把Flask跑起来了,这在之前没有Docker技术之前是不可想象的。

通过网址访问一下,这里注意一点,就是Windows系统下,访问Docker容器需要通过分配的ip来访问,而不是我们常用的localhost。

完全没有任何问题。

结语:到这里我们的 Docker+Flask + Gunicorn就部署完毕了,将这个镜像上传Dockerhub仓库,在任何时间、任何地点、任何系统上,只要连着网、只要我们想,就都可以在短短1分钟之内部署好我们的项目,这就是Docker技术对开发人员最好的馈赠。最后奉上项目地址:https://gitee.com/QiHanXiBei/myflask

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_164

Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像的更多相关文章

  1. Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_196 Python自动化,大概也许或者是今年最具热度的话题之一了.七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那 ...

  2. 上穷碧落下凡尘:Win10系统下基于Docker配置Elasticsearch7配合Python3进行全文检索交互

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_166 基于文档式的全文检索引擎大家都不陌生,之前一篇文章:使用Redisearch实现的全文检索功能服务,曾经使用Rediseac ...

  3. 海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_179 随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依 ...

  4. Win10系统下安装Ubuntu16.04.3教程与设置

    在Win10上刚刚装好Ubuntu16.04.3,装了不下于10次,期间出现很多问题,趁着还有记忆,写下这篇教程,里面还有Ubuntu系统的优化与Win10的一些设置. Part 1 制作Ubuntu ...

  5. Win7系统下,docker构建nginx+php7环境实践

    前面两章介绍的是Windows系统下如何安装和配置docker,主要原因在于,公司大多人数用的是Windows环境,想通过在Windows环境上,通过docker,构建一个公用的配置. 首先要说明的是 ...

  6. Win10系统下软件UI显示不完整解决方案

    在最初升级win10的时候就想到了这些问题,例如和各种软件的不兼容性.当然,事实上win10并没有想象的那么糟,作为一个windows user 来说,win10的确是很高大上的,无论是颜值或者是体验 ...

  7. 解决Win10系统下 C# DateTime 出现星期几的问题 解决ASP.NET MVC 接受Request Playload参数问题

    解决Win10系统下 C# DateTime 出现星期几的问题 昨天晚上写代码的时候偶然发现 DateTime 里出现了星期几,当时一阵凌乱,去网上百度没有详细解决办法,很多人说可以用用 ToStri ...

  8. win10系统下使用EDGE浏览器找不到Report Builder 启动图标

    Win10系统下如果要使用Report Builder,可能存在EDGE浏览器或者Chrome找不到ReportBuilder的启动图标的情况,此时,应以管理员权限运行IE浏览器,即可看到图标.

  9. Python - Win10系统下Python3.x环境配置

    Win10系统下Python3.x环境配置 https://blog.csdn.net/qq_41952474/article/details/82630551

随机推荐

  1. windows 存储和切换 ip 配置

    我的虚拟机用的是桥接模式,在公司使用时设置的是静态 ip,但网段和家里面的不一样,就导致在公司和家里,我需要频繁修改 ipv4 的配置以适应不同的网络环境 Simple-IP-Config 工具解决了 ...

  2. Fail2ban 安装Fail2ban到Ubuntu

    系统版本:Ubuntu 16.04.5 LTS 软件版本:fail2ban-0.9.3 硬件要求:无 1.安装Fail2ban root@local:~# apt-get update root@lo ...

  3. pandas:聚合统计、数据分箱、分组可视化

    1.聚合统计 1.1描述统计 #df.describe(),对数据的总体特征进行描述 df.groupby('team').describe() df.groupby('team').describe ...

  4. MTK 虚拟 sensor bring up (pick up) sensor2.0

    pick up bring up sensor2.0 1.SCP侧的配置 (1) 放置驱动pickup.c (2) 添加底层驱动文件编译开关 (3) 加入编译文件 (4) 增加数据上报方式 (5)修改 ...

  5. JavaScript中的??和?.和??=操作符

    JS中两种不常使用但挺实用的操作符:??和?. 一起来了解并学会使用它们吧: 空值合并操作符:?? 只有当操作符左侧为null或undefined时才会返回操作符右侧的值,否则返回左侧的值. eg: ...

  6. ElasticSearch6.4.2

    做一个简单的API记录 1.依赖为6.4.2  比较老的版本 2.指定ES集群,可接多个Put(); Setting setting=Setting.builder().put("clust ...

  7. 【Redis】skiplist跳跃表

    有序集合Sorted Set zadd zadd用于向集合中添加元素并且可以设置分值,比如添加三门编程语言,分值分别为1.2.3: 127.0.0.1:6379> zadd language 1 ...

  8. 聊聊C#中的composite模式

    写在前面 Composite组合模式属于设计模式中比较热门的一个,相信大家对它一定不像对访问者模式那么陌生,毕竟谁又没有遇到过树形结构呢.不过所谓温故而知新,我们还是从一个例子出发,起底一下这个模式吧 ...

  9. 关于webstorm打开HTML文件出现404错误的情况

    第一种情况是你的端口号错误.你可以到设置里面找到调试器(第四个可以展开的按钮里面),找到端口号,把端口号改成8080(默认),再勾选旁边的按钮(可以接受外部链接). 你的文件命名方式不对,最好的文件名 ...

  10. 关于Vue的几个实用知识点(持续更新中……)

    前言 排名不分先后,按自己习惯来的. 一.provide.inject 高级组件 总述: provide在父组件中定义,inject 在子孙组件中定义. provide:选项应该是一个对象或返回一个对 ...