정구리의 우주정복

[Docker] 6. image layer에 대한 이해 (Dockerfile 최적화) 본문

STUDY/DOCKER

[Docker] 6. image layer에 대한 이해 (Dockerfile 최적화)

Jungry_ 2023. 10. 16. 21:18
반응형

https://j-ungry.tistory.com/371

 

[Docker] 5. 대화형 셸 말고 내 코드를 실행하는 방법 (Dockerfile 작성 방법)

이전 게시글 https://j-ungry.tistory.com/370 [Docker] 4. 컨테이너를 만드는 이미지를 가져오는 두가지 방법 중 첫번째 (Docker hub 사용하기) 컨테이너는 이미지를 베이스로 한다 이미지를 만드는데에는 두

j-ungry.tistory.com

저번 게시글에서 Dockerfile 을 만들어봤다 정말 놀라워

 

폴더구조

 

저번에 만들었던 Dockerfile 을 사용해서 똑같은 이미지를 또 생성한다면 어떻게 될 까 ?

CACHED에 주목해보자

build 하는데에 0.0 초 밖에 걸리지 않았다 그리고 자세히 살펴보면 명령어들이 cached 라고 되어있는 것을 확인할 수 있다 !

Docker 는 Layer 구조로 된 Layer based architecture 이다 !

층층 구조로 되었다고 생각하면 된다 Dockerfile 의 한 명령어들이 한 층을 나타낸다 !!!

 

 

그래서 만약 동일한 동작을 하게 될 명령어라면 캐싱해두었다가 빠르게 실행하는 것이다 

만약 소스코드를 수정하고 이미지를 build 한다면 어떻게 될까 ??

 

기존
변경

아주 조금 바꿔보았다 (server.js)

명령어를 실행해보면 이번엔 2.3 초가 걸리고 COPY 와 RUN 은 캐싱되지 않은 것을 확인할 수 있다 

소스코드가 변경되었기 때문에 이전에 COPY 를 캐싱 해놓은 것을 사용할 수 없어 새로 COPY 를 하고

package.json 도 새로 COPY가 되어 , npm 을 다시 install 하게 되어서 시간이 오래걸리게 되었다

npm 은 install 하는 것이기 때문에 아무래도 시간이 좀 오래 걸린다 

그렇다면 여기서 최적화를 할 포인트가 보인다 !

 

# FROM : 다른 기본 이미지에 이미지를 구축 할  수  있게 해준다
FROM node
 
WORKDIR /app

COPY package.json /app

RUN npm install

# In my own image, I wanna start by pulling in node image
# tell which local file is going to image
COPY . /app

EXPOSE 80

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

Dockerfile 을 이렇게 변경하면 어떨까 ?? 

package.json 을 미리 /app 에 복사하고 npm install 을 해놓는다 

이후 app 에 복사를 하게된다 

 

이렇게 하면 다시 실행되더라도

package.json 파일에는 변화가 없게된다 !!!

만약 이전처럼 server.js 를 변경하더라도 package.json 에는 영향이 없기 때문에

 

COPY package.json /app

RUN npm install

 

부분은 캐싱을 하게 되고 install 을 매번 하지 않아도 되어 속도가 향상된다 .

 

한번 더 수정

한번더 수정한 뒤 build 를 해보자

Dockerfile 을 변경했기 때문에 다시 build 를 해서 시간이 좀 걸린다 이후 server.js 를 또또 수정하고 

또또또또 수정

다시 build 를 해보면

npm install 을 또 하지 않아서 속도가 매우 향상된 것을 볼수있다 !!!!굿굿 !

반응형
Comments