[준비물]
server1, server2, server3, nginx
(이 글에서 server1, server2, server3 는 springboot 서버를 이용합니다.)
각자 리턴값이 1,2,3 을 뽑아주는 서버를 만들었습니다. (로드밸런싱 테스트를 한 눈에 보기 위해)
[구성]
server1
@GetMapping("/test")
public String get() {
return "1";
}
server1 의 Dockerfile
FROM amazoncorretto:17
ARG JAR_PATH=./build/libs
WORKDIR /app/backend
COPY ${JAR_PATH}/*.jar ./
ENTRYPOINT ["java","-jar","server1.jar"]
server2
@GetMapping("/test")
public String get() {
return "2";
}
server2 의 Dockerfile
FROM amazoncorretto:17
ARG JAR_PATH=./build/libs
WORKDIR /app/backend
COPY ${JAR_PATH}/*.jar ./
ENTRYPOINT ["java","-jar","server2.jar"]
server3
@GetMapping("/test")
public String get() {
return "3";
}
server3 의 Dockerfile
FROM amazoncorretto:17
ARG JAR_PATH=./build/libs
WORKDIR /app/backend
COPY ${JAR_PATH}/*.jar ./
ENTRYPOINT ["java","-jar","server3.jar"]
docker-compose.yml 설정
version: '3.8'
services:
nginx:
image: nginx
restart: always
ports:
- 80:80
volumes:
- ./custom.conf:/etc/nginx/conf.d/custom.conf
depends_on:
- server1
- server2
- server3
server1:
build:
context: ./loadbalancing
dockerfile: Dockerfile
restart: always
container_name: server1
ports:
- 8080:8080
server2:
build:
context: ./loadbalancing2
dockerfile: Dockerfile
restart: always
container_name: server2
ports:
- 8081:8080
server3:
build:
context: ./loadbalancing3
dockerfile: Dockerfile
restart: always
container_name: server3
ports:
- 8082:8080
도커 컨테이너에 마운트 할 nginx 설정파일 설정.
upstream api { # api는 arbitrary.
server server1:8080; # docker-compose.yml에서 올라가는 컨테이너명으로 >작성.
server server2:8080;
server server3:8080;
}
server {
listen 80; # nginx를 통해 외부로 노출되는 port.
server_name localhost;
location / {
proxy_pass http://api/; # arbitrary한 upstream명
}
}
보통 server1:8080 , server2:8080 server3:8080 자리에 각 서버의 아이피와 포트를 넣어야하는데
지금 테스트환경이 로컬이기때문에 또한 도커로 nginx를 설치 후 띄었기 때문에 세 서버 전부 8080으로 세팅 해줍니다.
[실행]
docker compose up --build -d
세 개의 서버(server1,server2,server3)와 nginx 설정이 잘되어있네요.
[설정 확인]
볼륨을 이용하여 ./custom.conf:/etc/nginx/conf.d/custom.conf 마운트하였습니다.
마운트가 잘 되었는 지 확인해봅시다.
(docker exec -it containerId /bin/bash 하면 실행중인 도커 컨테이너에 들어갈 수 있어요.!)
custom.conf 라는 이름으로 마운트되었습니다.
[테스트]
새로고침 할때마다 server1 -> server2 -> server3 순서대로 서버가 붙고 있습니다.
로드밸런싱 알고리즘이 몇 가지 있는데
현재 아무 설정을 하지 않았습니다.
설정을 안하게 되면 default 인 round robin이 설정되는데 round robin을 사용하고있습니다.
[이외의 로드밸런싱 알고리즘]
round robin : (기본값)요청을 순서대로 처리한다.
least_conn : (최소 연결)각 요청을 서버에 할당된 가중치를 고려해 연결 수가 가장 적은 서버로 전송
ip_hash : 요청이 클라이언트 IP주소로 해싱 > 한번 요청 받은 서버가 있을 때 해당 서버에만 요청을 분배
least_time : 연결 수가 가장 적으면서 평균 응답시간이 가장 적은 쪽을 선택해서 분배 (Nginx Plus에서만 가능)
'Docker' 카테고리의 다른 글
docker hub에 내 이미지 업로드 하기 (0) | 2023.07.13 |
---|---|
docker compose 로 springboot + react + mysql(mariadb) 3tier 컨테이너 연동 및 실행하기 (4) | 2023.07.07 |
how to solve ERROR [internal] load metadata for docker.io/libaray/~~ (0) | 2023.07.03 |
docker 컨테이너 종료안됌 (이미지삭제안됌) (0) | 2023.06.30 |
Docker 로 springboot 로 된 서버 배포해보기. (0) | 2023.06.30 |