ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Dockerfile로 이미지 빌드 및 실행
    Docker 2025. 7. 25. 22:59

     

    Springboot로 만든 웹 애플리케이션으로 이미지를 빌드하고, 단일 컨테이너를 실행하는 예시입니다.

     

    Dockerfile 작성

    # === Build Stage ===
    FROM openjdk:17.0.2-jdk-slim-buster AS builder
    WORKDIR /app
    COPY gradlew build.gradle.kts settings.gradle.kts ./
    COPY gradle ./gradle
    COPY src ./src
    RUN ./gradlew bootJar --no-daemon
    
    # === Run Stage ===
    FROM openjdk:17.0.2-slim-buster AS final
    WORKDIR /app
    EXPOSE 8080
    COPY --from=builder /app/build/libs/myapp-0.0.1-SNAPSHOT.jar app.jar
    ENV PROFILE=dev
    ENTRYPOINT [ "java", "-Dspring.profiles.active=${PROFILE}" , "-jar", "app.jar"]

     


    Dockerfile로 이미지 빌드

    docker build -t myapp:1.0 .

    -t 옵션으로 이름(필수)과 태그(선택)를 입력합니다. 이때, 마지막에 마침표(.)를 찍어서 Dokerfile의 위치를 알려줘야 합니다. Dockerfile은 일반적으로 gradle 파일이 있는, 프로젝트의 루트에 생성해줍니다. 따라서 그 위치로 위와 같이 명령을 실행하면 됩니다.

     

    이미지 확인

    docker image ls

    이미지 빌드가 잘 되었는지 확인합니다. Docker Desktop의 Images 메뉴에서도 확인 가능합니다.

     


    실행

    docker run --name myapp -p 8080:8080 myapp:1.0
    • --name myapp: 'myapp'이라는 이름으로 컨테이너 생성 및 실행
    • -p 8080:8080: (호스트 포트):(컨테이너) 포맷으로, 호스트 포트에 컨테이너 포스트를 publish하는 옵션
    • -d 옵션으로 백그라운드에서 컨테이너 실행 가능

     

    컨테이너 확인

    docker container ls -a

     

    실행이 잘 되었는지 확인합니다. Docker Desktop의 Containers 메뉴에서도 확인 가능합니다.

     


    Dockerfile 분석

    FROM openjdk:17.0.2-jdk-slim-buster AS builder
    • FROM: 베이스 이미지 지정
    • 애플리케이션 빌드를 위해 JDK 환경 제공
    • AS builder: 이 이미지를 builder라는 이름의 빌드 단계로 명명. 이후에 참조할 수 있도록 별칭 처리하는 것으로, 멀티 스테이지 빌드에서 필수

     


    WORKDIR /app
    • WORKDIR: 이후 모든 명령의 작업 디렉토리를 '/app'으로 설정
    • 이 경로 아래에서 COPY, RUN 등 모든 작업이 수행됨.

    COPY gradlew build.gradle.kts settings.gradle.kts ./

     

    • COPY: 호스트의 파일을 컨테이너의 현재 작업 디렉토리(/app)로 복사
    • Gradle wrapper, 빌드 설정 파일들을 먼저 복사함으로써, 빌드 캐시를 최대로 활용할 수 있다.

     


    COPY gradle ./gradle
    • gradle wrapper가 사용하는 파일 복사, 제대로 동작하기 위해 반드시 필요

     


    COPY src ./src
    • 코드 복사

     


    RUN ./gradlew bootJar --no-daemon
    • RUN: 컨테이너 안에서 명령어 실행
    • Gradle wrapper를 이용해 Spring Boot의 실행 가능한 JAR 생성
    • --no-daemon: Gradle 데몬 백그라운드 프로세스를 비활성화하여 불필요한 리소스 낭비 방지

     


    # === Run Stage ===
    FROM openjdk:17.0.2-slim-buster AS final
    • 실행 전용 스테이지 시작
    • 빌드 단계와는 달리, 이 이미지는 컴파일된 애플리케이션(JAR 파일)을 실행하기에 충분한 자바 런타임 환경(JRE)을 제공하여 이미지 경량화 및 보안강화

     


    WORKDIR /app
    • 런타임 컨테이너 내의 작업 디렉토리 설정
    • 앱 실행 시 이 경로에서 java -jar가 수행됨.

     


    EXPOSE 8080
    • 컨테이너가 8080 포트에서 수신 대기할 것을 Docker에게 알림.
    • EXPOSE는 문서적 역할만 하며, 실제로 호스트에서 접근하려면 -p 호스트 포트:8080 옵션으로 컨테이너를 실행해야 한다.

     


    COPY --from=builder /app/build/libs/myapp-0.0.1-SNAPSHOT.jar app.jar
    • COPY --from=builder: 앞에서 명명한 builder 단계로부터 파일을 복사
    • myapp-0.0.1-SNAPSHOT.jar를 app.jar라는 이름으로 복사함
    • 이로써 최종 이미지에는 JAR 파일만 포함되고, Gradle 관련 불필요한 빌드 도구는 없음.

     


    ENV PROFILE=dev
    ENTRYPOINT [ "java", "-Dspring.profiles.active=${PROFILE}" , "-jar", "app.jar"]
    • 컨테이너가 시작될 때 실행할 기본 명령어를 설정
    • 명령을 실행하여 애플리케이션 실행

    'Docker' 카테고리의 다른 글

    Docker를 사용하는 이유  (1) 2025.07.24

    댓글

Designed by Tistory.