https://docs.docker.com/get-started/09_image_best/
Image-building best practices
Tips for building images for your application
docs.docker.com
이미지 레이어링
1. 다음의 명령어를 사용하여 레이어를 생성하는데 사용된 명령어를 볼 수 있다.
$ docker image history getting-started
다음과 같은 출력이 표시된다.
IMAGE CREATED CREATED BY SIZE COMMENT
a78a40cbf866 18 seconds ago /bin/sh -c #(nop) CMD ["node" "src/index.j⦠0B
f1d1808565d6 19 seconds ago /bin/sh -c yarn install --production 85.4MB
a2c054d14948 36 seconds ago /bin/sh -c #(nop) COPY dir:5dc710ad87c789593⦠198kB
9577ae713121 37 seconds ago /bin/sh -c #(nop) WORKDIR /app 0B
b95baba1cfdb 13 days ago /bin/sh -c #(nop) CMD ["node"] 0B
<missing> 13 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry⦠0B
<missing> 13 days ago /bin/sh -c #(nop) COPY file:238737301d473041⦠116B
<missing> 13 days ago /bin/sh -c apk add --no-cache --virtual .bui⦠5.35MB
<missing> 13 days ago /bin/sh -c #(nop) ENV YARN_VERSION=1.21.1 0B
<missing> 13 days ago /bin/sh -c addgroup -g 1000 node && addu⦠74.3MB
<missing> 13 days ago /bin/sh -c #(nop) ENV NODE_VERSION=12.14.1 0B
<missing> 13 days ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 13 days ago /bin/sh -c #(nop) ADD file:e69d441d729412d24⦠5.59MB
2. --no-trunc 플래그를 추가하여, 전체출력 확인
$ docker image history --no-trunc getting-started
레이어 캐싱
Docker 레이어 캐싱은 Docker 이미지 빌드 과정에서 발생하는 기능으로, 이미지 빌드 시 이전 단계의 결과를 캐시하여 동일한 명령을 다시 실행하지 않고 이전에 실행된 명령의 결과를 재 사용하는 것을 말한다.
Docker 이미지는 여러 레이어로 구성되어 있으며, 각 명령어마다 새로운 레이어가 생성이된다. 예를 들어, Dockerfile 에서 RUN, COPY, ADD 등의 명령을 사용하여 이미지를 빌드하면 각 명령은 새로운 레이어를 생성하게 된다.
레이어 캐싱은 이미지 빌드 중에 동일 명령이 이미 한 번 실행되었다면, 해당 결과를 캐시로 저장하고, 동일한 명령이 다시 실행되면 캐시된 결과를 사용하여 새로운 레이어를 만드는 대신에 이전 결과를 재사용한다. 이를 통해 빌드 속도를 향샹 시키고 이미지 생성 시간을 단축시킬 수 있다.
장점
1. 동일한 명령이 반복되는 경우 캐싱을 통해 이미지 빌드 속도가 향상 된다.
2. 변경되지 않은 부분은 재빌드하지 않고 캐시된 레이어를 사용하여 효율적인 이미지 생성이 가능하다.
3. Dockerfile 에서 적절한 순서로 명령을 작성하여 레이어 캐싱을 최대한 활용할 수 있다.
주의점
1. 적절한 캐싱 전략을 선택하고 명령어를 순서대로 작성해야한다. 변하는 부분과 안정적인 부분을 분리하여 캐시 이점을 최대화해야 한다.
2. 가끔 변경되는 부분이 있을 경우, 해당 부분 이후의 캐시가 무효화될 수 있으므로 이를 고려하여 빌드를 수행해야 한다.
정리
Docker 레이어 캐싱은 이미지 빌드 과정에서 동일한 명령을 반복실행하지 않고 이전에 실행된 명령의 결과를 재사용하여 이미지 빌드를 최적화하는 기능이다. 이는 빌드 시간을 단축시키고 이미지 생성 성능을 향상시키는데 도움을 준다.
1. Dockerfile 수정.
# ASIS
# syntax=docker/dockerfile:1
# FROM node:18-alpine
# WORKDIR /app
# COPY . .
# RUN yarn install --production
# CMD ["node", "src/index.js"]
# EXPOSE 3000
# TO-BE 레이어 캐싱 적용
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
2. .dockerignore 파일 생성 후, 아래내용 추가
node_modules
3. docker build 명령어 실행(이미지 캐싱은 이미 빌드가 된 레이어가 존재하고, 소스 코드를 수정하고 재빌드할때 사용 시,변경되지 않은 부분은 이전에 생성된 캐시된 레이어를 그대로 사용하고, 변경된 부분부터 다시 빌드를 시작한다)
$ docker build -t getting-started .
다음과 같은 출력이 표시된다.
[+] Building 16.1s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 175B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/node:18-alpine
=> [internal] load build context
=> => transferring context: 53.37MB
=> [1/5] FROM docker.io/library/node:18-alpine
=> CACHED [2/5] WORKDIR /app
=> [3/5] COPY package.json yarn.lock ./
=> [4/5] RUN yarn install --production
=> [5/5] COPY . .
=> exporting to image
=> => exporting layers
=> => writing image sha256:d6f819013566c54c50124ed94d5e66c452325327217f4f04399b45f94e37d25
=> => naming to docker.io/library/getting-started
4. src/static/index.html, <title> 텍스트 변경 진행
5. Docker 이미지 재 빌드, 이번에는 출력이 약간 다르게 보일 것 이다.
[+] Building 1.2s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 37B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/node:18-alpine
=> [internal] load build context
=> => transferring context: 450.43kB
=> [1/5] FROM docker.io/library/node:18-alpine
=> CACHED [2/5] WORKDIR /app
=> CACHED [3/5] COPY package.json yarn.lock ./
=> CACHED [4/5] RUN yarn install --production
=> [5/5] COPY . .
=> exporting to image
=> => exporting layers
=> => writing image sha256:91790c87bcb096a83c2bd4eb512bc8b134c757cda0bdee4038187f98148e2eda
=> => naming to docker.io/library/getting-started
우선 빌드가 훨씬 빨라졌다는 점을 알아야 하며, 여러 단계에서 이전에 캐시된 레이어를 사용하고 있는 것을 볼 수 있다.
'Docker > docs' 카테고리의 다른 글
[Docker][docs] 08. Use Docker Compose (1) | 2023.12.27 |
---|---|
[Docker][docs] 07. 다중 컨테이너 앱 (2) | 2023.12.08 |
[Docker] [docs] 06. 바인드 마운트 사용 (0) | 2023.12.05 |
[Docker] [docs] 05. DB 유지 (볼륨) (0) | 2023.12.05 |
[Docker] [docs] 04. 애플리케이션 공유, Docker Hub (0) | 2023.12.04 |