本方案将使用Docker容器化多个后端服务实例,并通过Nginx作为反向代理实现负载均衡。这是一个简单但完整的负载均衡实现,适合开发测试环境或小型生产环境。
首先,我们需要准备多个相同的后端服务实例。这里以一个简单的Web应用为例:
app.py (示例Python Flask应用)
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f"Hello from container {os.environ.get('HOSTNAME', 'unknown')}"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Dockerfile
FROM python:3.8-slim
WORKDIR /app
COPY app.py .
RUN pip install flask
CMD ["python", "app.py"]
构建镜像:
docker build -t my-webapp .
docker run -d --name web1 -p 5001:5000 my-webapp
docker run -d --name web2 -p 5002:5000 my-webapp
docker run -d --name web3 -p 5003:5000 my-webapp
nginx.conf
http {
upstream backend {
server host.docker.internal:5001;
server host.docker.internal:5002;
server host.docker.internal:5003;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
Dockerfile.nginx
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
构建Nginx镜像:
docker build -t my-nginx -f Dockerfile.nginx .
docker run -d --name nginx-lb -p 80:80 my-nginx
访问 http://localhost
多次,你应该会看到来自不同容器的响应。
Nginx默认使用轮询(round-robin)算法,也可以配置其他算法:
upstream backend {
least_conn; # 最少连接算法
server host.docker.internal:5001;
server host.docker.internal:5002;
server host.docker.internal:5003;
}
可以为不同服务器分配不同权重:
upstream backend {
server host.docker.internal:5001 weight=3;
server host.docker.internal:5002 weight=2;
server host.docker.internal:5003 weight=1;
}
Nginx可以自动检测不健康的服务器:
upstream backend {
server host.docker.internal:5001 max_fails=3 fail_timeout=30s;
server host.docker.internal:5002 max_fails=3 fail_timeout=30s;
server host.docker.internal:5003 max_fails=3 fail_timeout=30s;
}
docker-compose.yml
version: '3'
services:
web1:
image: my-webapp
ports:
- "5001:5000"
web2:
image: my-webapp
ports:
- "5002:5000"
web3:
image: my-webapp
ports:
- "5003:5000"
nginx:
image: my-nginx
ports:
- "80:80"
depends_on:
- web1
- web2
- web3
启动所有服务:
docker-compose up -d
这个简易方案适合学习和测试目的,可以根据实际需求进行扩展和优化。