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.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를 시켜주고 기존에 떠있던 컨테이너는 멈춘다