지금까지 도커 이미지를 빌드하는 과정을 겪으며 느끼지 않았는가?
도커 파일을 작성하고 처음 빌드를 실행하면 시간이 엄청 오래 걸린다.
그러다 중간에 이미지 빌드 중 오류가 나거나 도커 이미지에 새로운 사항을 반영하려 새로 빌드를 할 때
처음보다 빠르게 이미지가 빌드되고는 한다.
이것은 도커가 가지는 특성 중 하나인 이미지 레이어링(Docker Image Layering) 이다.
이미지 레이어링이란?
도커 이미지는 통째로 하나가 아닌 여러 레이어로 구성되어 있다.
Dockerfile에서 생각해보면 FROM, COPY, RUN 등 명령어 한 줄씩 있었지 않나?
그 하나의 명령어 한줄이 하나의 레이어가 되어 한 겹씩 쌓이고 최종적으로 하나의 이미지라는 형태로 구성되게 된다.
근데, 이러면 뭐가 좋은지 잘 모를 것이다.
도커 파일에서 Layer C가 바뀐다는 상황을 가정해보자. 이미지를 새로 다시 빌드해야 할 것이다.
A,B는 그대로인데 C가 바뀌었다고 A,B,C를 다시 빌드 한다면
시간과 자원이 많이 소모 될 것이다.
그래서 이것을 각각 레이어를 분리하는 것이다.
그러면 Layer A와 B는 이전에 빌드된 데이터를 그대로 사용하고, Layer C에 대한 것만 새로 빌드해서 합친다면
훨씬 더 빠르게 이미지를 빌드 시킬 수 있다.
하지만, 도커파일에서의 이미지 레이어링도 주의할 점이 있다.
이번엔 도커 파일을 통해 설명하겠다. 아래와 같은 도커 파일이 있다.
도커 파일에서는 글을 읽어나가듯이 위에서 아래로 레이어가 하나씩 쌓아 나간다.
만약 중간에 새로운 사항이 바뀐다면 어떻게 될까?
"변경된 레이어만 빌드하고 합치면 될 것 같은데요?"
정답은.. 다 변경된 레이어부터 이후의 것들이 모두 바뀐다!
자. 생각해보자.
만약 내가 A,B,C,D,E 블럭이 있는데 쓰러지지 않도록 무게중심을 잘 맞춰 쌓았다.
근데 만약 C의 모양이 바뀐다면?
D와 E는 그대로니까, C만 위치 바꾸면 되겠는가?
아니다 C가 바껴서 C의 위치를 바꾸는 것은 물론이고, 그에 맞춰 D와 E의 위치도 새로 배치해야 할 것이다.
(그림이 허술한 점 미안하다. 무게 중심 안맞을 것이다. 그래도 얼추 맞다 생각하고 넘어가자)
이렇기 때문에 도커 레이어도 중간이 바뀐다면 그 이후의 레이어는 다시 다 새로 빌드가 된다.
한번 처음 간단한 도커 파일을 처음 실행할때의 로그를 가져왔다. 뭔가 많이 했다.
=> => extracting sha256:7e9bf114588c05b2df612b083b96582f3b8dbf51647aa6138a50d09d42df2454
이것이 레이어 1개이다.
이전 "도커 파일 작성" 글에서 보았던 도커 파일의 명령어 줄이 7줄인데
위 사진에서도 7개의 레이어가 있는 것을 확인 할 수 있다.
docker inspect <imagename>
위 명령어를 치면 각 레이어에 대한 정보를 직접 볼 수도 있다.
어떻게 도커의 이미지 레이어의 캐싱을 잘 활용 할 수 있을까?
- 변경 빈도가 낮은 명령어부터 배치: 잘 바뀌는 명령어는 밑에 배치하고 잘 바뀌지 않는 것은 위쪽에 배치하는 것이다.
아래쪽에 있는 명령어에 대해 새로 빌드해야 되는 상황이더라도 이전 레이어를 최대로 사용 할 수 있을 것이다.
- 공통 레이어의 재사용: 여러 도커 이미지에서 공통적으로 사용되는 레이어는 동일한 순서와 방식으로 작성하여 레이어의 재사용성을 높일
마지막으로, 도커의 이미지 레이어의 장점을 설명하고 끝마치겠다.
도커 레이어의 장점
1. 재사용성: 공통 레이어는 여러 이미지에 걸쳐 재사용될 수 있다.
예를 들어, 여러 이미지가 같은 베이스 이미지를 사용한다면, 해당 베이스 이미지의 레이어는 한 번만 저장되고 여러 이미지에서 공유 할 수 있다.
2. 효율적인 저장: 레이어를 통해 변경된 부분만 저장함으로써 저장 공간을 효율적으로 사용할 수 있다.
이미 존재하는 레이어는 다시 다운로드하거나 저장할 필요가 없습니다.
3. 빠른 배포와 스케일링: 이미지의 레이어가 이미 존재한다면, 새로운 컨테이너를 시작할 때 필요한 데이터만 전송하면 된다.
이는 특히 클라우드 환경에서 컨테이너를 빠르게 배포하고 스케일링하는 데 유리하다.
'Docker' 카테고리의 다른 글
[Docker] 6. Docker-Compose (0) | 2024.09.16 |
---|---|
[Docker] 5. Overlay FS & Storage (0) | 2024.09.14 |
[Docker] 3. 도커 파일 멀티스테이지 빌드(Multi-stage build) (1) | 2024.09.13 |
[Docker] 2.도커 허브 (0) | 2024.09.13 |
[Docker] 1. 도커 파일 작성 & 컨테이너 실행하기 (0) | 2024.09.12 |