ML/MLOps Engineer
๋„์ปค ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง•

๋„์ปค ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋นŒ๋“œ(Multi-stage Build)๋Š” ํ•˜๋‚˜์˜ Dockerfile ๋‚ด์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜์—ฌ, ์ตœ์ข… ์ด๋ฏธ์ง€์— ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํฌํ•จํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ๋„๊ตฌ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ์ข… ์ด๋ฏธ์ง€์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ, ํšจ์œจ์ ์ด๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „ํ†ต์ ์ธ ๋„์ปค ๋นŒ๋“œ ๋ฐฉ์‹์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ๋‹จ์ผ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ตœ์ข… ์ด๋ฏธ์ง€์— ๋ถˆํ•„์š”ํ•œ ๋นŒ๋“œ ๋„๊ตฌ๋“ค์ด ํฌํ•จ๋˜์–ด ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ  ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ์ •์˜ํ•˜์—ฌ, ๊ฐ ๋‹จ๊ณ„์—์„œ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ์ตœ์ข… ๋‹จ๊ณ„์—์„œ๋Š” ํ•„์š”ํ•œ ์•„ํ‹ฐํŒฉํŠธ(์˜ˆ: ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ, ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ ๋“ฑ)๋งŒ์„ ๊ฐ€์ ธ์™€์„œ ๊ฒฝ๋Ÿ‰์˜ ์ตœ์ข… ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ ํ™˜๊ฒฝ๊ณผ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง•์˜ ํŠน์ง• ๋ฐ ๋ชฉ์ 

  1. ํšจ์œจ์„ฑ
    • ๋นŒ๋“œ์™€ ์‹คํ–‰์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์Šคํ…Œ์ด์ง€๋ฅผ ์ •์˜ํ•˜์—ฌ ๋นŒ๋“œ ์ค‘๊ฐ„์— ์ƒ์„ฑ๋˜๋Š” ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์ด๋‚˜ ์˜์กด์„ฑ์„ ์ตœ์ข… ์ด๋ฏธ์ง€์—์„œ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๊ฐ์†Œ
    • ์ตœ์ข… ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ํฌํ•จํ•˜๋ฏ€๋กœ ์ตœ์ข… ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  3. ๋ณด์•ˆ ๊ฐ•ํ™”
    • ๋นŒ๋“œ ๋„๊ตฌ๋‚˜ ์ค‘๊ฐ„ ๋‹จ๊ณ„์—์„œ ํ•„์š”ํ•œ ํŒŒ์ผ์ด ์ตœ์ข… ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ
    • Dockerfile์ด ๋‹จ๊ณ„๋ณ„๋กœ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜๋ฏ€๋กœ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ตœ์†Œํ™”
    • ์ตœ์ข… ์ด๋ฏธ์ง€์— ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•„ ๋” ์ž‘๊ณ  ๊ฒฝ๋Ÿ‰ํ™”๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: node:20-alpine๊ณผ ๊ฐ™์ด ๊ฒฝ๋Ÿ‰ ์ด๋ฏธ์ง€๋งŒ ํฌํ•จ ๊ฐ€๋Šฅ.
    • ์ตœ์ข… ์ด๋ฏธ์ง€๋Š” ์ตœ์†Œํ•œ์˜ ํŒŒ์ผ๋งŒ ํฌํ•จํ•˜๋ฏ€๋กœ ์ €์žฅ์†Œ ๋ฐ ์ „์†ก ๋น„์šฉ ์ ˆ๊ฐ
    • ๋นŒ๋“œ ํ™˜๊ฒฝ๊ณผ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ œ๊ฑฐ.
  • ๋ณด์•ˆ ๊ฐ•ํ™”
    • ๋นŒ๋“œ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด(์˜ˆ: ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ๋นŒ๋“œ ๋„๊ตฌ ๋“ฑ)๊ฐ€ ์‹คํ–‰ ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜์ง€ ์•Š์Œ.
  • ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ
    • ๋‹จ๊ณ„๋ณ„๋กœ ๋นŒ๋“œ ๊ณผ์ •์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜๋ฏ€๋กœ Dockerfile์ด ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›Œ์ง.
    • ๋นŒ๋“œ์™€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋‹จ๊ณ„๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ.
  • ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ ์ง€์› ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”
    • ๋™์ผํ•œ Dockerfile๋กœ ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋งž๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ ๊ฐ€๋Šฅ.
    • ์ค‘๊ฐ„ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์บ์‹ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋นŒ๋“œ ์†๋„ ํ–ฅ์ƒ.

์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ 

  1. ์บ์‹œ ํ™œ์šฉ
    • ๋นŒ๋“œ ๊ณผ์ •์—์„œ ๋™์ผํ•œ ๋ช…๋ น์–ด ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์บ์‹œ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด์•ผ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  2. ์ตœ์†Œํ™”๋œ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์„ ํƒ
    • ์ตœ์ข… ์Šคํ…Œ์ด์ง€์—์„œ ๋ถˆํ•„์š”ํ•œ ์šฉ๋Ÿ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•ด alpine ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  3. ์ค‘๊ฐ„ ํŒŒ์ผ ์ œ๊ฑฐ
    • ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์ด ์ตœ์ข… ์ด๋ฏธ์ง€๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌ.

๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง• ๋นŒ๋“œ ์˜ˆ์ œ

๋™์ž‘ ๋ฐฉ์‹

  1. ์—ฌ๋Ÿฌ ์Šคํ…Œ์ด์ง€ ์ •์˜
    • FROM ๋ช…๋ น์–ด๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์Šคํ…Œ์ด์ง€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋ณต์‚ฌ(COPY)ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์ตœ์ข… ๋‹จ๊ณ„ ์„ ํƒ
    • ๋งˆ์ง€๋ง‰ ์Šคํ…Œ์ด์ง€์—์„œ ํ•„์š”ํ•œ ์•„ํ‹ฐํŒฉํŠธ(์˜ˆ: ์‹คํ–‰ ํŒŒ์ผ, ์„ค์ • ํŒŒ์ผ)๋งŒ ํฌํ•จํ•˜์—ฌ ์ตœ์ข… ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์ œ

# 1. ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€
FROM golang:1.20 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# 2. ์‹คํ–‰ ์Šคํ…Œ์ด์ง€
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
  • builder ์Šคํ…Œ์ด์ง€:
    • Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ Go ๋Ÿฐํƒ€์ž„๊ณผ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฒฐ๊ณผ๋ฌผ์ธ ์‹คํ–‰ ํŒŒ์ผ(myapp)๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข… ์Šคํ…Œ์ด์ง€:
    • ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ(myapp)๋งŒ ํฌํ•จํ•˜๊ณ , Go ๋Ÿฐํƒ€์ž„์ด๋‚˜ ๋นŒ๋“œ ๋„๊ตฌ๋Š” ์ œ์™ธํ•˜์—ฌ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์ œ

# 1. ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 2. ์‹คํ–‰ ์Šคํ…Œ์ด์ง€
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
  • builder ์Šคํ…Œ์ด์ง€:
    • Node.js์™€ npm์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
    • ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์€ /app/dist ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข… ์Šคํ…Œ์ด์ง€:
    • nginx๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์  ํŒŒ์ผ์„ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค.
    • Node.js์™€ npm์€ ์ตœ์ข… ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์ œ

# 1. ๋นŒ๋“œ ์Šคํ…Œ์ด์ง€
FROM maven:3.9 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package

# 2. ์‹คํ–‰ ์Šคํ…Œ์ด์ง€
FROM openjdk:17
WORKDIR /app
COPY --from=builder /app/target/myapp.jar .
CMD ["java", "-jar", "myapp.jar"]
  • builder ์Šคํ…Œ์ด์ง€:
    • Maven์„ ์‚ฌ์šฉํ•˜์—ฌ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ณ  .jar ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข… ์Šคํ…Œ์ด์ง€:
    • openjdk ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .jar ํŒŒ์ผ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋„์ปค ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์ ์ด๊ณ  ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ์™€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉฐ, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ๊ณผ์ •์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.