Docker에서는 쓰기 시 복사(Copy-on-Write, CoW)라는 전략을 사용하여 이미지 레이어를 효율적으로 관리합니다.
같은 레이어를 사용하는 두 개의 컨테이너가 있을 때, 한 컨테이너에서 해당 레이어에 쓰기를 하면 또 다른 컨테이너에서 변경 사항을 확인할 수 없는 이유입니다.
Docker 이미지 레이어 저장 위치
Docker 이미지는 여러 레이어로 구성되어 있습니다. 각 레이어는 파일 시스템의 변경 사항을 나타내며, 이러한 레이어들이 합쳐져 하나의 이미지를 구성합니다.
Docker 이미지 레이어는 호스트 OS에 저장됩니다.
이미지는 해시 기반(SHA-256)으로 고유성을 판단해서 동일 호스트 OS에 한 번만 저장됩니다.
여러 컨테이너가 동일한 이미지 레이어를 사용할 때, 호스트 OS에 있는 동일한 이미지 레이어를 사용합니다.
Copy-on-Write란?
Copy-on-Write는 이름에서 알 수 있듯이, 데이터를 복사하는 작업이 데이터를 변경하려는 시점에 이루어지는 전략입니다.
Docker에서는 컨테이너가 실행될 때, 기존 이미지 레이어는 읽기 전용으로 유지되며 쓰기 작업이 발생할 경우 새로운 레이어(쓰기 가능한 레이어)에 변경 사항이 저장됩니다.
Docker에서 Copy-on-Write의 이점
1.
디스크 공간 절약: CoW 전략 덕분에 여러 컨테이너가 동일한 이미지 레이어를 공유할 수 있습니다. 이로 인해 중복 데이터를 줄이고 디스크 공간을 절약할 수 있습니다.
2.
빠른 컨테이너 생성: 새로운 컨테이너를 생성할 때, 기존 이미지 레이어를 복사할 필요가 없습니다. 따라서 컨테이너 생성 시간이 단축됩니다.
3.
변경 사항 격리: 각 컨테이너는 자체 쓰기 가능한 레이어를 가지므로, 컨테이너 간에 변경 사항이 격리되어 영향을 주지 않습니다.
동작 원리
Docker에서 쓰기 시 복사 전략이 적용되는 과정은 다음과 같습니다.
파일 쓰기 작업 시,
1.
원본 이미지 레이어의 해당 파일을 쓰기 가능한 최상위 레이어로 복사합니다.
2.
컨테이너는 복사된 파일을 수정합니다.
3.
원본 이미지 레이어에는 영향을 주지 않고, 컨테이너별로 변경 사항이 격리됩니다.
파일 읽기 작업 시,
쓰기 가능한 최상위 레이어부터 차례로 하위 레이어로 검색합니다. 가장 먼저 발견된 파일이 사용됩니다.
컨테이너 제거 시,
컨테이너가 제거되면, 쓰기 가능한 최상위 레이어가 삭제됩니다.
원본 이미지 레이어는 변경되지 않았으므로, 다른 컨테이너나 새로 생성되는 컨테이너에서 계속 사용할 수 있습니다.