연재 시리즈

도커이미지레이어 2편 - Dockerfile과 이미지 레이어 관계

악분 2021. 12. 22. 22:06
반응형


이 글은 영상으로도 만나볼 수 있습니다.
https://youtu.be/qNXcGqixPMk

 

1. 1편 요약

1편에서 다뤘던 내용을 요약하면 도커 이미지는 레이어와 메타정보로 구성됩니다. 그리고 컨테이너가 실행되면 컨테이너 레이어가 자동으로 생성되고 컨테이너가 삭제되면 자동으로 삭제됩니다. 컨테이너 레이어는 읽기쓰기 속성이 있어 컨테이너가 실행 동안 작업한 내용이 저장됩니다.

2. 2편에서 다루는 내용

2편에서는 Dockerfile과 도커 이미지레이어 관계를 설명합니다.

3. 도커 이미지 레이어 생성

도커 이미지 레이어는 Dockerfile 명령어 갯수와 동일합니다. 아래 Dockerfile에서는 FROM과 RUN, 총 2개의 명령어가 있습니다. docker build를 실행하면 총 2개의 이미지 레이어가 생성됩니다.


example:v1 이름을 갖는 도커 이미지를 생성해보세요.

docker build -t example:v1 .


명령어가 2줄이므로 총 2개의 step이 보입니다. step이 이미지 레이어를 생성하는 과정이라고 생각하시면 됩니다.

 

4. docker history로 이미지 레이어 갯수 확인

docker history명령어를 사용하면 이미지 레이어 전체를 볼 수 있습니다. 레이어 2개라고 예상했지만 실제로는 3개의 레이어가 보입니다. busybox이미지가 2개의 레이어로 구성되어서 총 3개의 레이어가 있습니다.


busybox도 docker history로 확인하면 레이어 갯수가 보입니다. 예상대로 2개의 레이어가 있네요.


공식 busyxbo dockerfile[2]를 보면 3개의 명령어가 있지만 2개의 레이어로 인식합니다. scratch 도커 이미지는 아무 내용이 없는 빈 이미지여서 레이어에 제외됩니다.

FROM scratch ADD busybox.tar.xz / CMD ["sh"]

 

5. 이미지 레이어 크기

각 레이어는 0바이트 이상 크기를 갖습니다. dockerfile 명령어가 파일 시스템 크기를 변화시키는 작업을 할 경우 레이어 크기를 증가시킵니다.

0바이트 크기를 갖는 레이어를 empty_layer라고합니다. empty_layer는 docker history에서 SIZE필드가 0인 레이어를 의미합니다.

$ cd /var/lib/docker/image/overlay2/imagedb/content/sha256 $ cat sah256 | jq

 

6. docker inspect와 history 명령어 차이

1편에서 docker insepct를 기억하시나요? docker insepct명령어도 이미지 레이어를 보여줬습니다.

docker inspect busybox:1.34.1

ybox:1.34.


docker inspect와 docker history에서 보여지는 이미지 레이어 갯수는 다를 수 있습니다. docker history는 크기가 0바이트인 레이어를 포함하여 모든 레이어를 보여줍니다. 하지만, docker inspect는 0바이트인 이미지 레이어를 보여주지 않습니다.

7. 이미지 레이어 체인(chain)

이미지 레이어는 체인으로 연결되어 있습니다. Dockerfile의 한줄한줄 명령어가 이미지 레이어가 만들어지는다는 것을 기억하시나요? 생성된 이미지 레이어는 다음 명령어로 생성되는 이미지 레이어와 연결됩니다.


먼저 생성된 레이어가 다음에 생성된 레이어의 부모위치를 갖게됩니다.


parent 정보는 파일로 저장됩니다. /var/lib/docker/image/{storage-driver}/imagedb/metadata/sha256/{도커 이미지id}/parent파일이 연결된 이전 레이어의 도커 이미지id를 저장합니다.

도커 이미지id를 저장한 이유는 empty_layer는 union file system에 저장되지 않아서 이미지 레이어와 매칭되는 도커 이미지 id를 사용한 것으로 생각합니다.

 

 

참고자료

[1] 44bits: https://www.44bits.io/ko/post/static-compile-program-on-chroot-and-docker-scratch-image
[2] busybox dockerfile: https://github.com/docker-library/busybox/blob/master/Dockerfile.template

반응형