나의 배포 경험은 파일을 빌드하고 빌드된 파일을 파일질라를 이용해 직접 서버에 올리는 경험 뿐이 없었다. 인스턴스를 터미널로 접근해서 배포 환경을 직접 구성하고 스프링 부트 빌드 파일을 실행해본 기회는 거의 없었는데 커널360의 프로젝트가 막바지에 다르면서 새로운 환경에서 배포해볼 기회가 생겨 이렇게 글을 남겨 보려고 한다.
프로젝트를 빌드하고 배포하는데 왜 도커를 사용했는지 그리고 클라우드 중에서 GCP를 선택한 이유와 빌드파일을 어떻게 배포하였는지 설명한다.
도커는 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하여 개발, 배포, 운영하는 플랫폼이다. 컨테이너는 애플리케이션 코드와 모든 종속성을 포함하고 있어, 어디서든 일관되게 실행할 수 있다. 이 방식은 "한 번 개발하고 어디서나 실행"이라는 원칙을 지향하며, 개발 환경과 배포 환경의 차이를 줄여 준다.
우리의 환경과 배포환경은 너무 다르다.
인스턴스의 OS를 보면 굉장히 괴리가 있다. 사실 우리가 개발하는 환경은 대부분 윈도우 아니면 맥인데 배포환경인 클라우드는 리눅스 환경이 대부분이고 그외 제공되는 OS가 굉장히 많다. 이 괴리를 줄여주는 것이 도커이다.
이식성: 도커 컨테이너는 운영체제에 독립적이므로, 로컬에서 개발한 애플리케이션을 테스트 환경이나 프로덕션 환경으로 쉽게 이동 가능하다.
격리성: 각 컨테이너는 독립된 환경에서 실행되므로, 하나의 컨테이너에서 문제가 발생하더라도 다른 컨테이너에 영향을 미치지 않는다.
경량성: 컨테이너는 가상 머신보다 가볍고 빠르며, 리소스 사용량이 적습니다. 컨테이너는 운영체제 커널을 공유하기 때문에 빠른 시작 시간을 가지며 효율적인 리소스 활용이 가능하다.
확장성: 도커는 마이크로서비스 아키텍처를 지원하여 애플리케이션을 여러 컨테이너로 나눠서 관리할 수 있다.
일관된 개발 환경: 모든 종속성과 설정을 포함하는 컨테이너를 사용함으로써 개발, 테스트, 운영 환경 간의 차이를 제거할 수 있다.
신속한 배포: 도커 이미지를 사용하여 애플리케이션을 신속하게 배포할 수 있으며, 여러 환경에서 동일하게 작동하는지 쉽게 검증할 수 있다.
자동화된 워크플로우: CI/CD 파이프라인에서 도커를 사용하여 자동화된 테스트, 빌드, 배포가 가능하다.
우리 프로젝트에서는 여러 컨테이너는 필요없지만 워커를 생각한다면 별도의 컨테이너로 동작하는 것도 괜찮을 것 같다는 생각이 든다. 개발하고 곧바로 배포해보는 빠른 배포를 해보면서 프로덕션 환경을 볼 수 있기때문에 학습에 좋은 도구라 생각되어 도커를 사용했다.
GCP는 Google이 제공하는 클라우드 컴퓨팅 서비스 플랫폼이다. 이 플랫폼은 인프라 관리, 데이터 저장, 머신 러닝, 빅데이터 분석 등 다양한 서비스를 제공하며, Google의 글로벌 네트워크 인프라를 기반으로 한다. GCP를 통해 기업은 유연하고 확장 가능한 클라우드 환경을 구축할 수 있다.
사실 위의 특징들은 AWS도 가지고 있다. 가장 큰 이유는 3개월 동안 제공되는 40만원 상당의 바우처가 크다. 어느 클라우드 회사든 장점과 단점이 존재하지만 내가 느끼는 것은 어떤걸 사용해도 똑같다는 것이다. 다만, 경제적으로 내게 어떤 도움이 되냐의 차이인 것 같다.
클라우드 SQL 에서 가장 중요한 것은 승인된 네트워크를 작성하는 것이다.
승인된 네트워크에는 인스턴스로 생성한 IP가 들어가거나 개발 환경에서의 IP가 들어가 있어야 정상적인 접근이 가능하다.
GCP 인스턴스 접속 및 자바 설치, 도커 세팅
인스턴스에는 비어있는 백지와도 같다. 개발환경에 따라 인스턴스를 세팅하는 것이 중요하다. 기본적으로 설치되어 있는 환경도 있지만 대부분 OS만 설치된 경우이기에 각자의 개발환경에 맞게 인스턴스도 세팅한다.
우리는 자바 17버전과 도커환경으로 배포하기 때문에 JDK 17 버전 설치와 도커를 설치하였다.
인스턴스 세팅이 끝났다면 인스턴스를 통해 도커 허브에 접속한다.
도커 허브에 접속 할 수 있다면 도커 이미지를 PULL 받을 준비가 되었다는 것이다.
도커 허브에서 Pull 받기전 당연하게도 도커 허브를 세팅하고 이미지 빌드파일을 push 해주어햐 한다.
GCP 인스턴스 접속 및 자바 설치, 도커 세팅
위 블로그를 보면 된다. 인스턴스의 운영체제마다 설치 방법이 다르니 도커 공식 홈페이지를 참고하자.
도커 공식홈페이지
먼저 도커 파일을 생성하고 프로젝트에서 경로에서 도커허브 접속 및 도커 빌드를 한다. 그리고 도커 허브에 push 하면 작업은 끝이다.
아래 스크립트를 보자
# 인스턴스에 접속 후
echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
# Pull the latest Docker image
sudo docker pull ${{ secrets.DOCKERHUB_CONTAINERNAME }}/${{ secrets.DOCKERHUB_REPOSITORY }}:latest
# Stop and remove the existing container if it exists
sudo docker ps -q -f name=speech2 | xargs -r sudo docker stop
sudo docker images --filter "dangling=true" -q | xargs sudo docker rmi
sudo docker ps -a -q -f name=speech2 | xargs -r sudo docker rm
# Run the new container with environment variables
sudo docker run -d \
-p 8080:8080 \
--name speech2 \
${{ secrets.DOCKERHUB_CONTAINERNAME }}/${{ secrets.DOCKERHUB_REPOSITORY }}:latest
인스턴스에 접속해서
도커 허브에 로그인을 하고
도커 이미지를 pull 받고 실행되고 있는 도커를 종료한뒤 사용하지 않은 도커 컨테이너와 이미지 제거 후 pull 받은 도커를 실행하는 스크립트이다.
해당 코드는 깃 허브 액션에서 사용되는 코드이다.
위와 같이 도커에서 이미지를 pull 해도 되고 혹은 도커 허브를 사용하는 대신 직접 실행파일을 업로드에서 사용해도 된다.