도커(Docker) 활용(캐시)
오늘 공부한 내용 ✏
도커 캐시의 기본 원리
도커는 이미지를 빌드할 때 각 단계의 결과를 캐싱합니다. 이후 동일한 단계를 재 실행할 때 캐시된 결과를 재사용함으로써 빌드 시간을 크게 단축합니다.
- 레이어 캐싱: 도커는 이미지를 여러 레이어로 분할하여 관리합니다. 각 레이어는 변경되지 않으면 재 사용됩니다.
- 캐시 무효화:
Dockerfile
의 한 단계가 변경되면, 해당 단계와 그 이후의 모든 단계는 재 빌드 됩니다. - 최적화된 빌드: 자주 변경되는 레이어를
Dockerfile
의 하단에 배치하여 캐시 효율을 극대화할 수 있습니다.
캐시 활용을 위한 전략
- 자주 변경되지 않는 명령어 우선:
RUN
,COPY
,ADD
와 같은 명령어는 빌드 컨텍스트에 따라 자주 변경될 수 있습니다. 이러한 명령어는 가능한 한 빈번히 변경되지 않는 내용을 담도록 구성해야 합니다. - 멀티 스테이지 빌드: 멀티 스테이지 빌드를 사용하면 필요한 파일만 최종 이미지로 복사하여 불필요한 파일의 캐싱을 방지할 수 있습니다.
- 캐시 무효화 최소화:
Dockerfile
내의 명령어 순서를 최적화하여 캐시 무효화를 최소화합니다. 자주 변경되는 레이어를 가능한 마지막에 배치합니다.
캐시 문제 해결
캐시 관련 문제를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다:
- 캐시 무시 옵션 사용:
docker build --no-cache
옵션을 사용하여 모든 캐시를 무시하고 빌드를 진행할 수 있습니다. - 레이어 사이즈 최적화: 불필요한 파일을 제거하거나, 중간 레이어에서의 파일 다운로드를 피함으로써 이미지 레이어의 크기를 최적화합니다.
예제: Node.js 애플리케이션의 Docker 이미지 빌드
- 기본 Dockerfile 구조
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]
- 레이어 별 캐싱
- Base Image (
FROM node:14
): 이 단계에서 사용되는 베이스 이미지는 캐시되며, 이후 빌드에서 재사용됩니다. - Working Directory 설정 (
WORKDIR /app
): 이 명령어는 디렉토리를 설정하며, 변경되지 않으면 재사용됩니다. - 의존성 파일 복사 (
COPY package*.json ./
):package.json
이 변경되지 않는 한, 이 단계의 결과는 캐시되어 재사용됩니다. - 의존성 설치 (
RUN npm install
):package.json
이 변경되지 않으면, 이 단계는 캐시된 상태로 유지됩니다.package.json
이 변경되면, 이 단계와 이후의 모든 단계는 재빌드됩니다. - 애플리케이션 코드 복사 (
COPY . .
): 애플리케이션의 소스 코드가 변경될 때마다 이 단계는 재빌드됩니다. - 애플리케이션 실행 명령 (
CMD ["node", "server.js"]
): 이 명령어는 변경되지 않는 한 캐시됩니다.
어려웠던 내용 ⚔
궁금한내용 / 부족한 내용 🛡
느낀점 🎯
이처럼 도커 캐싱 메커니즘을 이해하고 올바르게 활용하면, 이미지 빌드 시간을 상당히 단축하고, 리소스 사용을 효율적으로 관리할 수 있는것 같다!
오늘 참고한 자료 📚
https://docs.docker.com/get-started/overview/ Doker 공식 문서