RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

Dockerfile과 docker-compose.yml

1️⃣ Dockerfile

멀티 스테이지 빌드 사용
: 하나의 Dockerfile 안에서 여러개의 FROM 을 사용해 빌드 단계와 실행 단계를 분리

  • 빌드 환경과 실행 환경을 분리
  • 최종 이미지 용량을 최소화
  • 보안 및 배포 안정성 향상
# ================
#  Build Stage  : 빌드만 담당하는 부분
# ================
FROM gradle:8.14.3-jdk17 AS builder // 공식 이미지 사용 -> builder라는 이름으로 지정
WORKDIR /app //작업 디렉토리 설정

# 캐시 최적화 : Gradle 의존성 다운로드는 시간이 오래 걸림
COPY build.gradle settings.gradle gradlew ./   //Gradle 설정 파일만 먼저 복
COPY gradle ./gradle
RUN ./gradlew dependencies --no-daemon  //라이브러리만 미리 다운로드
# 이후 소스 코드가 바뀌어도 의존성 캐시는 유지됨

#소스 복사 후 빌드
COPY src ./src
RUN ./gradlew clean bootJar --no-daemon

# ================
#  Runtime stage : 실행 담당하는 부분
# ================
FROM eclipse-temurin:17-jre //jre만 포함된 경량 이미지 : Gradle, 소스 코드, 빌드 도구 x
WORKDIR /app

#빌드 결과물만 복사
COPY --from=builder /app/build/libs/*.jar app.jar

EXPOSE 8080 //포트를 사용한다는 것을 문서화
 
ENTRYPOINT ["java", "-jar", "app.jar"] //컨테이너가 시작되면 자동으로 실행되는 명령어

2️⃣ docker-compose.yml

여러 개의 컨테이너를 하나의 설정 파일로 정의하고 함께 실행, 관리하는 도구

version: "3.9"

services:   #실행할 컨테이너 정의
  mysql:
    image: mysql:8.0
    container_name: metasns-mysql
    restart: always  #컨테이너가 죽거나 서버 재부팅시 자동 재시작
    environment:  #DB 초기 설정
      MYSQL_DATABASE: metasns
      MYSQL_USER: metasns
      MYSQL_PASSWORD: metasns_pw
      MYSQL_ROOT_PASSWORD: root_pw
    ports:
      - "3306:3306"   #호스트 3306포트 -> 컨테이너 3306 포트로
    healthcheck:  #MySQL이 접속 가능한 상태인지 확인
      test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot_pw" ]
      interval: 10s  #10초마다 검사
      timeout: 5s    #5초 안에 응답이 없으면 실패
      retries: 10    #최대 10번 시도
    volumes:
      - mysql_data:/var/lib/mysql  #볼륨 연결

  api:
    build: .
    container_name: metasns-api
    depends_on:
      mysql:
        condition: service_healthy
    ports:
      - "8080:8080"
    env_file:
      - .env

volumes:
  mysql_data:

3️⃣ 실행 순서

  1. 기존 컨테이너 정리
docker compose down -v
  1. 빌드 + 실행
docker compose up --build

'Project > MetaSNS' 카테고리의 다른 글

이미지 업로드 시 500 에러 (로컬 로그 없음)  (0) 2026.03.03
JWT Weak Key Exception 발생  (0) 2026.03.03
/login?error로 리다이렉트되는 현상  (0) 2026.03.03
Hibernate Dialect 오류 발생  (0) 2026.03.03
JAR 빌드란?  (0) 2026.03.03