개발 일기

[Docker] 스프링 부트 Dockerfile 작성부터 EC2 환경에 배포까지 본문

DevOps/Docker Kubernetes

[Docker] 스프링 부트 Dockerfile 작성부터 EC2 환경에 배포까지

개발 일기장 주인 2024. 5. 19. 21:24

도커 파일 작성

동기들과 주식 관련 솔루션 서비스를 제작하면서 스프링 부트로 백엔드를 맡아 하는 과정에 Dockerfile을 직접 작성해봤다.

FROM에서 베이스 이미지를 OpenJDK 21로 지정했습니다.  제 Spring Boot가 Java21 버전을 사용하고있어서 선택했고 

ARG는 Docker 빌드 시 사용할 변수(JAR_FILE)를 정의한다. 이 변수는 빌드된 JAR 파일의 경로를 가리키며 

앞에서 정의한 ARG의 JAR_FILE 변수를 사용하여 JAR 파일을 이미지 안으로 'app.jar'라는 이름으로 복사해 온다.

.env 파일은 OPEN AI의 Assistant API를 사용할 때 필요한 OPENAI API 키를 저장해뒀다. build 시에 포함되지 않아 따로 COPY를 했다. 마지막으로 ENTRYPOINT는 컨테이너가 시작될 때 반드시 실행되는 명령으로 Java 실행 명령어를 통해 JVM이 시작되고 app.jar라는 JAR파일을 실행시킨다.

 

./gradlew clean build -x test 명령을 통해 생성된 build/libs/InvestiMate-0.0.1-SNAPSHOT.jar 파일을 Dockerfile을 통해 이미지에 복사하여 app.jar로 이름을 바꾸고 저장하는 과정에서 쓰이는 것이다.

 

docker buile 커맨드

위와 같은 Dockerfile Instruction을 통해 도커파일을 작성한 뒤 이를 실행하기 위해서 docker build 커맨드를 사용

docker build ${option} ${dockerfile directory}

 

docker build  -t back-server --platform linux/amd64 .

  • 우선 -t 옵션을 살펴보자. -t 옵션은 --tag 옵션과 동일하다.
    docker build  -t back-server --platform linux/amd64 .
    docker build  -t back-server:0.0.1 --platform linux/amd64 .
    그래서 해당 옵션은 Docker 이미지의 이름 및 태그를 지정해주는데 사용된다. 첫번째 커맨드와 같이 태그 지정은 Optional이며 아래와 같이 지정도 가능하다.

docker build 후 docker images

  • 두번째로 살표볼 옵션은 --platform 이다.
    docker build  -t back-server --platform linux/amd64 .
    이 옵션은 별로 중요하다 생각하지 않았지만 꽤나 중요한 옵션인 것 같다. 내가 사용하고 있는 노트북은 Mac m2 OS라서 arm기반 아키텍처이다. 따라서 그냥 docker build를 하게되면 platform이 linux/arm64으로 생성된다. 

    그러나 내가 배포하고자하는 AWS EC2 ubuntu OS에서는 linux/arm64가 아닌 linux/amd64를 호환하기 때문에 해당 옵션을 통해 빌드될 이미지가 돌아갈 아키텍처를 지정해줘야 한다.
위와 같은 과정을 거치면 내가 개발한 스프링 서버의 도커 이미지가 생성된다.
docker push [이미지명]을 통해 docker hub로 push 한 후 
AWS EC2와 같은 배포 환경에서 docker pull [이미지명]로 이미지를 다운 받은 후 
docker run -d -p 8080:8080 [이미지명]과 같은 run 커맨드를 통해 컨테이너를 실행하여 
배포환경에서도 나의 스프링 서버가 동작하도록 할 수 있다!

 

‼️‼️ 주의할점

이때 배포환경에서도 동작하게 하기 위해서는 application.yml파일을 image로 뽑아내기 전에 수정해야한다.

OAuth2.0의 callback 및 base url주소를 배포 환경 EC2의 IP 주소로 수정해야하며 
나는 AWS RDS를 사용했기 때문에 datasource.url. 또한 RDS의 엔드포인트로 지정해줘야지 배포환경에서도 정상적으로 동작한다.!

이 점을 주의하자.