도커는 이미지를 빌드할 때마다 모든 명령 결과를 캐시하고 다시 빌드할 때 명령을 실행할 필요가 없으면 캐시된 결과를 사용한다.

이것을 레이어 기반 아키텍처라고 한다.

모든 명령은 도커파일의 레이어를 나타낸다

이미지는 읽기 전용이라 빌드 되면은 다시 빌드하지 않는 한 코드를 변경할 수 없다.

모든 명령어를 기반으로 하는 이미지 레이어는 레이어를 생성하고 캐시된다.

컨테이너를 실행하면 도커파일의 명령을 실행한 결과로 코드를 실행 중인 이미지 위에 새로운 레이어를 추가한다.

이미지를 레이어로 실행할 때만 활성화되는 최종 레이어가 추가되는 것.

하나의 레이어가 변경될 때마다 다른 모든 레이어가 다시 빌드된다.

예를 들어

FROM node

WORKDIR /app

RUN npm install

COPY . /app

EXPOSE 80

CMD ["node", "server.js"]

위와 같은 도커파일이 있다고 가정하자.

npm install 후 /app 폴더에 소스 코드를 복사하고 있다.

만약 소스 코드의 변경이 있을 경우 계속해서 npm install을 해야하는 상황이다.

레이어는 캐시된다고 했으니, npm install을 계속 하지 않도록 만들면 간단한 최적화가 가능하다.

FROM node

WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app

EXPOSE 80

CMD ["node", "server.js"]

COPY package.json /app 코드를 추가해서 app 폴더에 package.json도 복사를 하면 계속 npm install을 할 필요가 없어진다.

이렇게하면 소스 코드 복사 전 npm install 레이어가 오게 되는 것이다.