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️⃣ 실행 순서
- 기존 컨테이너 정리
docker compose down -v
- 빌드 + 실행
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 |
