๊ฐœ๋ฐœ์ผ์ง€

[๋„์ปค] ๋„์ปค์˜ ๋ ˆ์ด์–ด, ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ ๋ž€? ๋ณธ๋ฌธ

Backend๐Ÿงฑ/์ธํ”„๋ผ

[๋„์ปค] ๋„์ปค์˜ ๋ ˆ์ด์–ด, ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ ๋ž€?

doublejune 2025. 4. 25. 16:35

 

์šฐ์„  ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ž€,

 

1. ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ

Docker์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ตœ์ข… ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ๋นŒ๋“œ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด์„œ ์ตœ์ข… ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.

 

์ตœ์ข… ์ด๋ฏธ์ง€์—๋Š” ์•ฑ ์‹คํ–‰์— ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ๋งŒ ์žˆ์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

 

์ด ์‚ฌ์ง„์ด ๊ฐœ๋…์„ ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

 

๋„์ปค๋Š” ๊ฐ ๋ช…๋ น์–ด(FROM, COPY, RUN ๋“ฑ)๋งˆ๋‹ค ๋ ˆ์ด์–ด๋กœ ์‹คํ–‰๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  FROM ๋ช…๋ น์–ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Šคํ…Œ์ด์ง€๊ฐ€ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

 

์Šคํ…Œ์ด์ง€
: ํ•˜๋‚˜์˜ ๋…๋ฆฝ๋œ ์ด๋ฏธ์ง€ ํ™˜๊ฒฝ.

 

๋„์ปคํŒŒ์ผ์•ˆ์— FROM ๋ช…๋ น์–ด๊ฐ€ 3๊ฐœ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด,

๋งˆ์ง€๋ง‰ FROM ๋ช…๋ น์–ด๊ฐ€ ํฌํ•จ๋œ ์Šคํ…Œ์ด์ง€๊ฐ€ ์ตœ์ข… ์ด๋ฏธ์ง€๊ฐ€ ๋œ๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด,

 

#1.๋นŒ๋“œ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jdk-alpine AS builder
WORKDIR /back
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
RUN ./gradlew dependencies --no-daemon

COPY src src
RUN ./gradlew clean bootJar --no-daemon

#2.JAR ๋ ˆ์ด์–ด ์ถ”์ถœ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jre-alpine AS extractor
WORKDIR /back
COPY --from=builder /back/build/libs/weddy-0.0.1-SNAPSHOT.jar weddy.jar
RUN java -Djarmode=layertools -jar weddy.jar extract

#3.์‹คํ–‰ ๋‹จ๊ณ„
FROM eclipse-temurin:21-jre-alpine
WORKDIR /back
COPY --from=extractor /back/dependencies/ ./
COPY --from=extractor /back/spring-boot-loader/ ./
COPY --from=extractor /back/snapshot-dependencies/ ./
COPY --from=extractor /back/application/ ./
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„์„ ์„ ์–ธ
EXPOSE 8080
# ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋  ๊ณ ์ • ๋ช…๋ น์–ด
ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "org.springframework.boot.loader.launch.JarLauncher"]

 

์œ„์˜ ์ฝ”๋“œ์—์„œ

1๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€์™€ 2๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€์˜ ๊ฒฐ๊ณผ๋ฌผ๋“ค(jarํŒŒ์ผ๋“ค)์„ ์Šคํ…Œ์ด์ง€ 3์—์„œ ์‚ฌ์šฉํ•ด ์ตœ์ข… ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.

1๋ฒˆ์งธ, 2๋ฒˆ์งธ ์Šคํ…Œ์ด์ง€์—์„œ ์ƒ๊ธฐ๋Š” ๋ถ€์‚ฐ๋ฌผ(weddy.jar ํŒŒ์ผ)์ด ์ตœ์ข… ์ด๋ฏธ์ง€์—์„œ๋Š” ํ•„์š” ์—†๋‹ค.

 

์ด๋ฅผ ํ†ตํ•ด,

 

- ์ด๋ฏธ์ง€์˜ ๊ฒฝ๋Ÿ‰ํ™”

- ๋น„์šฉ ์ ˆ๊ฐ: ํฌ๊ธฐ ์ถ•์†Œ๋กœ ์ธํ•ด ์šด์˜ ๋น„์šฉ ๊ฐ์†Œ.

- ๋ณด์•ˆ ๊ฐ•ํ™” : ๋ถˆํ•„์š”ํ•œ ์ข…์†์„ฑ, ๋ถ€์‚ฐ๋ฌผ์ด ์ œ๊ฑฐ๋˜์–ด ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฐ์†Œ.

 

์˜ ์žฅ์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

 


2. ๋ ˆ์ด์–ด

Docker ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ด ์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค.

 

์ด ๋ ˆ์ด์–ด๋Š” ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ์ด๋ฏธ์ง€์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ(์ถ”๊ฐ€, ์‚ญ์ œ ๋“ฑ)์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค.

 

 

๋ ˆ์ด์–ด๋Š”

 

- ๋ถˆ๋ณ€์„ฑ : ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ ๋ ˆ์ด์–ด๋Š” ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†๋‹ค. ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ๋‹ค์‹œ ์ƒ์„ฑ๋œ๋‹ค.

- ์บ์‹ฑ: Docker๋Š” ๋ ˆ์ด์–ด๋ฅผ ์บ์‹ฑํ•˜์—ฌ ์ด๋ฏธ ๋นŒ๋“œ๋œ ๋ ˆ์ด์–ด๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

- ๊ณต์œ ์„ฑ: ๋™์ผํ•œ ๋ ˆ์ด์–ด๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ๊ฐ„์— ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

 

 

์ฐธ๊ณ 

- https://hanyunseong-log.dev/post/what-is-docker-multi-stage-build

 

hanyunseong-log

hanyunseong-log

hanyunseong-log.dev

-https://velog.io/@khjgmdwns/Docker-%EB%8F%84%EC%BB%A4%EC%9D%98-%EB%A0%88%EC%9D%B4%EC%96%B4Layer-%EB%9E%80