flask后台部署套路(六)

这课讲gunicorn配合gevent运行 和docker-compose编排
gevent为python提供了比较完善的协程支持
docker-compose编排 我们后面可能有很多容器来做这个服务器,但是如果全部使用docker run命令来执行的话就太tm麻烦了,就可以使用这个来同一管理所有容器

  1. 安装方法
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

别相信任何写好的安装指令,最好养成看官方文档的习惯

https://docs.docker.com/compose/install/#install-compose

在这个网址下选中linux,里面有官方文档解释的安装指令,注意如果安装timeout了,下方有办法。
如果出现

Failed connect to github-production-release-asset-2e65be.s3.amazonaws.com:443; Connection refused

是因为(github-production-release-asset-2e65be.s3.amazonaws.com)需要下载的访问被国内屏蔽了,可以使用香港的服务器
在hosts文件中,加入

219.76.4.4 github-cloud.s3.amazonaws.com

使用pip来安装

yum -y install epel-release
yum -y install python-pip
yum install python-devel
pip install docker-compose -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

以上两种办法我都试过了,第一种就算下载成功也不知道是因为啥运行不了,第二种,因为python的版本混乱,短时间弄这个比较麻烦,采用直接在下载网络上的完整镜像,附上百度云地址

链接:https://pan.baidu.com/s/1X4IF2UGCSsrHJo99vpZBxg 
提取码:jkd3

下载之后移动到linux服务器下,一下命令按顺序执行

sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose 
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

完成上述步骤后跳过2-3步
2. 安装完成之后多docker-compose添加一个执行权限

sudo chmod +x /usr/local/bin/docker-compose
  1. 试验一下
docker-compose --version
  • compose配置文件的编写
    请参考
https://docs.docker.com/compose/compose-file/

docker-compose本身是需要读取当前目录下或者你指定目录下的配置文件,如果有别的需求,参考上面的链接,自行查看。它默认的配置文件名称叫docker-compose.yml,有关.yml文件的书写自己百度,下文直接上内容。

  1. 创建一个空文件夹,叫flaskrun,然后vi docker-compose.yml
version: '3'
services:
   flask:
      image: myflask:1.2
      ports:
           - "8082:5000"
      volumes:
           - "/root/pro/myweb:/app"
           - "/root/conf/gunicorn.conf:/gunicorn.conf"
      networks:
           - myflasknet
      command: ["-w","1","--reload","--threads","2","-c","/gunicorn.conf", "index:myapp"]
networks:
 myflasknet :
     driver: bridge
     ipam:
       config:
         - subnet: 192.158.0.0/16

注意,这个配置文件是根据

docker run --name myapp -d --rm -p 8082:5000 -v /root/pro/myweb:/app -v /root/conf/gunicorn.conf:/gunicorn.conf myflask:1.2 -w 1 --reload --threads 2 -c /gunicorn.conf index:myapp

这个容器的内容来书写的配置文件。
以上内容把配置文件和启动命令对比起来,应该只有一个networks比较不好理解,这个是和下面的networks来配合的,networksservices是同级的标签,在networks定义了一个网络名称为myflasknet,配置了一个子网,这个概念没必要太过了解,依葫芦画瓢就是了,注意这了怎么配的,后面怎么用就行。注意一下的就是上面生成的那个容器时根据下面配置的子网ip来生成的。
2. 利用docker-compose来创建容器

docker-compose up -d

运行之后,第一步会创建网络,第二步会创建容器。容器的名称这里我们配置文件里面没写,是它自动生成的,因为这里就只是随便弄一下,如果需要指定,应该是有一个叫container_name的参数,设置一下容器名称就行了。
注意这里因为是直接用的上节课的参数来创建的容器,建议把上节课容器给关闭了。避免端口冲突。
3. 这里已经启动了,直接去浏览器里面访问一下。

ps: 这个通过协程运行,我包安装了很多次都安不上,c编译器好像有点问题,暂时只做了解吧。

  • 上节课我们说到设置线程数来让参数-k的默认值变成了gthread,做到多线程的模式,其实比较流行和常用的是gevent,gunicorn是可以借助这个gevent来让网站采用协程的方式来进行访问。这个一般是需要alpine里面安装gevent这个python里面的一个包的。
python -m pip install gevent

虽然我们可以进入容器去安装,但是没啥用,因为容器时不时就被删除了,最好还是构建镜像。

  • 通过docker-compose来构建镜像。
  1. 进入flaskrun文件夹。
  2. 创建install-gevent文件夹,并进入。
  3. 创建一个文件Dockerfile这里就不做过多的比比了
FROM myflask:1.2
RUN apk add gcc musl-dev
RUN python -m pip install gevent

第二行 我们需要c编译器 gcc ,我们gevent在使用c编译的时候需要使用一些musl-dev的头文件。
4. 退出到flaskrun的路径下vi到docker-compose.yml文件
image标签上,添加

    build:
        context: ./install-gevent

注意缩进,build和image同级。
5. 创建镜像

docker-compose build flask

构建过程比较久,主要是要下载那两个包,可能中途会出错,别紧张,再来几次就好了。
6. 等弄好之后,它会覆盖原本的flaks:1.2镜像,然后这里把之前那个用docker-compose启动的项目,关闭掉

docker-compose stop
docker-compose rm
  1. 然后改一下我们的vi docker-compose.yml
version: '3'
services:
   flask:
      image: myflask:1.2
      ports:
           - "8082:5000"
      volumes:
           - "/root/pro/myweb:/app"
           - "/root/conf/gunicorn.conf:/gunicorn.conf"
      networks:
           - myflasknet
      command: ["-w","1","--reload","--k","gevent","-c","/gunicorn.conf", "index:myapp"]
networks:
 myflasknet :
     driver: bridge
     ipam:
       config:
         - subnet: 192.158.0.0/16
  1. 重新生成容器。
docker-compose up -d

之后正常运行,去浏览器里面试验。
ps:这里我试了几次都不行,好像是缺包,如果实在不行,先就不用协程了。

配置nginx+gunicorn+flask负载均衡(单机简单模式)--区别于集群

https://hub.docker.com/_/nginx/
docker pull nginx:1.14-alpine
  1. 利用前面两节课的知识点,创建两个一模一样的网站
  2. 创建一个配置文件
  3. 映射到容器的/etc/nginx/nginx.conf
  4. 设置负载均衡配置
  5. 启动容器,这个容器要纳入到docker-compose
  • 本地创建一个index2.py的文件
from flask import Flask

myapp = Flask(__name__)

@myapp.route("/")
def hello():
    return "index2"
  1. 修改docker-compose.yml
version: '3'
services:
   flask1:
      build:
        context: ./install-gevent
      image: myflask:1.2
      ports:
           - "8082:5000"
      volumes:
           - "/root/pro/myweb:/app"
           - "/root/conf/gunicorn.conf:/gunicorn.conf"
      networks:
           - myflasknet
      command: ["-w","1","--reload","--threads","2","-c","/gunicorn.conf", "index:myapp"]
   flask2:
      image: myflask:1.2
      ports:
           - "8083:5000"
      volumes:
           - "/root/pro/myweb:/app"
           - "/root/conf/gunicorn.conf:/gunicorn.conf"
      networks:
           - myflasknet
      command: ["-w","1","--reload","--threads","2","-c","/gunicorn.conf", "index2:myapp"]
networks:
 myflasknet :
     driver: bridge
     ipam:
       config:
         - subnet: 192.158.0.0/16
  1. 删除上节课的容器
  2. 重新启动
docker-compose up -d
  1. docker ps
    这个时候能看到两个容器。
  2. 配置nginx
    常见的做法是利用nginx的upstream(轮询)模块基本配置如下:
upstream myflask {
         server 容器IP:5000;
         server 容器IP:5000;
     }
  server {
    listen       80;
    server_name myflask;
    location / {
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_buffering off;
         proxy_pass http://myflask;     
    }
 }

upstream myflask代表用轮询的方式,第一次访问会均衡到第一个服务器,第二访问回去第二个服务器,还可以另外做权重的配置
实在懂也不用管,一个配置而已,不是搞运维没必要深入去研究。
6. 进入到你专门用来放配置文件的文件夹/conf然后

docker run --rm nginx:1.14-alpine cat /etc/nginx/nginx.conf | tee nginx.conf

这样会把你拉取的nginx镜像里面的配置文件直接复制出来,免得自己写。我们在这个基础上改一下就可以了。把上面的东西,复制到拉取下来的文件的http{}里面去。把最后一行那个include前面加个#号屏蔽掉。
7. 找到我们生成的两个容器的网络组

docker network ls--- 查看网络组
docker network inspect flaskrun_myflasknet

找到我们的容器ip 把它复制去替换配置文件里面的汉字容器ip
到这里就配置完成了。
8. 把我们ngnix的容器加入到docker-compose里面去,找到你的docker-compose.yml所在的文件夹。

vi docker-compose.yml
   nginx:
      image: nginx:1.14-alpine
      ports:
           - "80:80"
      volumes:
           - "/root/conf/nginx.conf:/etc/nginx/nginx.conf"
      networks:
           - myflasknet

  1. 启动
docker-compose up -d
  1. 接下来直接在你的浏览器里面访问
虚拟机ip----不用加端口 默认80

可以看到一次刷新值就不一样一次。这时候同一个网址,访问到你两个不同的网址,负载均衡生效。但是这里是没有配置权重的。

upstream myflask {
         server 容器IP:5000 weight=3;
         server 容器IP:5000 weight=1;
     }

代表4个请求中,其中3个会给第一个。 这个只是代表一种权重,不是绝对的哈。这里就不试验了,自己去试一下吧。

ps: 可以搞 但是没必要

  • 开始加域名。vi到nginx.conf,修改server_name xiong.com
  1. 重启 在 flaskrun目录下
docker-compose restart nginx
  1. 修改windows的hosts文件
    在windows文件下进入到
C:\Windows\System32\drivers\etc

点击文件按钮,进入到菜单页面,点击Windows PowerShell ,在点击以管理员身份打开,输入以下命令行

notepad hosts

并回车
我们成功地打开了hosts,然后就可以编辑了,可以粘贴,复制等操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值