보통 Nginx와 Container를 활용하는 경우 Rolling 방식보다는 Blue-Green 방식을 더 많이 사용한다.
하지만, 무중단 배포의 3가지 방식 중 Rolling 방식을 사용하여 무중단 배포를 시도하였다.
Nginx와 Container를 활용하여 Blue-Green을 하는 경우는 결국 배포를 하는 순간에 Container가 2개 띄워지는 상황이 발생하기 때문에, 필요한 컴퓨팅 파워는 결국 Rolling 방식과 같다고 생각하였고, 그렇다면 굳이 Blue-Green이 아닌, Rolling 방식이 더 나을 것이라고 생각하였다.
또한 Rolling 방식을 사용한 이유는 Rolling 방식이 추후에 A/B 테스트에 유리할 것이라고 판단하였다.
version: '3'
services:
nginx:
image: nginx:latest
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
container_name: backend-nginx
web1 :
image: username/xxx:latest
ports:
- "8080:8080"
container_name: api-server1
web2 :
image: username/xxx:latest
ports:
- "8081:8080"
container_name: api-server2
echo "nginx가 api-server1만 가리키도록 변경"
sed -i 's/server api-server2:8080/# server api-server2:8080/g' nginx/default.conf
docker exec backend-nginx nginx -s reload > /dev/null 2>&1
sleep 3
echo "api-server2을 새로운 버젼으로 배포하고, 정상적으로 돌아가는지 확인"
docker compose pull web2 -q
docker compose up --force-recreate -d web2
curl --silent --head --fail http://localhost:8081/swagger-ui/index.html >> /dev/null
while [ $? -ne 0 ];
do
sleep 1
curl --silent --head --fail http://localhost:8081/swagger-ui/index.html >> /dev/null
done
echo -e "\033[32m"api-server2 배포 성공"\033[0m"
echo "nginx가 api-server2만 가리키도록 변경"
sed -i 's/# server api-server2:8080/server api-server2:8080/g' nginx/default.conf
sed -i 's/server api-server1:8080/# server api-server1:8080/g' nginx/default.conf
docker exec backend-nginx nginx -s reload > /dev/null 2>&1
sleep 3
echo "api-server1을 새로운 버젼으로 배포하고, 정상적으로 돌아가는지 확인"
docker compose pull web1 -q
docker compose up --force-recreate -d web1
curl --silent --head --fail http://localhost:8080/swagger-ui/index.html >> /dev/null
while [ $? -ne 0 ];
do
sleep 1
curl --silent --head --fail http://localhost:8080/swagger-ui/index.html >> /dev/null
done
echo -e "\033[32m"api-server1 배포 성공"\033[0m"
echo "nginx가 모든 컨테이너를 가리키도록 변경"
sed -i 's/# server api-server1:8080/server api-server1:8080/g' nginx/default.conf
docker exec backend-nginx nginx -s reload > /dev/null 2>&1
echo -e "\033[32m"배포 성공!"\033[0m"