[docker newbie] spring boot 서버를 도커 컨테이너 안에서 실행하기 (feat 자동 빌드)

dockerfile 내용

# 1단계: 빌드
FROM gradle:8.14-jdk17 AS build
WORKDIR /app
COPY . .
RUN gradle build -x test

# 2단계: 실행
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=build /app/build/libs/*.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

 

compose.yml 파일 내용

services:
  app:
    build:
      context: .
    ports:
      - "8080:8080"

 

dockerfile이 위치한 곳에서 cmd창에 

docker compose build --no-cache

docker-compose.yml이 여러가지 dockerfile을 띄워주는 용도로 알고 있었는데 잘못 알고 있었다.

compose.yml은 여러 컨테이너를 하나의 애플리케이션으로, 실행 단위로 정의하는 도구다.

따라서 dockerfile이 하나라도 copmose를 쓰는 것이 이상한 일은 아니다.

 

Dockerfile 1개 → docker run
Dockerfile 여러 개 → docker compose

이런 모양이 아니라는 것.

 

dockerfile은 '이 컨테이너를 어떻게 만들것인가'에 관한 것이다.

  • 어떤 OS를 쓸건지?
  • 어떤 JDK를 쓸건지?
  • 어떤 파일을 복사하고
  • 어떤 명령으로 실행할건지.

즉 이미지를 제작하기 위헌 설명서 같은 것...

Spring Boot 앱을
Java 17로
8080 포트에서
실행한다

 

그렇다면 docker-compose.yml은 뭘까

"이 컨테이너를 어떤 환경에서 어떻게 실행할것인가"

  • 포트
  • 환경변수
  • 네트워크
  • 볼륨
  • 의존 관계
  • 실행 순서
이 Spring 앱을
포트 8080으로 노출하고
개발 환경에서
한 번에 실행한다

이 앱을 어떻게 실행할지에 대해 정의하는 것이다.

그리고 앱은 점점 확장되기 때문에(Spring + DB + Redis + Kafka + Mock server)

이것들의 실행 스크립트를 모아두는 것이다.