Devops

Docker Hub Image 배포 스크립트

댕발바닥 2024. 4. 11. 22:26

 

Docker Hub에 있는 Image를 읽어 배포하는 스크립트를 만들어보았다.

 

  • 필자는 AWS EC2를 사용하고 있었으나 메모리용량, 디스크 용량에 증가에 따른 가격 상승이 굉장히 높아서 다른 Iaas로 옮기는것을 선택하게되었다.
  • Docker 허브 이미지 배포방식을 통하여 좀다 빠르게 다른 환경으로 이식할 수있어 굉장히 편리했다.

 

 

 

https://daliy-dev.tistory.com/51

 

GitHub를 이용한 CI (docker Hub)

CI란? CI는 Contious Integration으로 지속적인 통합이라 할 수 있다. 개발팀이 정기적으로 코드 변경사항을 구현하고 테스트 한 후, 공유 버전 관리 레포지토리에 병합하는 방식을 말한다. 자동화 된

daliy-dev.tistory.com

이전 포스팅에서 등록했던 Image를 네이버 클라우드 서버에 배포하는 방식으로 진행을 했다.

 

배포 스크립트

source docker_account.txt

profile=test
port=("12001" "12002")
network=$DOCKER_NETWORK
volume=$DOCKER_WAS_VOLUME
docker_id=$DOCKER_USERNAME
docker_pw=$DOCKER_PASSWORD
docker_repository=$DOCKER_REPOSITORY
image_name=$DOCKER_IMAGE_NMAE
container_name=$DOCKER_CONTAINER_NAME

echo "WAS 서버 배포를 시작합니다"

echo "도커 로그인......"
docker login -u ${docker_id} -p ${docker_pw}

echo "도커 이미지 다운중....."
docker pull ${docker_repository}

echo "도커 이미지 네이밍 변경중..."
docker tag ${docker_repository} ${image_name}

echo "0번 서버 종료중....."
docker stop ${container_name}-0

echo "테스트 도커서버 배포중...."
docker run -d --name "${container_name}-test" -p 12001:12001 --network ${network} -v ${volume}:/app/logs -e ACTIVE_PROFILE=${profile} --restart=unless-stopped ${image_name}
echo "테스트 도서버 배포완료"

read -p "테스트에 문제 없는 경우 실제 서비스 배포를 진행하시겠습니까?(Y/N) : " ans

echo "테스트 서버 제거중...."
docker stop "${container_name}-test"
docker rm "${container_name}-test"

echo "실 서버 배포 시작"
case $ans in
	Y | y)
		for ((i = 0; i < ${#port[@]}; i++)); do
			echo "${i}번째 서버 배포 , 포트 : ${port[i]} 배포중....."
			docker stop "${container_name}-${i}"
			docker rm "${container_name}-${i}"
			docker run -d --name "${container_name}-${i}" -p ${port[i]}:12001 --network ${network} -v ${volume}:/app/logs -e ACTIVE_PROFILE=${profile} --restart=unless-stopped ${image_name}
			echo "${i}번쨰 서버 배포완료"
			
			if [ $i -lt $((${#port[@]} - 1)) ]; then
				sleep 10 # 마지막 수행은 sleep 하지않음
			fi
		done
	;;
	N | n)
		echo "0번 서버 재시작중..."
	        docker start ${container_name}-0
	;;
esac
echo "실 서버 배포 완료"

echo "도커 이미지 삭제중..."
docker rmi ${docker_repository}

echo "도커 로그아웃....."
docker logout

 

만약 실서비스라면 어떤 방식의 배포 전략을 세울까 고민을 했었다.

 

위 스크립트 경우는 0번째 서버를 중지시킨후 새로운 버전의 이미지로 컨테이너를 띄워본다

 

이후에 테스트가 정상적으로 수행되었다면 스크립트를 통해 배포진행을 Y를 READ하게되면 순차적으로 롤링 배포를 진행하였다.

 

배포 전략은 이전에 포스팅했던 전략들 기준으로 만들어보았다. 물론 분명히 이 방법보다 좋은 방법이 많겠지만 공부하는 입장에서 하나씩 도전해보고있다.

 

배포 진행 이미지

테스트 도커 컨테이너를 띄우게 되고 해당 테스트를 진행한다. 만약 문제가 없으면 Y를 입력해준다. (N인 경우 중지시켰던 컨테이너를 다시 시작하고 테스트 컨테이너를 지운다)

 

자바 프로세스가 올라가는 시간을 생각해서 10초정도 간격을 주면서 컨테이너를 하나씩 띄워 두었다

 

현재 NGINX가 라운드로빈 방식으로 포트별로 로드밸런싱을 잡게 두었으며 두개의 포트만 등록된 상태로 위처럼 진행되었다.

 

다음 포스팅은 CD를 사용하는법에 대해 공부해볼예정이다.

 

https://daliy-dev.tistory.com/49

 

소프트웨어 배포 전략

배포 전략이란? 서비스를 중지하지 않고 새로운 버전을 배포하기 위해 여러 전력들이 존재한다. 과거에는 수개월 또는 수년에 한번씩 서비스를 릴리즈 하였지만, 최근에는 마이크로 서비스 아

daliy-dev.tistory.com