Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像

本文主要是介绍Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现在我们利用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-8CMD ["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

这篇关于Docker在手,天下我有,在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785991

相关文章

Win10安装Maven与环境变量配置过程

《Win10安装Maven与环境变量配置过程》本文介绍Maven的安装与配置方法,涵盖下载、环境变量设置、本地仓库及镜像配置,指导如何在IDEA中正确配置Maven,适用于Java及其他语言项目的构建... 目录Maven 是什么?一、下载二、安装三、配置环境四、验证测试五、配置本地仓库六、配置国内镜像地址

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

flask库中sessions.py的使用小结

《flask库中sessions.py的使用小结》在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,... 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Se

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序