이해가 안됨
도커이미지가 하위 레이어, 상위 레이어 구성되는것 이해하였음
컨테이너 내부에서 애플리케이션이 실행될때 파일 생성이나 수정이 이뤄질텐데 그걸 읽고쓰기 가능한 상위레이어에서 한다는것 이해하였음 -> 그런데 어떻게?
확인한 내용
컨테이너 이미지는 여러 개의 읽기 전용 (Read-only) 레이어로 구성되어 있습니다. 그런데 컨테이너 내부에서 애플리케이션이 실행되면서 파일 생성, 수정, 삭제 등 쓰기 작업이 발생해야 합니다. 읽기 전용 레이어 위에서는 쓰기 작업을 할 수 없겠죠? 이러한 모순적인 상황을 해결하고, 컨테이너에게 쓰기 가능한 파일시스템을 제공하기 위해 Copy-on-Write (CoW) 라는 기술이 등장합니다.
CoW 기술의 목표는 다음과 같습니다.
- 이미지 레이어의 불변성 유지: 원본 이미지 레이어는 절대로 변경되지 않도록 보호합니다. 이미지 레이어는 여러 컨테이너가 공유하는 기반이므로, 변경되면 다른 컨테이너에게 영향을 줄 수 있기 때문입니다. 이미지의 무결성을 유지하고 재현성을 높이는 것이 중요합니다.
- 컨테이너에게 쓰기 가능한 공간 제공: 각 컨테이너에게는 독립적인 쓰기 가능한 공간을 제공하여, 파일 변경 작업을 수행할 수 있도록 합니다. 컨테이너는 마치 자신만의 파일시스템을 사용하는 것처럼 느끼게 됩니다.
- 저장 공간 효율성: 공통된 이미지 레이어는 여러 컨테이너가 공유하고, 변경된 부분만 컨테이너별로 따로 저장하여 저장 공간을 효율적으로 사용합니다. 이미지 레이어를 재사용함으로써 이미지 다운로드 시간도 단축됩니다.
- 컨테이너 격리: 각 컨테이너의 변경 사항은 자신만의 쓰기 가능한 레이어에만 격리됩니다. 한 컨테이너의 파일 변경이 다른 컨테이너에 영향을 주지 않도록 격리성을 보장합니다.
읽기 (Read) 작업 시 CoW 동작 과정:
컨테이너 내부에서 파일 읽기 작업이 발생하면, 오버레이 파일시스템은 다음과 같은 순서로 파일을 찾습니다.
- 쓰기 가능 레이어 (Upper Layer) 에서 파일 검색: 가장 먼저 컨테이너의 쓰기 가능 레이어에서 해당 파일을 찾습니다. 만약 쓰기 작업으로 인해 파일이 쓰기 가능 레이어에 복사된 적이 있다면, 해당 파일이 발견될 것입니다.
- 이미지 레이어 (Lower Layers) 에서 파일 검색: 쓰기 가능 레이어에서 파일을 찾지 못하면, 하위의 읽기 전용 이미지 레이어들을 순서대로 검색합니다. 이미지 레이어는 여러 개일 수 있으며, 레이어 순서대로 탐색하면서 파일을 찾습니다.
- 파일 발견 시 반환: 파일을 찾으면, 해당 파일을 읽어서 애플리케이션에게 반환합니다.
- 파일을 찾지 못한 경우: 모든 레이어에서 파일을 찾지 못하면, "파일 없음 (File not found)" 오류를 발생시킵니다.
👉 읽기 작업 시에는 CoW 가 작동하지 않습니다. 단순히 파일이 존재하는 레이어를 찾아서 읽어오는 과정만 거칩니다.
4. 쓰기/수정 (Write/Modify) 작업 시 CoW 동작 과정: 파일 복사 후 변경 ✍️ + 📝
컨테이너 내부에서 새로운 파일 쓰기 또는 기존 파일 수정 작업이 발생하면, 오버레이 파일시스템은 Copy-on-Write 메커니즘을 작동시켜 다음과 같이 변경 사항을 처리합니다.
- 파일 존재 여부 확인: 먼저 변경하려는 파일이 쓰기 가능 레이어에 이미 존재하는지 확인합니다.
- 쓰기 가능 레이어에 파일이 없는 경우 (CoW 발생!): 만약 쓰기 가능 레이어에 파일이 없다면, 오버레이 파일시스템은 CoW (Copy-on-Write) 를 수행합니다.
- 원본 파일 레이어 검색: 읽기 전용 이미지 레이어들 중에서 변경하려는 파일의 원본 파일이 존재하는 레이어를 찾습니다.
- 파일 복사 (Copy): 찾은 원본 파일을 쓰기 가능 레이어 (컨테이너 레이어) 로 '복사' 합니다. 이 복사본 은 이제 쓰기 가능한 상태가 됩니다.
- 쓰기 가능 레이어에 복사본 저장: 복사된 파일은 쓰기 가능 레이어에 저장됩니다.
- 쓰기/수정 작업 수행: 쓰기/수정 작업은 이제 쓰기 가능 레이어에 복사된 파일 에 대해서만 이루어집니다. 원본 이미지 레이어의 파일은 전혀 변경되지 않습니다!
- 쓰기 가능 레이어에 파일이 이미 있는 경우: 만약 변경하려는 파일이 쓰기 가능 레이어에 이미 존재한다면 (이전에 CoW 작업 등으로 복사된 파일), CoW 를 수행하지 않고 바로 해당 파일에 쓰기/수정 작업 을 진행합니다.
삭제 (Delete) 작업 시 CoW 동작 과정: Whiteout 파일 생성
컨테이너 내부에서 파일 삭제 작업이 발생하면, CoW는 약간 다른 방식으로 삭제 작업을 처리합니다. 실제로 이미지 레이어의 파일을 삭제하는 것이 아니라, '화이트아웃 (Whiteout)' 파일 을 생성하여 삭제를 표시합니다.
- 삭제 대상 파일 존재 여부 확인: 먼저 삭제하려는 파일이 쓰기 가능 레이어에 이미 존재하는지 확인합니다.
- 쓰기 가능 레이어에 파일이 없는 경우 (CoW 발생!): 만약 쓰기 가능 레이어에 파일이 없다면, 오버레이 파일시스템은 CoW (Copy-on-Write) 를 수행합니다.
- 원본 파일 레이어 검색: 읽기 전용 이미지 레이어들 중에서 삭제하려는 파일의 원본 파일이 존재하는 레이어를 찾습니다.
- 화이트아웃 파일 생성: 쓰기 가능 레이어 (컨테이너 레이어) 에 '화이트아웃 파일 (Whiteout File)' 이라는 특별한 파일을 생성 합니다. 화이트아웃 파일은 삭제하려는 파일과 동일한 이름 을 가지며, 삭제 표시 역할을 합니다. 원본 파일을 복사하는 대신, 삭제 '표시' 만 하는 것 이죠.
- 쓰기 가능 레이어에 파일이 이미 있는 경우: 만약 삭제하려는 파일이 쓰기 가능 레이어에 이미 존재한다면 (이전에 CoW 작업 등으로 복사된 파일), CoW 를 수행하지 않고 쓰기 가능 레이어에서 해당 파일을 직접 삭제합니다.
'Docker, K8s' 카테고리의 다른 글
쿠버네티스 네트워킹 헷갈리는 사항 (0) | 2025.03.29 |
---|---|
Pipe - 컨테이너 런타임이 어떻게 컨테이너의 로그를 캡쳐하는가? (0) | 2025.03.18 |
emptyDir은 파드와 같은 생애 주기를 가지는데, 저장된 데이터는 재시작되더라도 유지된다. (0) | 2025.03.05 |
K8s 환경변수는 컨테이너에서 동작하는 모든 프로세스에서 접근 가능하다? (0) | 2025.03.05 |
K8s Service - Externalname사용시 TCP / HTTP 요청의 차이 (0) | 2025.03.04 |