현제의 현재이야기

[DevOps] nginx를 이용한 무중단 배포 본문

Infra

[DevOps] nginx를 이용한 무중단 배포

현재의 현제 2023. 5. 19. 14:29

1. 도커 컴포즈 설치

2. docker-compose 작성

  • 중요한 점은 deploy.sh와 같은 곳에 위치해야함
  • /home/ec2-user/
version: '3'

services:
  green:
    container_name: green
    image: hjdeploy/test
    ports:
      - "8080:8080"  # green은 8080 포트를 열어줍니다.
    environment:
      - DATASOURCE_URL=
      - DATASOURCE_USERNAME=
      - DATASOURCE_PASSWORD=
  blue:
    container_name: blue
    image: hjdeploy/test
    ports:
      - "8081:8080"  #blue는 8081 포트를 열어줍니다.
    environment:
      - DATASOURCE_URL=
      - DATASOURCE_USERNAME=
      - DATASOURCE_PASSWORD=
  • 몰랐던 것은 docker compose를 사용하면 기존의 sub module이 작동하지 않고, environment를 통해서 넘겨주어야 한다는 것이다.
  • 이렇게 되면 application.yml에 밑과 같은 식으로 작성해주어야 하는데, 이렇게 되면 도커 이미지 빌드할 때 test통과가 되지 않는다. 조금더 고민해보아야겠다.
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${DATASOURCE_URL}
    username: ${DATASOURCE_USERNAME}
    password: ${DATASOURCE_PASSWORD}

3. deploy.sh 작성

IS_GREEN=$(docker ps | grep green) # 현재 실행중인 App이 blue인지 확인합니다.
DEFAULT_CONF=" /etc/nginx/nginx.conf"

if [ -z $IS_GREEN  ];then # blue라면

  echo "### BLUE => GREEN ###"

  echo "1. get green image"
  docker-compose pull green # green으로 이미지를 내려받습니다.

  echo "2. green container up"
  docker-compose up -d green # green 컨테이너 실행

  while [ 1 = 1 ]; do
  echo "3. green health check..."
  sleep 3

  REQUEST=$(curl http://localhost:8080) # green으로 request
    if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
            echo "health check success"
            break ;
            fi
  done;

  echo "4. reload nginx"
  sudo cp /etc/nginx/nginx.green.conf /etc/nginx/nginx.conf
  sudo nginx -s reload

  echo "5. blue container down"
  docker-compose stop blue
else
  echo "### GREEN => BLUE ###"

  echo "1. get blue image"
  docker-compose pull blue

  echo "2. blue container up"
  docker-compose up -d blue

  while [ 1 = 1 ]; do
    echo "3. blue health check..."
    sleep 3
    REQUEST=$(curl http://localhost:8081) # blue로 request

    if [ -n "$REQUEST" ]; then # 서비스 가능하면 health check 중지
      echo "health check success"
      break ;
    fi
  done;

  echo "4. reload nginx" 
  sudo cp /etc/nginx/nginx.blue.conf /etc/nginx/nginx.conf
  sudo nginx -s reload

  echo "5. green container down"
  docker-compose stop green
fi
  • 원리는 이렇다. 전 컨테이너가 블루면 그린을 pull 받고, 헬스체크 후, nginx.green.conf를 nginx.conf로 복사한다.
  • 그리고 리로드하여 80포트로 들어가면 8080으로 들어가게 해줌. 반대도 마찬가지다.

4. nginx.blue.conf, nginx.green.conf 작성

  • 기본 nginx.conf에다가 서버주소와 포트만 작성하면 된다.
listen       80;
        server_name  3.39.192.173;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
       proxy_pass http://localhost:8081;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        }
  • 이렇게 이부분 chage! 이렇게 되면 80이 들어올 때, 8081로 매핑해준다.
  • 반대도 마찬가지이다.

5. 중요한 것들

sudo service nginx restart -> 변경사항 저장 후, 재시작 해주어야 한다.
vi, :q!, :wq 등등 많은 리눅스 명령어들,,
sudo cp nginx.conf.default /etc/nginx/nginx.conf 복사
docker-compose up -> 도커 컴포즈 있는 곳에서 모든 컨테이너를 띄운다.

 

-결과화면-

덕분에 리눅스랑도 많이 친해지고, 도커에 대해서 조금 더 알게되고, docker compose도 알게되고, nginx도 알게되고,, 삽질을 정말 많이 하였지만 값진 시간이었다.

-레퍼런스-

https://blockdmask.tistory.com/25

 

[vi 명령어] vi 명령어 정리

[리눅스나 유닉스에서 사용하는 vi 편집기 명령어 총 정리 입니다.] 1. vi 편집기 명령어 전체 구조 살펴보기 2. vi 명령어 총정리 (자주 사용하는 것은 색으로 표시)3. 제가 진짜로 사용하는 vi 알짜

blockdmask.tistory.com

https://mr-popo.tistory.com/230

 

Github Action, Nginx, Docker 무중단 배포하기(블루/그린)

어제 새벽에 kkini 프로젝트에 blue/green 방식으로 무중단 배포를 완료했습니다. Pull Request 1. 무중단 배포를 도입한 이유 이번 주 부터 kkini 프로젝트를 리팩토링해서, 빠른 시일내에 운영을 해보려

mr-popo.tistory.com

 

Comments