이미지를 빌드할 때
캐싱을 어떻게 활용할까?
이미지 빌드 시에 적용되는 캐싱
--
캐싱이란?
시간이 걸리는 작업의 결과물을 미리 저장해 두고
동일한 작업이 발생했을 때 다시 작업을 수행하지 않고 저장해 둔 결과를 빠르게 제공하는 기술로
빌드 속도를 빠르게 만들어주는 기술이다.
위 그림처럼
dockerfile의 지시어들을 사용해서 레이어를 하나씩 추가하게 된다.
이러한 과정에서 각 레이어들은 도커가 캐시로 저장하게 된다.
이후 다시 같은 내용으로 동일한 빌드를 수행하게 되면
즉, 빌드에서 동일한 지시어를 사용하게 되면
이미지 레이어를 새롭게 만드는 것이 아니라
이전에 캐시에 저장되어 있는 이미지 레이어를 그대로 가져와서 사용할 수 있다.
새로 레이어를 만들지 않고 기존에 저장했던 레이어를 가져와서 사용하니
빠르게 이미지를 빌드할 수 있게 된다.
지시어를 똑같이 작성한 경우에만 캐시에 저장되어 있는 레이어를 그대로 사용한다.
다만 지시어만 같다고 무조건 캐시를 사용하는 것은 아니다.
지시어로 처리하는 내용까지도 같아야 한다.
즉, COPY . . 지시어로 동일하게 작성했지만
복사되는 디렉터리들의 내용까지도 동일해야 한다는 것이다.
위 그림은
dockefile의 지시어들은 이전 빌드와 동일하지만
COPY . . 지시어에서 복사되는 소스 코드가 변경된 상태일 때 이미지 빌드하는 그림이다.
레이어가 쌓이는 순서대로
동일한 동작을 하는 지시어는 캐시에서 가져와 사용하지만
동일하지 않는 동작을 하는 지시어는 새로 레이어를 생성하게 된다.
이때 새로운 레이어가 생기게 되면
그 이후의 레이어들도 기존과 달리지기 때문에
새로운 레이어가 생긴 시점부터는 모두 새로 레이어를 생성하게 된다.
그렇기 때문에
캐싱을 활용하기 위해서
개발 시에 거의 변경되지 않는 레이어를 먼저 쌓고
그 뒤에 자주 변경되는 레이어를 쌓아서
캐싱을 최대한 많이 활용하는 방법으로 구성한다.
위 그림에서도 기존에 COPY 지시어로 모든 디렉터리를 복사할 때
해당 디렉터리에서 변경이 자주 발생하지 않는 "package*.json"을 따로 먼저 복사하는 것으로 분리하여
이미지를 빌드하는 방법으로 구현하였다.
그래서 "COPY npm ci" 지시어 즉, 라이브러리를 설치하는 과정까지는 캐싱을 활용할 수 있게 된다.
--
참고 및 출처
'Docker' 카테고리의 다른 글
컨테이너 최적화하기 (컨테이너에 CPU, 메모리 한도 지정) (0) | 2024.07.02 |
---|---|
3Tier 아키텍처 구성 방법 (+Nginx 설정) (0) | 2024.07.01 |
이미지 레이어 관리하기 (0) | 2024.06.29 |
도커 볼륨, 마운트, 바인드 마운트 (+명령어) (0) | 2024.06.28 |
Docker의 가상 네트워크 (+명령어) (0) | 2024.06.27 |