개발 무지렁이

[Docker] 레이어 기반 아키텍처 구조를 가진 이미지와 빌드 최적화 본문

카테고리 없음

[Docker] 레이어 기반 아키텍처 구조를 가진 이미지와 빌드 최적화

Gaejirang-e 2023. 11. 5. 16:45

𐂂 이미지에 변경사항이 생기면 이를 반영하기 위해, 이미지다시 빌드해야한다.
⚠️ 컨테이너를 다시 시작하더라도 변경사항은 반영되지 않는다.(이미지다시 빌드해야 한다.)

이미지당시의 소스코드를 정확히 복사해서 스냅샷을 만든 것이다.
따라서 그 이후의 소스코드 변경사항은, 이미지의 소스코드에 포함되지 않는다.
즉, 이미지기본적으로 잠겨있고, 이미지의 모든 것이 읽기 전용이다.
(⚠️ 이미지컨테이너블루프린트이자, 결국 닫힌 템플릿이다)

𐁍 이미지레이어(Layer) 기반 아키텍처 구조를 가진다.
Dockerfile에 지정한 모든 명령레이어를 나타낸다.
⚠️ 최종명령 이전의 모든 명령은 이미 이미지의 일부이자 별도의 레이어이다.
⚠️ 컨테이너이미지 위에 추가된 얇은 레이어일 뿐이다.
⚠️ 컨테이너이미지저장된 환경을 사용하고, 그 위에 부가 레이어추가한다.

이미지를 기반으로 컨테이너실행하면, 명령마다 새로운 레이어를 추가하고 이러한 레이어캐시된다.**
만일, 아무것도 변경하지 않은 채 재빌드하면, 이미지를 구성하는 모든 레이어캐시해서 사용할 수 있다.

⚠️ 조금이라도 변경하고 재빌드하면 시간이 걸리는데, 이는 캐시의 일부 결과만을 사용하기 때문
(도커복사해야할 파일을 스캔하고, 조금이라도 파일 변경사항이 감지되면, 그 이후의 모든 파일을 다시 복사한다.**)
(하나의 레이어가 변경될 때마다, 그 이후의 모든 후속 레이어다시 빌드된다.)

𖠃 변경된 소스코드가 프로젝트 종속성에 영향을 주지 않는 코드일 때, 최적화할 수 있는 부분이 생긴다.

📜 최적화하기 전 Dockerfile

  FROM node

  WORKDIR /app

  COPY . /app #소스코드 복사하는 명령

  RUN npm install # 종속성 설치

  EXPOSE 80

  CMD ["node", "server.js"]
🦉 이렇게 하면 소스코드를 변경할 때마다,
이 레이어부터 캐시된 결과를 이용하지 못하기 때문에,
종속성다시 설치해야 한다.

📜 최적화한 Dockerfile

  FROM node

  WORKDIR /app

  COPY package.json /app

  RUN npm install

  COPY . /app

  EXPOSE 80

  CMD ["node", "server.js"]
🦉 이렇게 바꾸면, 도커package.json 파일이 변경되지 않았음을 확인했기 때문에
캐시된 결과를 이용하고 종속성 설치를 다시 실행하지 않는다.

소스코드가 변경되었을 때,
종속성에 영향을 미치는 코드면, package.json 파일의 변경사항을 감지하고, 종속성 설치다시 실행하게 되고
종속성에 영향을 미치지 않는 코드면, package.json 파일의 캐시된 결과를 이용하고,
종속성 설치를 다시 실행하지 않으며, 여기서 빌드 속도를 높일 수 있다.
(소스코드를 변경할 때마다 RUN npm install 레이어무효화되지 않는다.)

package.json
: 프로젝트의 종속성 관리
Comments