본문 바로가기

Docker, K8s

컨테이너 이미지 내 overlayFS에서 Copy-on-Write가 구체적으로 어떻게 작동하는가?

이해가 안됨

도커이미지가 하위 레이어, 상위 레이어 구성되는것 이해하였음

컨테이너 내부에서 애플리케이션이 실행될때 파일 생성이나 수정이 이뤄질텐데 그걸 읽고쓰기 가능한 상위레이어에서 한다는것 이해하였음 -> 그런데 어떻게?

 

 

확인한 내용

 

컨테이너 이미지는 여러 개의 읽기 전용 (Read-only) 레이어로 구성되어 있습니다. 그런데 컨테이너 내부에서 애플리케이션이 실행되면서 파일 생성, 수정, 삭제 등 쓰기 작업이 발생해야 합니다. 읽기 전용 레이어 위에서는 쓰기 작업을 할 수 없겠죠? 이러한 모순적인 상황을 해결하고, 컨테이너에게 쓰기 가능한 파일시스템을 제공하기 위해 Copy-on-Write (CoW) 라는 기술이 등장합니다.

CoW 기술의 목표는 다음과 같습니다.

  • 이미지 레이어의 불변성 유지: 원본 이미지 레이어는 절대로 변경되지 않도록 보호합니다. 이미지 레이어는 여러 컨테이너가 공유하는 기반이므로, 변경되면 다른 컨테이너에게 영향을 줄 수 있기 때문입니다. 이미지의 무결성을 유지하고 재현성을 높이는 것이 중요합니다.
  • 컨테이너에게 쓰기 가능한 공간 제공: 각 컨테이너에게는 독립적인 쓰기 가능한 공간을 제공하여, 파일 변경 작업을 수행할 수 있도록 합니다. 컨테이너는 마치 자신만의 파일시스템을 사용하는 것처럼 느끼게 됩니다.
  • 저장 공간 효율성: 공통된 이미지 레이어는 여러 컨테이너가 공유하고, 변경된 부분만 컨테이너별로 따로 저장하여 저장 공간을 효율적으로 사용합니다. 이미지 레이어를 재사용함으로써 이미지 다운로드 시간도 단축됩니다.
  • 컨테이너 격리: 각 컨테이너의 변경 사항은 자신만의 쓰기 가능한 레이어에만 격리됩니다. 한 컨테이너의 파일 변경이 다른 컨테이너에 영향을 주지 않도록 격리성을 보장합니다.

 

읽기 (Read) 작업 시 CoW 동작 과정:  

컨테이너 내부에서 파일 읽기 작업이 발생하면, 오버레이 파일시스템은 다음과 같은 순서로 파일을 찾습니다.

  1. 쓰기 가능 레이어 (Upper Layer) 에서 파일 검색: 가장 먼저 컨테이너의 쓰기 가능 레이어에서 해당 파일을 찾습니다. 만약 쓰기 작업으로 인해 파일이 쓰기 가능 레이어에 복사된 적이 있다면, 해당 파일이 발견될 것입니다.
  2. 이미지 레이어 (Lower Layers) 에서 파일 검색: 쓰기 가능 레이어에서 파일을 찾지 못하면, 하위의 읽기 전용 이미지 레이어들을 순서대로 검색합니다. 이미지 레이어는 여러 개일 수 있으며, 레이어 순서대로 탐색하면서 파일을 찾습니다.
  3. 파일 발견 시 반환: 파일을 찾으면, 해당 파일을 읽어서 애플리케이션에게 반환합니다.
  4. 파일을 찾지 못한 경우: 모든 레이어에서 파일을 찾지 못하면, "파일 없음 (File not found)" 오류를 발생시킵니다.

👉 읽기 작업 시에는 CoW 가 작동하지 않습니다. 단순히 파일이 존재하는 레이어를 찾아서 읽어오는 과정만 거칩니다.

4. 쓰기/수정 (Write/Modify) 작업 시 CoW 동작 과정: 파일 복사 후 변경 ✍️ + 📝

컨테이너 내부에서 새로운 파일 쓰기 또는 기존 파일 수정 작업이 발생하면, 오버레이 파일시스템은 Copy-on-Write 메커니즘을 작동시켜 다음과 같이 변경 사항을 처리합니다.

  1. 파일 존재 여부 확인: 먼저 변경하려는 파일이 쓰기 가능 레이어에 이미 존재하는지 확인합니다.
  2. 쓰기 가능 레이어에 파일이 없는 경우 (CoW 발생!): 만약 쓰기 가능 레이어에 파일이 없다면, 오버레이 파일시스템은 CoW (Copy-on-Write) 를 수행합니다.
    • 원본 파일 레이어 검색: 읽기 전용 이미지 레이어들 중에서 변경하려는 파일의 원본 파일이 존재하는 레이어를 찾습니다.
    • 파일 복사 (Copy): 찾은 원본 파일을 쓰기 가능 레이어 (컨테이너 레이어) 로 '복사' 합니다. 이 복사본 은 이제 쓰기 가능한 상태가 됩니다.
    • 쓰기 가능 레이어에 복사본 저장: 복사된 파일은 쓰기 가능 레이어에 저장됩니다.
    • 쓰기/수정 작업 수행: 쓰기/수정 작업은 이제 쓰기 가능 레이어에 복사된 파일 에 대해서만 이루어집니다. 원본 이미지 레이어의 파일은 전혀 변경되지 않습니다!
  3. 쓰기 가능 레이어에 파일이 이미 있는 경우: 만약 변경하려는 파일이 쓰기 가능 레이어에 이미 존재한다면 (이전에 CoW 작업 등으로 복사된 파일), CoW 를 수행하지 않고 바로 해당 파일에 쓰기/수정 작업 을 진행합니다.

 

삭제 (Delete) 작업 시 CoW 동작 과정: Whiteout 파일 생성

컨테이너 내부에서 파일 삭제 작업이 발생하면, CoW는 약간 다른 방식으로 삭제 작업을 처리합니다. 실제로 이미지 레이어의 파일을 삭제하는 것이 아니라, '화이트아웃 (Whiteout)' 파일 을 생성하여 삭제를 표시합니다.

  1. 삭제 대상 파일 존재 여부 확인: 먼저 삭제하려는 파일이 쓰기 가능 레이어에 이미 존재하는지 확인합니다.
  2. 쓰기 가능 레이어에 파일이 없는 경우 (CoW 발생!): 만약 쓰기 가능 레이어에 파일이 없다면, 오버레이 파일시스템은 CoW (Copy-on-Write) 를 수행합니다.
    • 원본 파일 레이어 검색: 읽기 전용 이미지 레이어들 중에서 삭제하려는 파일의 원본 파일이 존재하는 레이어를 찾습니다.
    • 화이트아웃 파일 생성: 쓰기 가능 레이어 (컨테이너 레이어) 에 '화이트아웃 파일 (Whiteout File)' 이라는 특별한 파일을 생성 합니다. 화이트아웃 파일은 삭제하려는 파일과 동일한 이름 을 가지며, 삭제 표시 역할을 합니다. 원본 파일을 복사하는 대신, 삭제 '표시' 만 하는 것 이죠.
  3. 쓰기 가능 레이어에 파일이 이미 있는 경우: 만약 삭제하려는 파일이 쓰기 가능 레이어에 이미 존재한다면 (이전에 CoW 작업 등으로 복사된 파일), CoW 를 수행하지 않고 쓰기 가능 레이어에서 해당 파일을 직접 삭제합니다.