도커는 캐시에 일치하는 레이어가 있는지 확인하기 위해 해시값을 이용한다. 해시는 입력값이 같은지 확인할 수 있는 일종의 디지털 지문이다. 해시값은 Dockerfile 스크립트의 인스트럭션과 인스트럭션에 의해 복사되는 파일의 내용으로부터 계산되는데, 기존 이미지 레이어에 해시값이 일치하는 것이 없다면 캐시 미스가 발생하고 해당 인스트럭션이 실행된다. 한번 인스트럭션이 실행되면 그다음에 오는 인스트럭션은 수정된 것이 없더라도 모두 실행된다.
우리가 만들었던 자그마한 이미지도 이에 영향을 받을 수 있다. 지난 번 이미지 빌드 이후 app.js 파일이 수정됐으므로 6단계의 COPY 인스트럭션은 실제로 실행이 될 것이다. 7단계에 있는 CMD 인스트럭션은 변경된 것이 없지만 6단계 인스트럭션이 실행됐으므로 함께 실행된다.
이러한 연유로 Dockerfile 스크립트의 인스트럭션은 잘 수정하지 않는 인스트럭션이 앞으로 오고 자주 수정되는 인스트럭션이 뒤에 오도록 배치돼야 한다. 이렇게 해야 캐시에 저장된 이미지 레이어를 되도록 많이 재사용할 수 있다. 이미지를 공유하는 과정에서 시간은 물론이고 디스크 용량, 네트워크 대역폭을 모두 절약할 수 있는 방법이다.
▲ 그림 3-11 캐싱된 레이어를 사용하는 이미지 빌드