블로그/DevOps
DevOps주니어2026-06-11

Docker 레이어 캐싱의 원리와 최적화 전략은?

한 줄 답변

도커는 Dockerfile의 각 명령어를 레이어로 저장하며, 변경이 없는 이전 단계의 레이어를 재사용해 빌드 속도를 높입니다. 캐시 효율을 위해 변동이 적은 의존성 설치를 상단에 배치하는 것이 핵심입니다.

핵심 개념 정리

도커 이미지는 여러 개의 읽기 전용 레이어(Layer)가 쌓인 구조입니다. Dockerfile의 각 명령어(RUN, COPY, ADD 등)가 실행될 때마다 새로운 레이어가 생성됩니다. 빌드 시 도커 엔진은 이전에 생성된 레이어의 체크섬을 확인하여, 명령어가 동일하고 참조하는 파일에 변화가 없다면 해당 레이어를 새로 생성하지 않고 기존 캐시를 재사용하여 시간을 절약합니다.

레이어 캐싱에서 가장 중요한 규칙은 '순차적 의존성'입니다. 특정 단계의 레이어가 변경되면 그 이후의 모든 단계는 캐시가 무효화(Cache Invalidate)되어 새로 빌드됩니다. 예를 들어, 소스 코드를 전체 복사하는 명령어가 패키지 설치 명령어보다 위에 있다면, 코드 한 줄만 수정해도 매번 모든 패키지를 다시 다운로드하게 되어 빌드 효율이 급격히 떨어집니다.

따라서 효율적인 빌드를 위해서는 자주 변하지 않는 레이어를 먼저 정의해야 합니다. 일반적으로 베이스 이미지 설정, 환경 변수 정의, 의존성 파일(package.json, go.mod 등)만 먼저 복사, 의존성 설치 순으로 작성하고, 가장 자주 변경되는 실제 소스 코드 복사 및 빌드 명령은 마지막 단계에 배치하는 것이 정석적인 최적화 방법입니다.

또한, RUN 명령어에서 여러 쉘 명령을 &&로 묶어 레이어 수를 줄이는 것도 중요하지만, 캐시 단위를 고려하여 적절히 나누는 전략도 필요합니다. 최근에는 Multi-stage Build를 활용해 최종 이미지 크기를 줄이면서도 빌드 단계별 캐시를 극대화하는 방식이 널리 사용되며, 이는 배포 파이프라인의 전체적인 성능 향상으로 이어집니다.

비교 정리

항목비최적화 방식최적화 방식
빌드 속도변경 시 모든 단계 재빌드로 매우 느림캐시 재사용으로 변경 부분만 빠르게 빌드
이미지 크기불필요한 레이어와 도구 누적으로 비대함최소한의 레이어와 Multi-stage 활용으로 경량화
네트워크 비용매번 외부 라이브러리 전체를 다시 다운로드캐시된 레이어 활용으로 외부 통신 최소화
유지보수성Dockerfile 구조가 복잡하고 가독성 낮음명확한 단계 분리로 구조 파악이 용이함

면접에서 이렇게 답하세요

단순히 '캐시를 쓴다'고 답하기보다, 'Dockerfile 명령어의 순서가 캐시 히트율에 미치는 영향'을 구체적인 예시(예: package.json만 먼저 COPY 하기)와 함께 설명하세요. 실무에서 빌드 시간을 몇 분에서 몇 초로 단축해본 수치적 경험이나 Multi-stage Build를 적용해 이미지 크기를 줄여본 사례를 언급하면 주니어 이상의 역량을 보여줄 수 있습니다.

자주 묻는 추가 질문

Q. 캐시를 강제로 무효화하고 싶을 때는 어떻게 하나요?

빌드 시 --no-cache 옵션을 사용하거나, Dockerfile 내부에 ARG를 이용해 빌드 시점을 주입함으로써 특정 단계 이후를 새로 빌드할 수 있습니다.

Q. COPY 명령어에서 캐시가 깨지는 기준은 무엇인가요?

복사하려는 파일의 내용과 메타데이터를 포함한 체크섬을 비교합니다. 파일 이름이 같아도 내용이 1바이트라도 다르면 캐시는 즉시 무효화됩니다.

Q. Multi-stage Build가 캐싱에 주는 이점은 무엇인가요?

빌드 환경과 실행 환경을 분리하여 빌드 도구 등 불필요한 레이어를 최종 이미지에서 제외함으로써 보안성과 이미지 크기를 동시에 최적화할 수 있습니다.

커뮤니티 하이라이트

주니어 면접에서 Dockerfile을 보여주고 캐시 병목 지점을 찾는 실기 질문이 자주 나옵니다. 의존성 설치 위치를 꼭 확인하세요!

@infra_wizard32

CI 환경(GitHub Actions 등)에서는 러너가 매번 바뀌므로 캐시를 별도 저장소에 저장하고 불러오는 액션을 설정해야 효과를 봅니다.

@docker_fan19

42명의 개발자가 이 질문에 참여했습니다

관련 면접 질문

앱에서 직접 답변해보세요

매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.

무료로 시작하기