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

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

docker 重命名镜像的实现方法

《docker重命名镜像的实现方法》在Docker中无法直接重命名镜像,但可通过添加新标签、删除旧镜像后重新拉取/构建,或在DockerCompose中修改配置文件实现名称变更,感兴趣的可以了解一下... 目录使用标签(Tagging)删除旧的php镜像并重新拉取或构建使用docker Compose在Do

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

linux配置podman阿里云容器镜像加速器详解

《linux配置podman阿里云容器镜像加速器详解》本文指导如何配置Podman使用阿里云容器镜像加速器:登录阿里云获取专属加速地址,修改Podman配置文件并移除https://前缀,最后拉取镜像... 目录1.下载podman2.获取阿里云个人容器镜像加速器地址3.更改podman配置文件4.使用po

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践