[GCP] Docker 이미지로 GCP에 Spring boot 프로젝트 배포하기

susu·2023년 3월 17일
0
post-thumbnail

환경

로컬 : macOS Ventura 13.2.1
배포 서버 : Ubuntu 18.04.1 LTS
IDE : IntelliJ IDEA
Build Tool : Gradle

1. GCP 인스턴스 생성

GCP 가입시 첫 3개월(90일)은 $300의 크레딧을 줍니다.
AWS 사용해보신 분들이라면 프리티어 같은 개념으로 생각하시면 됩니다.

  1. GCP Console > 프로젝트 이름 클릭하여 진입
    (프로젝트가 없다면 생성)

  2. 프로젝트에 Compute Engine API 사용 설정

  3. VM 인스턴스 생성
    옵션은 개인의 상황과 조건에 맞게 판단해서.

    처음 시도하시는 분들을 위한 변경사항은 다음과 같습니다.
    ✅ 리전 : 한국에서 진행하는 경우 asia-northeast3-a(서울)로 변경
    ✅ 머신 유형 : e2-small로 다운그레이드
    ✅ 부팅 디스크 - 운영체제 : Ubuntu (18.04 LTS)

  4. 생성 대기 후 인스턴스 실행

2. gcloud CLI 설치

GCP는 SSH 콘솔 브라우저 접속을 지원하지만 느립니다.
리눅스 명령어에 익숙하신 분들은 gcloud CLI를 설치해 터미널로 접속하실 수 있습니다.
저는 터미널 SSH로 접속하는 게 편해서 설치했습니다.

  1. 공식 문서에서 본인 OS에 맞는 버전 설치
    (압축 해제 후 루트 디렉토리로 옮겨 설치 진행하시는 걸 추천합니다.)

  2. gcloud CLI 초기화

$ gcloud init
  1. 정상 로그인 유무 확인 :
$ gcloud auth login

3. 터미널로 인스턴스 접속 및 기본 설정

  1. 기본 프로젝트리전 설정 되어있는 지 확인
    필수는 아니지만, 설정이 되어있지 않으면 ssh 접속 시 --project--region 옵션 명령어가 필요합니다.
    PROJECT_ID는 GCP 콘솔에 적었던 프로젝트명이고, REGION은 인스턴스 생성 시 골랐던 지역명입니다 (asia-northeast-a,b,c...).
    이 부분은 공식 문서에서 추가적으로 확인하여 설정합니다.

  2. SSH Key 생성

$ ssh-keygen -t rsa -f ~/.ssh/[저장할 SSH 키 이름] -C [USERNAME-생략 가능]
  1. 브라우저로 이동해 Compute Engine > 메타데이터 > SSH 칸에 생성된 SSH Public key 붙여넣기

    $ cat ~/.ssh/[저장한 키 이름] 으로 공개키를 확인할 수 있습니다.
    ssh-rsa로 시작하고, ==[USERNAME] 형식으로 끝납니다.
    전부 복사하시면 됩니다.

  2. 인스턴스 접속

$ gcloud compute ssh [인스턴스 이름]

4. Docker 이미지 생성

  1. Spring boot 프로젝트의 루트 디렉터리에서 Dockerfile 작성

  • 인텔리제이 기준 Docker 플러그인이 설치되어 있어야 하고,
    Dockerfile이라는 이름 그대로 작성해줘야 빌드할 때 도커 설정파일로 인식합니다.
  • FROM : 프로젝트의 자바 버전에 맞게 설정해줍니다.
  • ARG : 빌드된 파일의 경로를 지정해줍니다. 루트 디렉토리 기준으로 상대경로로 작성합니다.
  1. Gradle에서 Build
    인텔리제이 오른쪽 사이드바에 Gradle 탭이 있습니다.
    Task > build > bootJar 눌러주시면 build/libs 디렉토리와 함께 .jar 압축파일이 생성됩니다.

  2. 로컬에서 도커 이미지 생성 후 push
    레포지토리가 없는 경우 DockerHub에 접속해 하나 만들어줍니다.

// Dockerfile이 위치한 루트 디렉토리에서 터미널을 열어 실행합니다.
$ docker build -t {DockerHub 사용자명}/{DockerHub 레포명} .
$ docker push {DockerHub 사용자명}/{DockerHub 레포명}:{(선택)태그명}

5. 배포

  1. GCP 인스턴스 접속 후 도커 설치 및 로그인
$ sudo apt install docker.io
$ docker login

로그인 시 permission error가 발생한다면 사용자를 docker group에 포함시키지 않아 보안 문제가 발생했다는 뜻입니다.
$ sudo usermod -a -G docker $USER 로 사용자(환경변수 $USER 자체가 사용자를 의미합니다)를 도커 그룹에 넣어주고 인스턴스를 재실행하면 문제가 해결됩니다.

  1. 이미지 pull 후 컨테이너 구동
$ sudo docker run -p {호스트 포트}/{컨테이너 포트} {DockerHub 사용자명}/{DockerHub 레포명}

$ sudo docker ps 로 컨테이너 목록을 확인할 수 있습니다.
실행한 이미지가 컨테이너화 되어 들어있다면 정상 실행중인 것입니다.

🚨 멀티 플랫폼 빌드 해결 (Buildx)

ARM64 칩을 가진 M1 노트북에서 빌드한 것을 배포하면 VM상 플랫폼과 충돌하여 정상 빌드되지 않습니다.
M1 사용자라면 빌드된 이미지가 호스트의 영향을 받지 않도록 빌드할 때 --platform 옵션을 추가해서 처리해주도록 합니다.
저는 호스트 서버가 Ubuntu(linux/amd64)를 지원하므로 --platform linux/amd64 옵션을 붙여 빌드했습니다.

profile
블로그 이사했습니다 ✈ https://jennairlines.tistory.com

0개의 댓글