8080, 8081 포트를 수신하는 컨테이너 2대 띄우기

version: '3'
services:
  green:
    container_name: green
    image: jungho1209/test-test
    ports:
      - 8080:8080
    environment:
      DB_URL: ${DB_URL}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}

  blue:
    container_name: blue
    image: jungho1209/test-test
    ports:
      - 8081:8080
    environment:
      DB_URL: ${DB_URL}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}

docker-compose 파일로 블루 컨테이너와 그린 컨테이너 2대를 띄워준다


nginx 설정을 green, blue 각각 작성해준다

# nginx.green.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

    events {
        worker_connections  1024;
        }

        http {

        include       mime.types;

        server {
        
        server_name dev.kkini.site;

        location / {
		
        # GREEN - 8080 포트로 연결합니다.
        # BLUE 설정파일은 이부분의 포트만 8081로 변경해주면 됩니다.
        proxy_pass <http://127.0.0.1:8080>;
        proxy_set_header Host $host;

				}
}

블루 그린 배포를 구현해주는 쉘 스크립트를 작성한다

#!/bin/bash

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://127.0.0.1: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 rel

  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://127.0.0.1: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

블루 컨테이너가 떠있다 → 그린 컨테이너 이미지를 풀 받아서 그린 컨테이너를 띄운다

그린 컨테이너가 떠있다 → 블루 컨테이너 이미지를 풀 받아서 블루 컨테이너를 띄운다

그리고 nginx.conf로 reload를 시켜주고 기존에 떠있던 컨테이너는 멈춘다

Untitled

Untitled