도커 + GCP 배포 - 스프링 부트

이강민·2024년 8월 23일
0

커널360

목록 보기
32/56
post-thumbnail

배포

나의 배포 경험은 파일을 빌드하고 빌드된 파일을 파일질라를 이용해 직접 서버에 올리는 경험 뿐이 없었다. 인스턴스를 터미널로 접근해서 배포 환경을 직접 구성하고 스프링 부트 빌드 파일을 실행해본 기회는 거의 없었는데 커널360의 프로젝트가 막바지에 다르면서 새로운 환경에서 배포해볼 기회가 생겨 이렇게 글을 남겨 보려고 한다.

프로젝트를 빌드하고 배포하는데 왜 도커를 사용했는지 그리고 클라우드 중에서 GCP를 선택한 이유와 빌드파일을 어떻게 배포하였는지 설명한다.

도커

도커란?

  • 도커는 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하여 개발, 배포, 운영하는 플랫폼이다. 컨테이너는 애플리케이션 코드와 모든 종속성을 포함하고 있어, 어디서든 일관되게 실행할 수 있다. 이 방식은 "한 번 개발하고 어디서나 실행"이라는 원칙을 지향하며, 개발 환경과 배포 환경의 차이를 줄여 준다.

  • 우리의 환경과 배포환경은 너무 다르다.
    인스턴스의 OS를 보면 굉장히 괴리가 있다. 사실 우리가 개발하는 환경은 대부분 윈도우 아니면 맥인데 배포환경인 클라우드는 리눅스 환경이 대부분이고 그외 제공되는 OS가 굉장히 많다. 이 괴리를 줄여주는 것이 도커이다.

장점

  • 이식성: 도커 컨테이너는 운영체제에 독립적이므로, 로컬에서 개발한 애플리케이션을 테스트 환경이나 프로덕션 환경으로 쉽게 이동 가능하다.

  • 격리성: 각 컨테이너는 독립된 환경에서 실행되므로, 하나의 컨테이너에서 문제가 발생하더라도 다른 컨테이너에 영향을 미치지 않는다.

  • 경량성: 컨테이너는 가상 머신보다 가볍고 빠르며, 리소스 사용량이 적습니다. 컨테이너는 운영체제 커널을 공유하기 때문에 빠른 시작 시간을 가지며 효율적인 리소스 활용이 가능하다.

  • 확장성: 도커는 마이크로서비스 아키텍처를 지원하여 애플리케이션을 여러 컨테이너로 나눠서 관리할 수 있다.

단점

  • 복잡성 증가: 컨테이너를 관리하기 위한 오케스트레이션 도구(예: Kubernetes)가 필요하며, 이에 따른 학습 곡선이 존재한다.
  • 보안 문제: 컨테이너는 같은 커널을 공유하기 때문에, 격리된 환경에서도 커널 레벨의 보안 취약점이 발생할 수 있다.
  • 퍼포먼스 오버헤드: 호스트 OS와 자원을 공유하는 방식이므로, 극단적인 성능 요구사항이 있는 애플리케이션에서는 퍼포먼스 오버헤드가 있을 수 있다.

도커를 사용하는 이유

  • 일관된 개발 환경: 모든 종속성과 설정을 포함하는 컨테이너를 사용함으로써 개발, 테스트, 운영 환경 간의 차이를 제거할 수 있다.

  • 신속한 배포: 도커 이미지를 사용하여 애플리케이션을 신속하게 배포할 수 있으며, 여러 환경에서 동일하게 작동하는지 쉽게 검증할 수 있다.

  • 자동화된 워크플로우: CI/CD 파이프라인에서 도커를 사용하여 자동화된 테스트, 빌드, 배포가 가능하다.

    우리 프로젝트에서는 여러 컨테이너는 필요없지만 워커를 생각한다면 별도의 컨테이너로 동작하는 것도 괜찮을 것 같다는 생각이 든다. 개발하고 곧바로 배포해보는 빠른 배포를 해보면서 프로덕션 환경을 볼 수 있기때문에 학습에 좋은 도구라 생각되어 도커를 사용했다.

GCP(Google Cloud Platform)

GCP란?

GCP는 Google이 제공하는 클라우드 컴퓨팅 서비스 플랫폼이다. 이 플랫폼은 인프라 관리, 데이터 저장, 머신 러닝, 빅데이터 분석 등 다양한 서비스를 제공하며, Google의 글로벌 네트워크 인프라를 기반으로 한다. GCP를 통해 기업은 유연하고 확장 가능한 클라우드 환경을 구축할 수 있다.

장점

  • 글로벌 인프라: 전 세계에 분포된 데이터 센터와 네트워크를 통해 고가용성과 빠른 응답 속도를 보장한다.
  • 확장성 및 유연성: 사용자의 요구에 따라 리소스를 쉽게 확장하거나 축소할 수 있으며, 클라우드 자원을 효율적으로 관리할 수 있다.
  • 보안: Google의 보안 전문가들이 관리하는 보안 시스템을 통해 강력한 데이터 보호 기능을 제공한다.
  • 통합 서비스: 머신 러닝, 빅데이터 분석, AI, 데이터베이스, 스토리지 등 다양한 서비스가 통합되어 있어 하나의 플랫폼에서 모든 워크로드를 관리할 수 있다.

단점

  • 복잡한 요금 구조: GCP의 다양한 서비스와 복잡한 요금 체계로 인해 사용자가 비용을 정확히 예측하고 관리하는 데 어려움이 있을 수 있다.
  • 종속성: 클라우드 서비스에 대한 의존도가 높아질 경우, 벤더 락인(Vendor Lock-In) 문제가 발생할 가능성이 있다.
  • 초기 학습 곡선: GCP는 다양한 기능과 설정 옵션이 있어, 이를 이해하고 활용하기 위해 초기 학습이 필요하다.

GCP를 사용하는 이유

  • 글로벌 서비스 제공: GCP의 글로벌 네트워크 인프라를 활용하여 전 세계 사용자에게 낮은 지연 시간과 높은 가용성을 제공할 수 있다.
  • 통합된 데이터 분석: GCP는 BigQuery, Dataflow, AI Platform 등 강력한 데이터 분석 및 머신 러닝 도구를 제공하여 데이터 중심의 의사결정을 지원한다.
  • 보안 및 규정 준수: Google의 보안 프레임워크를 통해 데이터 보안을 강화하고, 다양한 규제 요구사항을 준수할 수 있다.

사실 위의 특징들은 AWS도 가지고 있다. 가장 큰 이유는 3개월 동안 제공되는 40만원 상당의 바우처가 크다. 어느 클라우드 회사든 장점과 단점이 존재하지만 내가 느끼는 것은 어떤걸 사용해도 똑같다는 것이다. 다만, 경제적으로 내게 어떤 도움이 되냐의 차이인 것 같다.

배포하기

GCP 인스턴스 생성

GCP 인스턴스 생성

  • 인스턴스는 VM으로 생성한다.
  • 다른 블로그들의 설명이 잘 되어 있어 생략
  • 인스턴스를 생성하고 SSH로 접속하는 부분을 살펴보면 된다.

google Cloud SQL 세팅

구글 SQL 생성

  • AWS RDS처럼 구글에서도 Cloud SQL을 지원한다.
  • 공식 문서 또는 다른 블로그를 보자

클라우드 SQL 에서 가장 중요한 것은 승인된 네트워크를 작성하는 것이다.
승인된 네트워크에는 인스턴스로 생성한 IP가 들어가거나 개발 환경에서의 IP가 들어가 있어야 정상적인 접근이 가능하다.

인스턴스 접속 및 세팅

GCP 인스턴스 접속 및 자바 설치, 도커 세팅
인스턴스에는 비어있는 백지와도 같다. 개발환경에 따라 인스턴스를 세팅하는 것이 중요하다. 기본적으로 설치되어 있는 환경도 있지만 대부분 OS만 설치된 경우이기에 각자의 개발환경에 맞게 인스턴스도 세팅한다.

우리는 자바 17버전과 도커환경으로 배포하기 때문에 JDK 17 버전 설치와 도커를 설치하였다.

인스턴스 세팅이 끝났다면 인스턴스를 통해 도커 허브에 접속한다.
도커 허브에 접속 할 수 있다면 도커 이미지를 PULL 받을 준비가 되었다는 것이다.

도커 허브에서 Pull 받기전 당연하게도 도커 허브를 세팅하고 이미지 빌드파일을 push 해주어햐 한다.

도커 환경구성

GCP 인스턴스 접속 및 자바 설치, 도커 세팅
위 블로그를 보면 된다. 인스턴스의 운영체제마다 설치 방법이 다르니 도커 공식 홈페이지를 참고하자.
도커 공식홈페이지

먼저 도커 파일을 생성하고 프로젝트에서 경로에서 도커허브 접속 및 도커 빌드를 한다. 그리고 도커 허브에 push 하면 작업은 끝이다.

인스턴스에서 도커 허브 접속하여 pull받기

아래 스크립트를 보자

 # 인스턴스에 접속 후
 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 해도 되고 혹은 도커 허브를 사용하는 대신 직접 실행파일을 업로드에서 사용해도 된다.

profile
AllTimeDevelop

0개의 댓글

관련 채용 정보