도커 이미지, 레이어 구조를 파헤치다!
도커 이미지는 읽기 전용 레이어(Read-only Layers)로 구성되며, 각 레이어는 파일 시스템의 변경 사항을 나타냄
`ADD`, `COPY`, `RUN` 명령어가 새로운 레이어를 생성하며, `docker image inspect` 명령어로 레이어 정보를 확인 가능
이미지 레이어는 Content Addressable ID를 사용하여 식별되며, 이미지 중복 저장 방지를 통해 효율성을 높임
컨테이너는 Copy-on-Write(COW) 메커니즘을 통해 이미지 레이어를 수정하며, 컨테이너 삭제 시 변경 사항은 소멸됨
도커 이미지 레이어의 기본 구조
도커 이미지는 여러 개의 읽기 전용 레이어(Read-only Layers)로 구성되며, 각 레이어는 이전 상태에 대한 변경 사항을 나타낸다. `ADD`, `COPY`, `RUN`과 같은 Dockerfile 명령어는 새로운 레이어를 생성하며, `docker image inspect` 명령어를 통해 이미지의 레이어 정보를 JSON 형식으로 확인할 수 있다. 이러한 레이어 구조는 이미지의 효율적인 저장과 관리를 가능하게 하며, Content Addressable ID를 통해 레이어의 무결성을 보장한다.
이미지 빌드 과정과 임시 이미지
도커 이미지를 빌드할 때, 각 Dockerfile 명령어는 임시 이미지를 생성하며, 이는 빌드 캐싱(Build Caching)을 가능하게 하여 성능을 향상시킨다. 특히, `COPY` 명령어를 통해 파일이 이미지 파일 시스템에 복사될 때, 해당 파일은 레이어의 `diff` 디렉토리에 저장된다. 이러한 임시 이미지들은 최종 이미지의 레이어들을 구성하는 기반이 되며, Union Filesystem 방식을 통해 레이어들을 결합하여 최종 이미지를 생성한다.
레이어 식별과 Content Addressable ID
각 이미지 레이어는 고유한 Content Addressable ID를 가지며, 이는 레이어의 내용에 대한 해시 값이다. 이러한 ID는 레이어의 무결성을 보장하고, 동일한 내용을 가진 레이어를 여러 이미지에서 공유할 수 있게 한다. `/var/lib/docker/overlay2/layerdb/sha256` 디렉토리에서 각 레이어의 디렉토리를 확인할 수 있으며, 각 디렉토리에는 `diff`, `size`, `cache-id` 등의 파일이 포함되어 있다. 레이어의 효율적인 관리를 위해 필수적인 요소이다.
컨테이너의 가변 레이어와 Copy-on-Write
도커 컨테이너는 이미지의 읽기 전용 레이어를 기반으로 실행되며, 컨테이너 내에서 파일 시스템을 변경하기 위해 Copy-on-Write(COW) 메커니즘을 사용한다. 컨테이너가 이미지 파일 시스템의 파일을 수정하면, 해당 파일은 컨테이너 레이어에 복사되어 수정된다. 이러한 방식은 컨테이너의 시작 시간을 단축시키고, 컨테이너 삭제 시 변경 사항을 안전하게 제거할 수 있게 한다. 결과적으로 컨테이너의 효율적인 운영을 가능하게 한다.