Pas 1: creeu una aplicació senzilla
Pas 2: creeu contenidors Docker
Pas 3: configureu Nginx
Pas 4: implementeu l'aplicació
Quan executeu una aplicació web, normalment voleu treure el màxim profit dels vostres recursos sense haver de convertir el vostre programari per utilitzar multiprocés o bucles d'esdeveniments complexos. Docker, però, ofereix una manera senzilla d'equilibrar la càrrega interna de la vostra aplicació per treure el màxim profit dels recursos del servidor. Aquest article us mostrarà com utilitzar Nginx per equilibrar la càrrega de la vostra aplicació web mitjançant Docker a CentOS.
Pas 1: creeu una aplicació senzilla
Farem servir òxid per crear aquesta senzilla aplicació. Suposant que teniu instal·lat òxid, executeu cargo new webapp –bin
. En cas d'èxit, veureu un directori anomenat webapp
. Dins de webapp
, veureu un fitxer anomenat Cargo.toml
. Afegiu-hi les línies següents:
[dependencies.iron]
version = "*"
A continuació, dins del src/main.rs
fitxer, elimineu-ho tot i ompliu-lo amb el següent:
extern crate iron;
use iron::prelude::*;
use iron::status;
fn main() {
Iron::new(|_: &mut Request| {
Ok(Response::with((status::Ok, "Hello Vultr :)")))
}).http("0.0.0.0:3000").unwrap();
}
Nota: no canvieu la IP dins de l'aplicació. Això està configurat perquè Docker pugui escoltar la vostra aplicació.
Un cop hàgiu acabat, compileu l'aplicació executant cargo build –release
. Depenent del vostre servidor, pot trigar uns quants minuts. Si no hi ha errors, proveu l'aplicació seguint aquests passos:
- Corre
target/release/webapp
.
- Navegueu fins
http://0.0.0.0:3000/
al vostre navegador. Substituïu 0.0.0.0
-la per l'adreça IP del vostre servidor.
Si tot va funcionar correctament, veureu "Hola Vultr :)" a la pàgina.
Pas 2: creeu contenidors Docker
Creeu un Dockerfile
i empleneu-lo amb el següent:
FROM centos:latest
MAINTAINER User <user@localhost>
RUN yum update -y
COPY ./webapp/target/release/webapp /opt/
EXPOSE 3000
WORKDIR /opt
CMD ./webapp
Desa el fitxer. A continuació, creeu un fitxer anomenat deploy.sh
i ompliu-lo amb el següent:
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
Quan executeu aquest script, crearà la imatge i desplegarà el contenidor en funció de la quantitat que hàgiu establert (el valor per defecte és 5). Si el contenidor existeix, el matarà i l'eliminarà del registre abans que es torni a desplegar.
Ara, creeu un fitxer de configuració Nginx i ompliu-lo amb el següent:
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;
}
}
Substituïu 0.0.0.0
-la per l'adreça IP del vostre servidor.
Reinicieu Nginx fent systemctl restart nginx
. Resoleu els errors i, a continuació, aneu al pas següent.
Pas 4: implementeu l'aplicació
Desplegueu l'aplicació executant bash ./deploy.sh
.
Podeu comprovar l'estat de la vostra aplicació amb docker ps
- hi haurà 5 imatges creades que comencen per webapp
. Ara, navegueu fins http://0.0.0.0:3000/
al vostre navegador, tornareu a veure el missatge "Hola, Vultr :)".
Aleshores, quina diferència fa això, exactament?
Si executeu una prova de referència amb la configuració de l'equilibrador de càrrega, notareu que s'estan utilitzant més recursos del vostre servidor, que és el que voldríeu, sobretot si la vostra aplicació està construïda en idiomes com Node on normalment seria d'un sol fil. Si mai necessiteu actualitzar la vostra aplicació, podeu fer-ho i tornar deploy.sh
a executar per reconstruir la imatge i desplegar els vostres contenidors.