[ Docker ] 도커로 로드밸런싱한 서비스 배포하기

sangjun

·

2022. 3. 24. 22:04

 

 

1. 로드밸런싱이란?

- 로드밸런싱이란 클라이언트가 많아졌을 때를 대비해 하나의 대표 서버를 두고, 대표 서버 뒤에서는 각자의 역할만을 하는 서버를 여러대 두는 것입니다.

- 아래의 gif를 보시면 한번에 이해될 것 입니다.(gif설명이 너무 좋아서 가져왔습니다)

- 즉, 하나의 서버만을 이용하면 과부하가 걸려 요청을 받을 수 없게 되거나 서비스가 느려집니다. 이를 방지하기 위해 로드밸런서가 요청을 분담하거나 구별해 일을 나누어 처리하는 것입니다.

 

https://smjeon.dev/web/sticky-session/

2. 도커를 이용한 로드밸런싱 실습

- 먼저 저는 Windows에서 로드밸런싱을 실습하기 위해 Docker Desktop과 node.js을 이용하였습니다.

- "npm init"을 하여 package.json을 생성한 뒤에 웹 페이지와 도커 컨테이너를 만들어 보겠습니다.

var express=require('express');
var app=express();



app.get('/',(req,res)=>{
    res.send("this is 1st container");
});

app.listen(3000, ()=>{
    console.log("node js is starting");
});
FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install
EXPOSE 3000
CMD ["node","index.js"]

 

docker build -t com1:com1 .


- 이런식으로 도커 컨테이너 3개를 만든 다음 nginx를 이용해 로드밸런싱을 해보겠습니다.

 

 

 

- nginx를 로드밸런서로 쓰기 위해 nginx만을 위한 도커 컨테이너를 만들었습니다.

- nginx.conf를 만들어줍니다.

- nginx.conf에 IP를 적을 때 포트포워딩을 하고 진행해주셔야 됩니다.

 127.0.0.1로 해봤는데 안되더라구요ㅠㅠ

worker_processes 4;

events { worker_connections 1024; }

http {
    upstream node-app {
        least_conn;
        server 자신의 IP:3000 weight=10 max_fails=3 fail_timeout=30s;
        server 자신의 IP:3001 weight=10 max_fails=3 fail_timeout=30s;
        server 자신의 IP:3002 weight=10 max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://node-app;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

- 만들어준 nginx.conf를 컨테이너에 적용합니다.

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
docker build -t nginx:nginx .

- 도커 이미지를 만들어준 뒤에 com1 com2 com3와 로드밸런싱을 해주는 nginx 컨테이너를 모두 실행해보겠습니다.

docker images
REPOSITORY             TAG       IMAGE ID       CREATED             SIZE
com3                   com3      f7ee90b0b6b2   7 minutes ago       915MB
com2                   com2      dfae8467450e   8 minutes ago       915MB

이렇게 나왔을 때
docker run -it -d -p 외부포트:컨테이너포트 ['이미지 ID']

ex) docker run -it -d -p 3000:3000 f7ee90b0b6b2
-> com3 컨테이너 실행하기

 

포트포워딩까지 한 뒤에 로드밸런싱까지 마치면 이렇게 같은 URL을 요청해도 다른 컨테이너들이 처리해주는 것을 알 수가 있습니다.

 

 

 

참고자료

1. https://leveloper.tistory.com/7

2. https://ebbnflow.tistory.com/206