Explanation
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "./src/index.js"]
Docker
복사
새 이미지를 만들기 위해 docker build 명령어를 실행하면, Docker는 명시된 순서대로 각 지침(instruction)을 수행하며 레이어를 생성하며 Dockerfile 내의 각 명령어들을 실행함. 각 지침(instruction)에 대해, Docker는 이전 빌드로부터 해당 지침을 재사용할 수 있는 지 확인함. 만약 Docker가 이미 비슷한 지침을 수행했다는 것을 발견하면, Docker는 다시 명령을 수행하지 않고 캐시된 결과를 사용함. 해당 방법을 통해 시간과 자원을 절약하며 빌드 프로세스를 더 빠르고 효율적으로 수행 가능
빌드 캐시는 이전 빌드를 재사용하고 불필요한 작업은 건너뜀으로써 효과적으로 더 빠른 빌드를 가능하게 함. 캐시 사용을 극대화하고 자원 집약적이며 시간 절약이 가능한 재빌드를 수행하려면, 캐시를 무력화하는 작업들에 대해서 파악하는 것 또한 중요함.
다음은 캐싱을 무력화하는 예시 :
•
RUN 지침에 대한 어떠한 변화는 해당 레이어를 무력화시킴. Docker는 RUN 명령에 대해 변화가 있는지 감지하고 확인하면서, 만약 어떠한 변화가 있으면 캐시를 무력화함
•
COPY 또는 ADD 지침에서 이미지에 복사하는 파일들에 대한 어떠한 변화가 있으면 무력화됨. Docker는 계속 프로젝트 디렉토리 내의 파일들의 변화를 감시함. 만약 내용이나 속성의 변화가 있으면, 빌드 캐싱 무력화의 트리거로서 작동됨
•
한 레이어가 무력화되면, 다른 모든 레이어들도 무력화됨. 이는 이전(base image 같은) 레이어 및 이후의 레이어들 모두 해당. Docker는 빌드 프로세스를 동기화시키며 불연속성을 방지함
Try it out
Node.js application을 이용해 어떻게 Docker build cache를 효과적으로 사용하는지 살펴봄
Build the application
1.
Docker Desktop 설치
2.
터미널을 열고 를 clone해옴
git clone https://github.com/dockersamples/todo-list-app
Bash
복사
3.
todo-list-app 디렉토리로 이동
cd todo-list-app
Bash
복사
해당 디렉토리에서, 다음 내용을 포함한 Dockerfile을 볼 수 있음 :
cd : change directory
ls : list
cat : 파일 내용 확인
4.
도커 이미지를 빌드하기 위해 다음 명령어 입력
docker build .
Bash
복사
아무래도 이전 내용들을 따라하다보니, 캐싱이 되어있음을 볼 수 있음(CACHED)
추가) 캐싱 다 날려보기
5.
변화없이 재빌드
docker build .
Bash
복사
윗 사진과 같이 나옴을 확인 가능
초기화 이후 빌드들은 캐싱 메커니즘에 의해 명령이나 내용이 변하지 않으면 더 빨리 이뤄짐. 도커는 빌드 프로세스 동안 중간 레이어들을 캐싱함. 도커 파일이나 소스코드의 변화없이 이미지를 재빌드하면, 도커는 캐시된 레이어를 재사용함으로써 빠른 속도로 빌드 프로세스를 끝냄
설치 의존성과 같은 시간 소모성 작업들은 재사용함으로써 빌드 속도를 끌어올림
docker image history 출력 내용을 확인해보면, 도커 파일 내 각 명령은 이미지 내 새 레이어가 된다는 것을 확인 가능. 우리는 만약 이미지에 변화를 주면, yarn dependency들은 재설치되어야함을 배웠음. 이는 같은 의존성을 매 빌드마다 재설치해야한다는 말. 즉, 이해할 수 없음(낭비니까)
이를 해결하려면, 도커 파일을 고쳐 무력화가 필요한 경우 이전까진 계속해서 유효할 수 있도록 의존성을 캐싱해야함. Node기반의 앱은, 의존성들은 package.json 파일에 정의됨. 만약 파일에 변화가 있다면 재설치하되, 변화가 없는 경우엔 캐싱된 의존성을 이용해야함. 해당 파일을 우선 복사하는 것을 시작으로, 의존성들을 설치하고, 나머지들을 복사해야함. 그러면, package.json 파일에 변화가 있는 경우에만 yarn 의존성을 재생성하면 됨
6.
package.json 파일을 먼저 복사할 수 있도록 Dockerfile을 바꾸기. 의존성들을 설치하고, 다른 것들을 복사 :
FROM node:20-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
Docker
복사
먼저 package.json 파일을 복사하도록 추가 : yarn install이 수행되기 전, 미리 파일 복사
7.
Dockerfile과 동일한 폴더 위치에 .dockerignore 파일을 만들어서 다음 내용을 추가 :
node_modules
Plain Text
복사
8.
새 이미지를 빌드 :
docker build .
Bash
복사
6,7,8번 내용 수행 : 도커 파일을 변경했기에, 10초 정도 걸리는 것을 확인 가능
9.
이제 src/static/index.html 파일을 변경(타이틀을 "The Awesome Todo App”로 변경한다던지)
10.
도커 이미지를 다시 빌드. 이번엔, 출력 결과가 좀 다르다는 것을 확인 가능 :
docker build -t node-app:3.0 .
Bash
복사
tag : 3.0
repository : node-app
파일 변경에도 불과하고 빌드 시간이 더욱 짧아짐 : yarn 의존성 설치를 캐싱했기 때문
다음과 같이 node-app 저장소에 3.0 태그로 이미지 생성됨
이러한 최적화 기법을 통해, 향상된 개발 생산성과 더 빠른 반복 사이클을 형성하여 Docker 빌드를 더 빠르고 효과적으로 만듦.
Next step
이제 Multi-stage builds를 학습할 차례!








