这课讲gunicorn配合gevent运行 和docker-compose编排gevent
为python提供了比较完善的协程支持docker-compose
编排 我们后面可能有很多容器来做这个服务器,但是如果全部使用docker run命令来执行的话就太tm麻烦了,就可以使用这个来同一管理所有容器
- 安装方法
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
- 试验一下
docker-compose --version
- compose配置文件的编写
请参考
https://docs.docker.com/compose/compose-file/
docker-compose本身是需要读取当前目录下或者你指定目录下的配置文件,如果有别的需求,参考上面的链接,自行查看。它默认的配置文件名称叫docker-compose.yml
,有关.yml
文件的书写自己百度,下文直接上内容。
- 创建一个空文件夹,叫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
来配合的,networks
和services
是同级的标签,在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来构建镜像。
- 进入flaskrun文件夹。
- 创建install-gevent文件夹,并进入。
- 创建一个文件
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
- 然后改一下我们的
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
- 重新生成容器。
docker-compose up -d
之后正常运行,去浏览器里面试验。
ps:这里我试了几次都不行,好像是缺包,如果实在不行,先就不用协程了。
配置nginx+gunicorn+flask负载均衡(单机简单模式)--区别于集群
https://hub.docker.com/_/nginx/
docker pull nginx:1.14-alpine
- 利用前面两节课的知识点,创建两个一模一样的网站
- 创建一个配置文件
- 映射到容器的/etc/nginx/nginx.conf
- 设置负载均衡配置
- 启动容器,这个容器要纳入到docker-compose
- 本地创建一个index2.py的文件
from flask import Flask
myapp = Flask(__name__)
@myapp.route("/")
def hello():
return "index2"
- 修改
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
- 删除上节课的容器
- 重新启动
docker-compose up -d
- docker ps
这个时候能看到两个容器。 - 配置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
- 启动
docker-compose up -d
- 接下来直接在你的浏览器里面访问
虚拟机ip----不用加端口 默认80
可以看到一次刷新值就不一样一次。这时候同一个网址,访问到你两个不同的网址,负载均衡生效。但是这里是没有配置权重的。
upstream myflask {
server 容器IP:5000 weight=3;
server 容器IP:5000 weight=1;
}
代表4个请求中,其中3个会给第一个。 这个只是代表一种权重,不是绝对的哈。这里就不试验了,自己去试一下吧。
ps: 可以搞 但是没必要
- 开始加域名。vi到nginx.conf,修改
server_name xiong.com
- 重启 在 flaskrun目录下
docker-compose restart nginx
- 修改windows的hosts文件
在windows文件下进入到
C:\Windows\System32\drivers\etc
点击文件
按钮,进入到菜单页面,点击Windows PowerShell ,在点击以管理员身份打开,输入以下命令行
notepad hosts
并回车
我们成功地打开了hosts,然后就可以编辑了,可以粘贴,复制等操作