docker-compose.yml例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3"

services:
db:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
flask_app:
image: "flask_app/flask_app:latest"
depends_on:
- db
ports:
- "5000:5000"

如果按照上面的docker-compose.yml配置文件,我们只能启动一个flask实例,无法使用docker-compose up scale=2启动多个,会提示Bind for 0.0.0.0:5000 failed: port is already allocated错误

如果将14行的配置改为- “5000”,docker-compose启动映射到主机端口又是随机的,需要执行docker-compose ps才能看到映射到主机的端口号

为了在不需要知道flask实例映射到主机的随机端口号,使用nginx作负载均衡

nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
user  nginx;

events {
worker_connections 1000;
}
http {
server {
listen 80;
location / {
proxy_pass http://flask_app:5000;
}
}
}

这里通过docker内部的dns解析服务,它将使用循环实现来根据服务名称解析DNS请求,并将其分发到Docker容器。ngxin反向代理访问flask容器内部的5000端口,就不需要知道映射到主机的随机端口了

docker-compose.yml完整例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3"

services:
db:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
flask_app:
image: "flask_app/flask_app:latest"
depends_on:
- db
expose:
- "5000"
nginx:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- flask_app
ports:
- "80:80"

这样就可以任意增加flask实例的数量了

1
docker-compose up --scale flask_app=5

压力测试

  • 启动8个flask实例压力测试
Label # 样本 平均值 最小值 最大值 标准偏差 异常 % 吞吐量 接收 KB/sec 发送 KB/sec 平均字节数
HTTP Request 12053 600 10 3940 331.77 0.83% 138.10528 267.96 102.18 1986.8
总体 12053 600 10 3940 331.77 0.83% 138.10528 267.96 102.18 1986.8
  • 启动1个flask实例
Label # 样本 平均值 最小值 最大值 标准偏差 异常 % 吞吐量 接收 KB/sec 发送 KB/sec 平均字节数
HTTP Request 9514 1041 4 18758 797.87 1.05% 83.50375 162.12 61.65 1988
总体 9514 1041 4 18758 797.87 1.05% 83.50375 162.12 61.65 1988

明显启动多个flask实例,吞吐量会跟高些