Docker환경에 Nginx 로드밸런싱 구축

Hyunho·2023년 5월 21일
0

Nginx 로드밸런싱 구축

사전 준비 사항

  1. 도커 nginx container image 가져오기
    > docker pull nginx
  1. application image 준비
    • 도커에 띄울 application 이미지 생성하기 위해 dockerfile을 작성 하였습니다.
    FROM openjdk:17-alpine
    EXPOSE 8080
    ARG JAR_FILE=exam-0.0.1-SNAPSHOT.jar
    COPY ${JAR_FILE} exam.jar
    ENTRYPOINT ["java","-jar","/exam.jar"]
    • dockerfile 실행 > docker build -t api1.0 .

docker compose로 nginx와 application 실행

  1. nginx의 설정파일인 /etc/nginx/nginx.conf 수정하기

    • nginx.conf 작성 > vi nginx.conf
    user  nginx;
    worker_processes  auto;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        upstream api { # api는 arbitrary.
            server web01:8080; # docker-compose.yml에서 올라가는 컨테이너명으로 작성.
            server api01:8080;
            keepalive 1024;
        }
    
        server {
            listen 80; # nginx를 통해 외부로 노출되는 port.
    
            location / {
                proxy_pass         http://api/; # arbitrary한 upstream명
            }
        }
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        keepalive_timeout  65;
        include /etc/nginx/conf.d/*.conf;
    }
    • etc/nginx/nginx.conf 는 위치와 파일명이 정해져있는 값으로 디폴트로 파일이 주어지지만 다른 곳에 Nginx.conf를 만들어 컨테이너가 실행 될때 mount해주는 방식으로 진행 하였습니다.(마운트될 nginx.conf는 원하는 위치에 작성을 하면 됩니다. 저는 docker-compose.yml과 같은 위치에 두어 관리를 하였습니다.)
  1. docker-compose.yml 작성 후 실행하기

    • docker-compose.yml작성 > vi docker-compose.yml
    version: '3'
    services:
      nginx:
          container_name: nginx
          image: "nginx"
          ports:
           - "80:80/tcp"
          volumes:
             #docker-compose.yml과 같은 레벨에 둔 nginx.conf를 mount.
           - ./nginx.conf:/etc/nginx/nginx.conf
          networks:
           - backend
          depends_on:
           - web01
           - api02
      api01:
          container_name: web01
          image: "api1.0"
          ports:
           - "8080:8080"
          networks:
          - backend
      api02:
          container_name: api01
          image: "api0.1"
          ports:
           - "8081:8080"
          networks:
          - backend
    
    networks: # 가장 기본적인 bridge 네트워크
      backend:
        driver: bridge
    • > docker-compose up

동작 확인

마치며

반땅이라는 사이드 프로젝트를 진행하면서 EC2에 docker 환경으로 한 개의 서버만 운영하는 상태였는데 로드밸런싱과 무중단 배포를 위해 nginx를 적용하는 것을 정리하였습니다. 지금은 기본적인 동작만을 위한 설장만 되어있지만 기타 설정들이 더 많이 있는데 이것은 추후 학습을 통해 이어가도록 하겠습니다.

profile
hyunho

0개의 댓글