기존 프로젝트에 http://localhost:8080 등으로 하드코딩된 부분들은 모수 상대경로로 수정했다..(이부분은 너무 많은 부분이라 세세하게 블로그 안했음) 

 

이제 도커에 올릴텐데.. 

그전에 환경변수 설정할때 여러번 하지않기위해 미리 도메인 무료로 받아올준비부터 한다.

 

https://desec.io/

 

deSEC – Free Secure DNS

 

desec.io

 

 

여기 페이지에서 일단 가입부터하자

 

 

내 구글계정으로 이메일넣고 , 위쪽 CREATE ACCOUNT 누르면 

 

 

무료로 내 dns로 만들 도메인을 만들어준다. 1개만 만들어준다고 하니 ...참고 ....(물론 하위로 몇개더만들순 있는모양이지만)

 

난 healthsync.dedyn.io 가 도메인 주소가 될예정이다. 

추후 저 위에 content 부분에  AWS에서 나올 EC2 IP 주소를 넣고 , 우측 TTL에 3600초, 1시간동안 dns결과를 캐싱한다는 뜻으로 그냥두면된다. 

 

 

이제 백엔드 DOCKER  설정을 시작해야함 ..

 

인텔리제이 기준 맨위에 프로젝트 루트에 오른쪽버튼 누르구..

 

 

저기 보이는 도커파일 누르면 자동으로 만들어짐

 

 

# ====================================
# 1단계 : 빌드 스테이지
# ====================================
FROM eclipse-temurin:17-jdk AS builder

WORKDIR /app

# Gradle Wrapper 복사
COPY gradlew ./
COPY gradle ./gradle

# 실행 권한 부여
RUN chmod +x gradlew

# Gradle 설정 파일 복사
COPY build.gradle settings.gradle ./

# 의존성 미리 다운로드
RUN ./gradlew dependencies --no-daemon || true

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

# ====================================
# 2단계 : 실행 스테이지
# ====================================
FROM eclipse-temurin:17-jre

WORKDIR /app

# 빌드된 JAR만 복사
COPY --from=builder /app/build/libs/*.jar app.jar

# 포트 노출
EXPOSE 8080

# 실행
ENTRYPOINT ["java", "-jar", "app.jar"]




### 블로그용 설명

| 줄 | 의미 |
|-----|------|
| `FROM eclipse-temurin:17-jdk AS builder | Gradle + JDK 17로 빌드 환경 구성 |
| `WORKDIR /app` | 컨테이너 안에서 작업할 폴더 |
| `COPY build.gradle ...` | Gradle 설정 먼저 복사 (캐싱 효율) |
| `RUN gradle dependencies` | 의존성 미리 다운 (다음 빌드 시 캐시) |
| `COPY src ./src` | 소스코드 복사 |
| `RUN gradle bootJar` | JAR 파일 생성 (테스트 스킵) |
| `FROM eclipse-temurin:17-jre` | 실행용 가벼운 이미지 (JRE만) |
| `COPY --from=builder` | 빌드 스테이지에서 JAR만 가져옴 |
| `EXPOSE 8080` | 8080 포트 사용 |
| `ENTRYPOINT` | 컨테이너 시작 시 JAR 실행 |

---

### 왜 2단계로 나누나? (Multi-stage Build)
```
빌드 이미지: ~800MB (Gradle, JDK, 소스 전체)
      ↓
실행 이미지: ~200MB (JRE + JAR만)

 

 

 

이제 프론트엔드도 도커를 추가해야한다.. 먼저 프론트 노드버젼을 확인하자

 

내 터미널 경로> node -v
v24.11.1

 

그리고 도커는 슬림 으로~

 

#================================
# 1단계 : 빌드 스테이지
#================================
FROM node:22-slim AS builder

WORKDIR /app

# 패키지 파일 복사 (캐싱용)
COPY package.json package-lock.json ./

# 의존성 설치
RUN npm ci

# 소스코드 복사 후 빌드
COPY . .
RUN npm run build

#================================
# 2단계 : 실행 스테이지 (Nginx)
#================================
FROM nginx:stable

#빌드된 파일 복사
COPY --from=builder /app/dist /usr/share/nginx/html

# 포트 노출
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

 

 

 

이제 ... 프론트까지 dockerfile 만들었으니...

이걸 통으로 휘두르는 docker-compose.yml 파일을.. 프론트, 백엔드 위의 루트에 만든다.

 

project/
├── backend/
├── frontend/
├── docker-compose.yml  ← 여기!
└── .env                ← 이것도 만들 예정

 

services:
  # 백엔드(Spring Boot)
  backend:
    build: ./backend
    container_name: healthsync-backend
    ports:
      - "8080:8080"
    env_file:
      - .env
    environment:
        - SPRING_PROFILES_ACTIVE=prod
    restart: always

  # 프론트엔드(Nginx)
  frontend:
    build: ./frontend
    container_name: healthsync-frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: always

 

 

다음은 도커가 읽을 환경 .env 파일만들기

 

 

# 데이터베이스
DB_URL=jdbc:mysql://host.docker.internal:3306/healthsync
DB_USERNAME=root
DB_PASSWORD=1234

# JWT
JWT_SECRET=여기에_아주_긴_시크릿키_넣기

# OpenAI
OPENAI_API_KEY=sk-proj-여기에_실제키

# OAuth Google
GOOGLE_CLIENT_ID=여기에_실제값
GOOGLE_CLIENT_SECRET=여기에_실제값

# OAuth Kakao
KAKAO_CLIENT_ID=여기에_실제값
KAKAO_CLIENT_SECRET=여기에_실제값

# OAuth Naver
NAVER_CLIENT_ID=여기에_실제값
NAVER_CLIENT_SECRET=여기에_실제값

# 클라이언트 URL
CLIENT_URL=http://localhost:5173

 

서버에 올라가서 활용할 env.example 추가하기

 

# 데이터베이스
DB_URL=
DB_USERNAME=
DB_PASSWORD=

# JWT
JWT_SECRET=

# OpenAI
OPENAI_API_KEY=

# OAuth Google
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=

# OAuth Kakao
KAKAO_CLIENT_ID=
KAKAO_CLIENT_SECRET=

# OAuth Naver
NAVER_CLIENT_ID=
NAVER_CLIENT_SECRET=

# 클라이언트 URL
CLIENT_URL=

 

 

 

그리고 백엔드에  .dockerignore 를 추가

backend/
├── Dockerfile ✅
├── .dockerignore  ← 여기!
└── src/

 

# 빌드 결과물 (Docker 에서 새로 빌드함)
build/
.gradle/

# IDE 설정
.idea/
*.iml

# Git
.git/
.gitignore

# 기타
*.md
*.log

 

 

frontend/
├── Dockerfile ✅
├── .dockerignore  ← 여기!
└── src/

프론트에도 .dockerignore  추가

 

# 의존성 (Docker에서 새로 설치)
node_modules/

# 빌드 결과물
dist/
.vite/

# IDE
.idea/
*.iml

# Git
.git/
.gitignore

# 환경변수 (compose에서 관리)
.env
.env.local

# 기타
*.md
*.log

 

 

여기까지 하면 ... 기본적인 Docker , aws 준비완료...실전은 다음에..

 

 

+ Recent posts