[ Docker ] 도커로 로드밸런싱한 서비스 배포하기
sangjun
·2022. 3. 24. 22:04
1. 로드밸런싱이란?
- 로드밸런싱이란 클라이언트가 많아졌을 때를 대비해 하나의 대표 서버를 두고, 대표 서버 뒤에서는 각자의 역할만을 하는 서버를 여러대 두는 것입니다.
- 아래의 gif를 보시면 한번에 이해될 것 입니다.(gif설명이 너무 좋아서 가져왔습니다)
- 즉, 하나의 서버만을 이용하면 과부하가 걸려 요청을 받을 수 없게 되거나 서비스가 느려집니다. 이를 방지하기 위해 로드밸런서가 요청을 분담하거나 구별해 일을 나누어 처리하는 것입니다.
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을 요청해도 다른 컨테이너들이 처리해주는 것을 알 수가 있습니다.
참고자료
'프로그래밍' 카테고리의 다른 글
[ 시스템 프로그래밍 ] fork()와 execve()의 차이를 알아보자 (0) | 2022.04.14 |
---|---|
[ AWS ] 도커를 이용해 AWS에서 배포하기 (0) | 2022.01.21 |
[ Network ] PC에서 모바일 패킷 캡쳐 방법 (0) | 2022.01.06 |
[Network] STUN이란 (0) | 2021.07.08 |
[Network] NAT란 (0) | 2021.07.08 |