<aside> 👨🏻‍🏫 AWS EC2에 Spring Boot 프로젝트만 배포를 해야하는 상황이라고 가정하자.

</aside>

✅ Docker CLI로 배포하기

  1. 로컬 환경에서 프로젝트 셋팅

    start.spring.io

    Untitled

  2. 간단한 코드 작성

    AppController

    @RestController
    public class AppController {
      @GetMapping("/")
      public String home() {
        return "Docker, World!";
      }
    }
    
  3. Dockerfile 작성하기

    Dockerfile

    FROM openjdk:17-jdk
    
    COPY build/libs/*SNAPSHOT.jar app.jar
    
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
  4. Spring Boot 프로젝트 빌드하기

    $ ./gradlew clean build
    $ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com
    $ docker build -t instagram-server .
    $ docker tag instagram-server:latest 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
    $ docker push 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
    
  5. AWS EC2에서 AWS CLI 설치 및 액세스 키 등록하기

    (아래 설명 참고하기)

    [실습] AWS ECR(Elastic Container Registry) 사용해보기

  6. AWS ECR로부터 이미지 다운받아 컨테이너 띄우기

    $ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com
    $ docker pull 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server 
    $ docker run -d -p 8080:8080 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server
    

혹시나 아래와 같은 에러가 발생했다면?

Untitled

이 에러의 원인은 CPU 아키텍처 환경이 다르다는 뜻이다. 조금 더 자세히 설명하자면, 이미지 빌드는 M1과 같은 ARM 기반의 환경에서 진행하고, 이미지 실행은 ARM 기반의 환경이 아닌 곳에서 할 때 위와 같은 에러가 발생한다.

위 에러를 해결하기 위해서는 이미지를 실행시키고자 하는 CPU 아키텍처에 맞춰서 이미지를 빌드해야 한다. 로컬 환경에서 아래와 같이 다시 빌드한 뒤 AWS ECR로 Push하자.

$ ./gradlew clean build
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com
$ docker build **--platform linux/amd64** -t instagram-server .
$ docker tag instagram-server:latest 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
$ docker push 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest
  1. 잘 작동하는 지 확인하기

    $ docker ps
    $ docker logs
    

    Untitled

✅ Docker Compose로 배포하기

Docker Compose의 장점 중 하나는 복잡한 명령어로 실행시키던 걸 간소화 시킬 수 있다는 점이 있다. 따라서 Docker CLI 말고 Docker Compose를 활용해서 Spring Boot 서버를 배포해보자.

  1. 폴더 만들기

    $ mkdir instagram-server