[SpringBoot] Docker 를 이용하여 Springboot 를 GCP에 배포

익선·2023년 9월 15일
0

스프링부트

목록 보기
5/8

삽질의 첫 시작, GCP 배포.

📎 Docker, GCP 배포 과정

  1. dockerfile 을 작성하고 build 하면 docker image 가 생성된다.
  2. dockerfile 을 dockerhub 로 push 한다.
  3. GCP 인스턴스에 접속해 docker image 를 pull 한다.
  4. docker image 를 실행시켜 docker container 를 생성한다 (docker container 에서 애플리케이션 실행)

1. 로컬에 Docker 설치

로컬 환경에서 docker 를 편리하게 설치하고 실행하기 위해 Docker Desktop 설치하자 (설치 방법은 생략)

터미널에 $ docker 명령어를 입력하여 정상적으로 설치되었음을 확인한다.

2. Dockerfile 생성

Docker가 정상적으로 설치가 완료 되었다면, 해당 springboot 프로젝트의 루트 폴더에 Dockerfile 을 생성하고 아래 내용을 작성한다.

반드시 해당 프로젝트에 맞는 jdk 버전을 선택한다

3. Docker Hub 리포지토리 생성

Dockerfile 을 작성하였으니, 프로젝트를 build 하여 생성된 docker image 를 Docker Hub에 push 해야한다.
따라서, Docker Hub 애 접속하여 회원 가입을 하고, 이미지를 업로드할 리포지토리를 생성한다.
리포지토리 이름은 m1nddoong/ecology_map 으로 하였다.

4. GCP 서버에 Docker 설치

(1) 인스턴스 접속

  • GCP 콘솔에서 이전에 만들어 둔 VM 인스턴스에 ssh로 접속하여 로그인
$ ssh -i ~/.ssh/gcp-key m1nddoong0321@xx.xxx.xxx.xxx

(2) Docker & Java 설치

  • 1) 공식문서에 나온대로 Docker 를 설치하고, 잘 설치되었는지 sudo docker --version 명령어로 확인
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

$ sudo mkdir -m 0755 -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
$ sudo docker --version
# 결과
Docker version 24.0.6, build ed223bc
  • 2) jar 파일을 실행시키기 위해 Java Runtime 환경 구축
    • 해당 springboot 프로젝트가 jdk-17 버전을 사용하고 있기 떄문에, GCP 서버에 OpenJDK 17 설치
$ sudo apt install -y openjdk-17-jdk
$ java -version
# 결과
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu120.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu120.04, mixed mode, sharing)

(3) docker-compose 설치

도커를 더 편리하게 쓸 수 있게 해주는 docker-compose를 설치합니다.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
% sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ docker-compose -v
# 결과
docker-compose version 1.27.4, build 40524192

5. Docker-compose.yml 생성

  • 아래 명령어를 입력하여 docker-compose.yml 파일을 생성 및 작성한다.
    • sudo vim docker-composer.yml 로 실행하여 오류를 저장 닫기가 되지 않는 오류를 해결
  • docker-compose.yml 파일의 내용은 다음과 같이 작성하고 ESC + !wq 로 저장합니다.
    • version 3 : docker composer 파일의 버전은 3 사용
    • services: application 서비스 정의
    • image : application 서비스에 사용할 도커 이미지를 지정한다.
      • 즉 ecology_map 이라는 이름의 이미지를 컨테이너로 실행할 것
    • environment : 다음 환경 변수를 설정하여 Springb Boot 애플리케이션에서 DB 연결에 필요한 정보를 전달한다.
      • 해당 내용에는 GCP 의 MySQL 인스턴스 ID, PW 를 입력한다
    • restart: always 컨테이너가 종료되었을 때 자동으로 다시 시작되도록 지정
    • container_name : ecology_map 이라는 컨테이너를 참조할 수 있도록 지정
    • ports : 호스트의 8080 포트와 컨테이너 내부의 8080 포트를 매핑하므로서, 호스트에서 localhost:8080 으로 접근하면 컨테이너 내부의 애플리케이션에 연결할 수 있다.

6. 배포하기

(1) 로컬

  1. IntelliJ 에서 bootJar 실행을 통한 jar 빌드

    • Spring Boot 애플리케이션을 JAR 파일로 패키징 한다.
  2. docker login 하기

    • username : m1nd*****
    • password : ecom*******
  3. Docker Desktop 실행

    • Docker Desktop을 실행하면 Docker Demon도 함께 백그라운드에서 실행되며 따라서 Docker 컨테이너를 관리할 수 있게 된다.
  4. docker buildx build 사용

    • 그 후에 'docker buildx' 명령어를 사용하여 Spring Boot JAR 파일과 Dockerfile 을 기반으로 도커 이미지를 생성하고, --push 옵션으로 Docker Hub Repository 로 자동 push 해준다.
    • docker buildx build --platform=linux/amd64,linux/arm64 -t m1nddoong/ecology_map . --push 입력
    • ex) docker buildx build --platform=linux/amd64,linux/arm64 -t m1nddoong/ecology_map . --push

buildx 설정

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


  • 1. builder 생성 및 사용하기


  • 2. Buildx로 multi-platform image 만들기

    • --platform=linux/amd64,linux/arm64 :amd64와 arm64를 모두 지원하는 이미지를 빌드
    • --load : 이미지를 만들고 호스트 docker image에 저장
    • --push : --load옵션과 반대로 docker registory로 바로 push 하는 옵션

도커 데스크탑에도 들어옴

(2) 서버

로컬 환경에서 JAR 파일로 빌드하고, 도커 이미지 생성 및 push 하였다. 이제는 GCP 인스턴스에 접속 후 도커로 로그인하여 배포 서버상으로 도커 이미지를 pull 해오는 과정을 진행하겠다.

  1. GCP 인스턴스 접속 후 도커 로그인
    • docker login
  2. 도커 허브에서 pull 로 이미지 당겨오기
    • sudo docker pull 계정명/리포지토리명
    • sudo docker pull m1nddoong/ecology_map
    • sudo docker iamges 로 도커 허브에서 pull 해온 이미지가 잘 들어왔는지 확인
  3. 도커 yml 에서 설정한 이미지 생성
    • sudo docker tag pull한 이미지 만들이미지
    • sudo docker tag m1nddoong/ecology_map ecology_map
      • 이미지 이름을 변경해준다 생각 (docker-compose.yml 에서 application.image 에 지정해둔 걸(ecology_map)로 변경
  4. 도커 컴포즈로 실행
    • sudo docker-compose up

7. 배포 완료

(1) 배포 base url

(2) postman 으로 확인


마치며

GCP를 이용하여 DB를 바꾸고, 서버배포까지 그 과정은 기나긴 여정 같았지만 배포를 성공해서 뿌듯하긴하다.
위 과정을 통해서 어떻게 docker 로 이미지를 생성하여, 컨테이너를 생성해 실행시키는지를 배울 수 있었고 GCP 가 아닌 AWS 에 대해서도 공부하고싶다는 생각이 들었다. -끝-

[참고 사이트]
https://velog.io/@baeyuna97/exec-user-process-caused-exec-format-error-%EC%97%90%EB%9F%AC%ED%95%B4%EA%B2%B0
https://velog.io/@inyong_pang/Devops-Docker-buildx-at-M1-Macbook
https://choo.oopy.io/5c999170-dde5-4418-addc-00a0d263287c#63362673-217c-4d31-aefd-2c3314d575d6
https://velog.io/@codesusuzz/GCP-Docker-%EC%9D%B4%EC%9A%A9-Spring-boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
https://hun-dev.tistory.com/13
https://velog.io/@leeeeeyeon/Docker%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Spring-Boot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-EC2-%EB%B0%B0%ED%8F%AC
출처 https://souljit2.tistory.com/74

profile
꾸준히 기록하는 사람

1개의 댓글

comment-user-thumbnail
2024년 2월 2일

글 잘 읽었습니다!
여담이지만 iterm2 테마 어떤건지 알 수 있을까요?

답글 달기