๐ŸŒ CS & Infra/Infrastructure

[Infrastructure] Spring Boot × Docker × AWS ๋ฐฐํฌ ํ๋ฆ„ ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๊ธฐ

devCloud 2026. 5. 8. 13:12
728x90
DEPLOYMENT

Spring Boot ์•ฑ์„ Docker๋กœ AWS์— ๋ฐฐํฌํ•˜๋Š” ์ „์ฒด ํ๋ฆ„ ์ •๋ฆฌ

Docker์™€ AWS๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. “Docker๋ฅผ ์“ฐ๋Š” ๊ฑด๊ฐ€? AWS๋ฅผ ์“ฐ๋Š” ๊ฑด๊ฐ€?” ์ด ๋‘˜์˜ ๊ด€๊ณ„๋ถ€ํ„ฐ ์‹ค์ œ ๋ฐฐํฌ ํ๋ฆ„๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ •๋ฆฌํ•ด๋ณด์ž.
 
 
Docker๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๐Ÿ‘‡
 

Docker

๐Ÿ“‹ ๋ชฉ์ฐจ๋„์ปค๋ž€?ํ•ต์‹ฌ ๊ฐœ๋…VM๊ณผ Docker ์ฐจ์ด๋ฐฐํฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ๊ธฐ๋ณธ ๋ช…๋ น์–ด์ฐธ๊ณ  ๋งํฌ๐Ÿ“Œ ๋„์ปค๋ž€?์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ™” ๋„๊ตฌ (2013๋…„ ๋“ฑ์žฅ)๋ฆฌ๋ˆ…์Šค์˜ ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•ด ์•ฑ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ปจ

dev-cloud.tistory.com


1. Docker๊ฐ€ ์™œ ํ•„์š”ํ•œ๊ฐ€?

Spring Boot ์•ฑ์ด ๋กœ์ปฌ์—์„œ๋Š” ์ž˜ ๋Œ์•„๊ฐ€๋Š”๋ฐ, ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๋ฉด ๊ฐ‘์ž๊ธฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ์‹คํ–‰ ํ™˜๊ฒฝ ์ฐจ์ด ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค. Java ๋ฒ„์ „์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜, OS ํ™˜๊ฒฝ์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์ด ๋‹ฌ๋ผ์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๋ง์ด ์žˆ๋‹ค.
“๋‚ด ์ปดํ“จํ„ฐ์—์„  ๋๋Š”๋ฐ?”
Docker๋Š” ๋ฐ”๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค.

Docker๋Š” ์•ฑ๊ณผ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋ฌถ๋Š”๋‹ค. ์ฆ‰, ์–ด๋””์„œ ์‹คํ–‰ํ•˜๋“  ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Docker๋ฅผ ๋น„์œ ํ•˜๋ฉด?

๋ ˆ์‹œํ”ผ(์ฝ”๋“œ)๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ฃผ๋ฐฉ ํ™˜๊ฒฝ๊นŒ์ง€ ํ†ต์งธ๋กœ ๋ฐ•์Šค์— ๋‹ด์•„ ๋ณด๋‚ด๋Š” ๊ฐœ๋…์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

Docker ์ด๋ฏธ์ง€์—๋Š” ์•ฑ๋ฟ ์•„๋‹ˆ๋ผ ์‹คํ–‰์— ํ•„์š”ํ•œ JDK, ์„ค์ •, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊นŒ์ง€ ํฌํ•จ๋œ๋‹ค.

2. Docker์™€ AWS์˜ ์ฐจ์ด

๊ฐ€์žฅ ๋งŽ์ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค.

๊ตฌ๋ถ„ ์—ญํ• 
Docker ์•ฑ์„ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
AWS ์„œ๋ฒ„, DB, ๋„คํŠธ์›Œํฌ ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ”„๋ผ

์ฆ‰, ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค. AWS๋ผ๋Š” ์ธํ”„๋ผ ์œ„์—์„œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Docker๋Š” “์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€”, AWS๋Š” “์–ด๋””์„œ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€”์— ๊ฐ€๊น๋‹ค.

3. AWS ์„œ๋น„์Šค ์—ญํ•  ์ •๋ฆฌ

Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ AWS๋กœ ๋ฐฐํฌํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์„œ๋น„์Šค ์—ญํ• 
EC2 Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„
RDS MySQL ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ
ElastiCache Redis ์บ์‹œ ์„œ๋ฒ„ ์ œ๊ณต
S3 ํŒŒ์ผ ์ €์žฅ์†Œ
CloudFront CDN ๊ธฐ๋ฐ˜ ๋น ๋ฅธ ์ •์  ํŒŒ์ผ ๋ฐฐํฌ
์‹ค๋ฌด์—์„œ๋Š” ๋ณดํ†ต EC2 + RDS + Redis + S3 ์กฐํ•ฉ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

4. ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ํ๋ฆ„

์ „์ฒด ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ฐœ๋ฐœ์ž ์ฝ”๋“œ ์ž‘์„ฑ
        ↓
Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
        ↓
DockerHub ๋˜๋Š” ECR ์—…๋กœ๋“œ
        ↓
EC2 ์„œ๋ฒ„์—์„œ ์ด๋ฏธ์ง€ pull
        ↓
Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
        ↓
RDS / Redis / S3 ์—ฐ๊ฒฐ
        ↓
์‚ฌ์šฉ์ž ์š”์ฒญ ์ฒ˜๋ฆฌ

์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Spring Boot ์•ฑ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ RDS(MySQL), Redis, S3์™€ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค.

์‹ค์ œ ์„œ๋น„์Šค๋Š” ๋‹จ์ˆœํžˆ “Spring Boot ํ•˜๋‚˜ ์‹คํ–‰”์œผ๋กœ ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. DB, ์บ์‹œ, ํŒŒ์ผ ์ €์žฅ์†Œ ๋“ฑ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ํ•จ๊ป˜ ๋™์ž‘ํ•œ๋‹ค.

5. Dockerfile ์ž‘์„ฑ๊ณผ ๋ฐฐํฌ

Spring Boot ์•ฑ์„ Docker ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Dockerfile์„ ์ž‘์„ฑํ•œ๋‹ค.

Dockerfile ์˜ˆ์‹œ

# Build Stage
FROM eclipse-temurin:17-jdk-alpine AS builder

WORKDIR /app

COPY . .

RUN ./gradlew bootJar

# Run Stage
FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

COPY --from=builder /app/build/libs/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]
Multi-stage Build๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ตœ์ข… ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t my-spring-app .

DockerHub ์—…๋กœ๋“œ

docker push your-dockerhub-id/my-spring-app

EC2์—์„œ ์‹คํ–‰

docker pull your-dockerhub-id/my-spring-app

docker run -d -p 80:8080 your-dockerhub-id/my-spring-app
DB ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐ ์ •๋ณด๋Š” Dockerfile์— ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ๋ง๊ณ , ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

application.yml ์˜ˆ์‹œ

spring:
  datasource:
    url: ${SPRING_DATASOURCE_URL}
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}

  data:
    redis:
      host: ${SPRING_REDIS_HOST}
      port: 6379

6. ๋ฐฐํฌ ๋ฐฉ์‹ ๋น„๊ต

๋ฐฉ์‹ ์žฅ์  ๋‹จ์ 
JAR ์ง์ ‘ ๋ฐฐํฌ ๋‹จ์ˆœํ•˜๋‹ค ํ™˜๊ฒฝ ์ฐจ์ด ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
Docker ๋ฐฐํฌ ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ ๋ณด์žฅ Docker ํ•™์Šต ํ•„์š”
Docker Compose ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ํŽธ๋ฆฌ ์šด์˜ ํ™˜๊ฒฝ์—์„  ๊ด€๋ฆฌ ํ•„์š”
PaaS (Railway ๋“ฑ) ๋ฐฐํฌ๊ฐ€ ๋งค์šฐ ์‰ฝ๋‹ค ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์ œํ•œ

Docker Compose ์˜ˆ์‹œ

version: '3.8'

services:
  app:
    image: my-spring-app
    ports:
      - "80:8080"

  db:
    image: mysql:8

  redis:
    image: redis:7
์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” DB์™€ Redis๋ฅผ ์ง์ ‘ ์ปจํ…Œ์ด๋„ˆ๋กœ ์šด์˜ํ•˜๊ธฐ๋ณด๋‹ค, RDS์™€ ElastiCache ๊ฐ™์€ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

7. ๋งˆ์น˜๋ฉฐ

Docker๋Š” ์•ฑ์„ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง•ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ์ˆ ์ด๊ณ , AWS๋Š” ๊ทธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ์ธํ”„๋ผ๋‹ค. ๋‘˜์€ ๊ฒฝ์Ÿ ๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์กฐํ•ฉ์ด๋‹ค.

์ •๋ฆฌํ•˜๋ฉด
  • Docker๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํ†ต์งธ๋กœ ํŒจํ‚ค์ง•ํ•œ๋‹ค
  • AWS๋Š” ์„œ๋ฒ„์™€ ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค
  • Spring Boot + Docker + AWS ์กฐํ•ฉ์€ ์‹ค๋ฌด์—์„œ๋„ ๋งค์šฐ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค
  • ๋‹ค์Œ ๋‹จ๊ณ„๋กœ๋Š” GitHub Actions๋ฅผ ์ด์šฉํ•œ CI/CD ์ž๋™ ๋ฐฐํฌ๊นŒ์ง€ ๊ณต๋ถ€ํ•ด๋ณด๋ฉด ์ข‹๋‹ค.
728x90

'๐ŸŒ CS & Infra > Infrastructure' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Docker  (0) 2026.03.10