-
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