🔥 3티어 Docker 배포 가이드
📌 1. Database (PostgreSQL)
✅ 준비 파일: init.sql
-- 1. 테이블 생성
CREATE TABLE greetings (
id SERIAL PRIMARY KEY,
lang VARCHAR(10) UNIQUE NOT NULL,
message TEXT NOT NULL
);
-- 2. 초기 데이터 삽입
INSERT INTO greetings (lang, message) VALUES
('kr', '안녕하세요'),
('en', 'hello world'),
('jp', '곤니찌와');
application.yml 예시
spring:
datasource:
url: jdbc:postgresql://hello-db:5432/hello_db
username: hellouser
password: 1234
✅ Docker 네트워크 생성
docker network create hello-net
✅ PostgreSQL 컨테이너 실행
docker run -d \
--name hello-db \
--network hello-net \
-v hello-data:/var/lib/postgresql/data \
-v "$(pwd)"/init.sql:/docker-entrypoint-initdb.d/init.sql \
-e POSTGRES_DB=hello_db \
-e POSTGRES_USER=hellouser \
-e POSTGRES_PASSWORD=1234 \
postgres:17
🛠️ 2. Backend (Spring Boot)
✅ Dockerfile
# 빌드 단계
FROM gradle:8.8-jdk17-alpine AS build
WORKDIR /app
COPY . .
RUN gradle bootJar
# 실행 단계
FROM openjdk:17-slim
WORKDIR /app
COPY --from=build /app/build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
✅ 이미지 빌드
docker build -t hello-backend -f ./backend/Dockerfile ./backend
✅ 컨테이너 실행
docker run -d \
--name hello-backend \
--network hello-net \
-p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:postgresql://hello-db:5432/hello_db \
-e SPRING_DATASOURCE_USERNAME=hellouser \
-e SPRING_DATASOURCE_PASSWORD=1234 \
hello-backend
✅ 동작 확인
curl http://localhost:8080
🎨 3. Frontend (Next.js)
✅ Dockerfile
FROM node:20-alpine
WORKDIR /app
ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
✅ 이미지 빌드
docker build -t hello-frontend \
--build-arg NEXT_PUBLIC_API_URL=http://localhost:8080 \
-f ./frontend/Dockerfile ./frontend
✅ 컨테이너 실행
docker run -d \
--name hello-frontend \
-p 3000:3000 \
hello-frontend
📊 전체 요약
| Database |
postgres:17 |
hello-db |
내부 5432 |
init.sql로 초기화 수행 |
| Backend |
hello-backend |
hello-backend |
8080 |
Spring Boot 앱 실행 |
| Frontend |
hello-frontend |
hello-frontend |
3000 |
Next.js 앱, API URL 전달 필요 |
| 네트워크 |
- |
hello-net |
- |
모든 컨테이너가 이 네트워크에 연결됨 |