在Win10系统下利用Docker部署Gunicorn+Flask打造独立镜像

序幕

书接上回,上回说到Windows下安装docker,今天我们来讲一讲将本地项目打包到docker

什么是docker镜像

Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。

回到正题,Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

整理

  1. 首先我们先看下项目的整体结构

    docker

  2. manage.py是项目入口文件

    此项目地址:https://gitee.com/wangxs020202/flask/tree/wxs/

  3. 接下里我们使用Gunicorn+gevent来运行Flask项目

  4. 安装相应的库

    pip install gunicorn gevent --user
    
  5. 编辑项目目录下的gunicorn.conf.py

    workers = 3    # 进程数
    worker_class = "gevent"   # 异步模式
    bind = "0.0.0.0:5000"
    
  6. 由于Gunicorn并不支持Windows环境,所以只需要写好配置,不需要运行。

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

    使用

    pip freeze > requirements.txt
    

    导出pip list并生成requirements.txt文件

    alembic==1.2.1
    aliyun-python-sdk-core==2.13.15
    autobahn==20.4.3
    Automat==0.8.0
    bcrypt==3.1.7
    billiard==3.6.3.0
    celery==4.4.2
    certifi==2019.9.11
    cffi==1.12.3
    channels==2.4.0
    chardet==3.0.4
    Click==7.0
    constantly==15.1.0
    cryptography==2.8
    daphne==2.5.0
    dnspython==1.16.0
    dwebsocket==0.5.12
    eventlet==0.25.2
    Flask==1.1.1
    Flask-Cors==3.0.8
    Flask-Migrate==2.1.1
    Flask-MySQLdb==0.2.0
    Flask-Script==2.0.6
    Flask-SocketIO==4.3.0
    Flask-SQLAlchemy==2.4.1
    Flask-Uploads==0.2.1
    gevent==1.4.0
    greenlet==0.4.15
    gunicorn==20.0.4
    html5lib==1.0.1
    hyperlink==19.0.0
    idna==2.8
    importlib-metadata==1.6.0
    incremental==17.5.0
    itsdangerous==1.1.0
    jmespath==0.9.5
    jsonify==0.5
    monotonic==1.5
    mysqlclient==1.4.4
    npm==0.1.1
    numpy==1.18.1
    opencv-contrib-python==4.1.2.30
    opencv-python==4.1.2.30
    optional-django==0.1.0
    paramiko==2.7.1
    paypalrestsdk==1.13.1
    pbr==5.4.3
    pdfminer3k==1.3.4
    Pillow==6.2.1
    ply==3.11
    pyasn1==0.4.8
    pyasn1-modules==0.2.8
    pycodestyle==2.6.0
    pycparser==2.19
    pycryptodome==3.9.7
    pycryptodomex==3.9.4
    PyHamcrest==1.9.0
    PyJWT==1.7.1
    pymongo==3.10.1
    PyMySQL==0.9.3
    PyNaCl==1.3.0
    pyOpenSSL==19.1.0
    pysnowflake==0.1.3
    python-alipay-sdk==2.0.1
    python-dateutil==2.8.0
    python-docx==0.8.10
    python-editor==1.0.4
    python-engineio==3.13.0
    python-socketio==4.6.0
    qiniu==7.2.8
    redis==3.3.11
    requests==2.22.0
    selenium==3.141.0
    service-identity==18.1.0
    soupsieve==1.9.5
    SQLAlchemy==1.3.10
    sqlparse==0.3.1
    stevedore==1.31.0
    tornado==6.0.4
    Twisted==20.3.0
    txaio==20.4.1
    upyun==2.5.5
    urllib3==1.25.6
    vine==1.3.0
    virtualenv==16.7.7
    virtualenv-clone==0.5.3
    virtualenvwrapper==4.8.4
    virtualenvwrapper-win==1.2.5
    webencodings==0.5.1
    Werkzeug==0.16.0
    Whoosh==2.7.4
    yapf==0.30.0
    zipp==3.1.0
    zope.interface==4.7.1
    

    由于只需要本项目的包,大家可以酌情删除多余的包

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

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

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

    docker build -t 'flask_back' .
    

    docker

    这里一定要指定Docker的下载源,否则速度会非常缓慢,打包好的镜像文件大概有1g左右。

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

    docker images
    

    docker

    我们可以看到flask_back以及打包成功

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

    docker run -it --rm -p 5000:5000 flask_back
    
  13. 我们可以看到docker内部的端口5000映射到宿主机的5000端口上

    docker

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

    docker

  15. 接下来我们启动本地flask项目与docker内部镜像对比

    docker

  16. 对比

    • docker

      docker

    • 本地

      docker

结语

可以看到启动docker与本地项目并不会影响

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

下期利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值