본문 바로가기

Program

Docker 이미지 빌드 빠르게 하는 방법 (10분 걸리던게 1분에 완료!)

반응형

🚀 Docker 이미지 빌드를 더 빠르게!

Build Cache 완벽 이해와 실전 활용법


✅ Build Cache란 무엇인가?

Docker에서 이미지를 빌드할 때, 같은 명령이 반복되면 이전 결과를 재활용해 속도를 높일 수 있도록 해주는 것이 **Build Cache(빌드 캐시)**입니다.

즉, Docker는 과거에 실행했던 RUN, COPY, ADD, ENV 등의 명령 결과를 기억하고, 동일한 명령이 나오면 다시 실행하지 않고 캐시된 결과를 재사용합니다.

📌 캐시를 잘 활용하면 빌드 속도는 수배 빨라지고, 네트워크 트래픽과 디스크 사용량도 감소합니다.


🔁 Docker Build Cache 작동 방식

Docker는 Dockerfile을 위에서 아래로 순차적으로 해석하며, 각 단계별로 캐시 여부를 판단합니다.
아래 조건이 모두 만족되면 해당 단계는 캐시를 사용합니다:

  1. 명령어가 정확히 동일해야 함 (RUN apt-get update vs RUN apt-get install → 다름)
  2. 의존된 파일이 변경되지 않아야 함 (COPY, ADD 명령의 파일)
  3. 이전 단계까지 모두 캐시를 사용해야 함

🚨 중간에 하나라도 캐시가 깨지면 그 이후 단계는 전부 다시 실행됨


🔧 예제: Build Cache 적용 전후 비교

Dockerfile 예시:

Dockerfile
복사편집
FROM node:20 WORKDIR /app COPY package.json ./ RUN npm install COPY . . CMD ["node", "app.js"]

🧪 첫 빌드:

bash
복사편집
docker build -t my-app .

👉 모든 단계가 새롭게 실행되므로 시간이 오래 걸림

🧪 두 번째 빌드 (파일 변경 없음):

bash
복사편집
docker build -t my-app .

👉 대부분의 단계가 [CACHED] 로 표시되며 즉시 완료됨!


📂 캐시 확인 방법

Docker는 각 단계별로 캐시 여부를 로그에 표시합니다:

text
복사편집
=> [2/5] COPY package.json ./ 0.0s => [3/5] RUN npm install 5.6s => [4/5] COPY . . 0.1s

위처럼 시간이 거의 들지 않았다면 캐시가 잘 활용된 것입니다.
--no-cache 옵션을 붙이면 강제로 모든 캐시를 무시할 수 있습니다:

bash
복사편집
docker build --no-cache -t my-app .

🎯 Build Cache 최적화 전략

전략설명
COPY 최소화 먼저 package.json만 복사하여 npm 캐시 유지
의존 설치 → 코드 복사 RUN npm install 전까지 캐시를 최대한 유지
.dockerignore 적극 활용 불필요한 파일 캐시에 포함되지 않도록 제외
 

📌 예: COPY . . 전에 COPY package.json만 분리하는 이유

COPY . .로 먼저 전체 파일을 복사하면 작은 코드 수정에도 npm install 캐시가 깨짐
필요한 파일만 단계적으로 복사해야 캐시 효율 극대화 가능


🧠 실전 팁

  1. 개발 중에는 캐시 사용
    • 반복 빌드 시 속도 개선 효과 큼
  2. 운영 빌드 시에는 --no-cache로 강제 재빌드 추천
    • 오래된 캐시가 문제를 일으킬 수 있으므로 주기적 클린 빌드 필요
  3. CI/CD 파이프라인에서 캐시 전략을 명확히 정의
    • GitHub Actions, GitLab CI 등에서도 캐시 디렉토리를 재활용 가능

✅ 결론

Docker Build Cache는 단순한 "속도 향상" 그 이상의 의미를 가집니다.
프로젝트 구조 설계, 파일 복사 순서, 빌드 자동화까지 영향을 미치는 요소로, 특히 빌드 시간이 중요한 CI 환경에서는 반드시 고려해야 할 핵심 기술입니다.

Dockerfile을 깔끔하게 구성하고, 캐시가 최대한 활용되도록 명령어 순서를 고민하는 것이 프로 개발자의 첫걸음입니다.

 

 

Docker 컨테이너와 로컬 파일 공유하는 법

 

Docker 컨테이너와 로컬 파일 공유하는 법

📂 Docker 컨테이너와 로컬 파일 공유하는 법Bind Mount를 활용한 로컬 파일 연동 완벽 가이드✅ 왜 로컬 파일을 컨테이너와 공유해야 할까?Docker는 컨테이너 내부에서 코드, 설정 파일, 환경 변수를

jjig810906.tistory.com

 

반응형