Docker负载平衡

・5 分钟阅读

运行web应用程序时,通常希望充分利用资源,而不必将软件转换为使用多线程或复杂的事件循环,但是,Docker为你提供了一种在内部对应用程序进行负载均衡的简单方法,以充分利用服务器资源。本文将向你展示,在CentOS上如何使用Docker对你的NginxWeb应用程序进行负载均衡。

第一步:创建一个简单的应用程序

我们会使用Rust构建这个简单的应用程序,假设已安装了Rust,请运行 cargo new webapp –bin 成功后,你会看到一个名为webapp的目录,在webapp里面,你会看到一个叫做Cargo.toml的文件,将以下行附加到它:


[dependencies.iron]
version ="*"

接下来,在src/main.rs文件内,移除所有内容并将它填充到下面的位置:


extern crate iron;

use iron::prelude::*;
use iron::status;

fn main() {
 Iron::new(|_: &mut Request| {
 Ok(Response::with((status::Ok,"Hello :)")))
 }).http("0.0.0.0:3000").unwrap();
}

注意:不要更改应用程序中的IP ,这样配置后Docker可以侦听你的应用程序。

完成后,通过执行cargo build –release编译应用程序,根据你的服务器,可能需要几分钟时间,如果没有错误,请按照以下步骤测试应用程序:

  • 运行target/release/webapp
  • 在浏览器中导航到http://0.0.0.0:3000/ ,将0.0.0.0替换为服务器的IP地址,

如果一切正常,你会在页面上看到"你好)"

步骤2创建Docker容器

创建一个Dockerfile并将它填充为:


FROM centos:latest
MAINTAINER User <user@localhost>
RUN yum update -y
COPY ./webapp/target/release/webapp /opt/
EXPOSE 3000
WORKDIR /opt
CMD ./webapp

保存文件,然后创建一个名为deploy.sh的文件,并将它填充如下:


DEFAULT_PORT=45710
APP_PORT=3000
DEPLOY=5
NAME="webapp"
docker build -t webapp:example . 

for ((i=0; i<DEPLOY; i++)); do
 docker kill $NAME$i ; docker rm $NAME$i
 docker run --name $NAME$i -p 127.0.0.1:$(((i * 1000) + DEFAULT_PORT)):$APP_PORT -d webapp:example
done

当你运行此脚本时,它会构建映像,并且根据你设置(默认值为5 )的数量部署容器,如果容器存在,它将终止并将它从注册表中删除,然后再重新部署。

第三步:配置nginx

现在,创建一个Nginx配置文件,并将它填充如下:


upstream application {
 server localhost:45710;
 server localhost:46710;
 server localhost:47710;
 server localhost:48710;
 server localhost:49710;
}

server {
 listen 0.0.0.0:80; 
 location / {
 expires 1w;
 proxy_pass http://application;
 proxy_redirect off;
 proxy_http_version 1.1;
 proxy_set_header X-Forwarded-Host $host;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Real-IP $remote_addr;
 }
}

0.0.0.0替换为服务器的IP地址。

通过执行systemctl restart nginx重新启动Nginx ,解决所有错误,然后继续下一步。

步骤4:部署应用程序

通过运行bash ./deploy.sh部署应用程序。

你可以使用docker ps检查应用程序的状态,从web app开始会创建5个图像,现在,浏览浏览器中的http://0.0.0.0:3000/,你会看到再次"Hello ,:)"消息。

那么,这究竟有什么不同呢?

如果你针对负载均衡器配置运行基准测试,你会发现你正在使用更多的服务器资源,这就是你想要的,特别是如果你的应用程序是用Node这样的语言构建的,它通常是单线程的。如果你需要升级应用程序,可以执行此操作,并重新运行deploy.sh重新生成镜像并部署容器。

Zuoxiaojuan profile image