출처: https://tech.kakaoenterprise.com/171 [카카오엔터프라이즈 기술블로그 Tech&(테크앤):티스토리]
(이 글은 위 카카오엔터프라이즈 사이트 글을 읽고 정리한 내용입니다. 더 자세한 내용은 위 사이트를 이용하시길 바랍니다!)
컨테이너 루트파일시스템?
chroot는 탈옥문제가 있는 것 처럼 프로세스가 루트디렉터리 밖으로 벗어날 수 없다는 점에 착안하여 특정 유저 프로세스를 지정한 경로에 가둘 수 있었습니다. 이를 해결하기 위해서 pivot_root 명령어를 이용하는 방법이 있었습니다!
루트파일시스템을 건드린다는 것 자체가 문제가 발생 할 수 있습니다. 루트파일시스템에는 많은 시스템 라이브러리들이 포함 되어 있기 때문에 컨테이너를 만들때 침범하지 않아야합니다. 루트파일시스템 호스트 환경에 영향을 미치지 않게 만들기 위해 고민해서 나온 답이 바로 네임스페이스입니다. 최초의 네임스페이스는 루트파일시스템을 안전하게 피벗 하기 위한 격리 방법으로 고안되었는데요. 바로 지금의 "마운트 네임스페이스" 입니다.
마운트 네임스페이스가 mount point를 격리한다는 것은 파일시스템 마운트와 해제 등의 변경사항들이 네임스페이스 밖에서는 보이지 않고, 외부에 전혀 영향을 주지 않음을 의미합니다. 마운트 네임스페이스가 생김으로써 컨테이너를 위해 pivot_root를 안전하게 실행할 수 있게 되었습니다.
(컨테이너 전용 루트파일시스템 만들기 실습은 맨 위 사이트에서 자세한 설명이 나와있습니다!)
이미지 중복 문제
어떤 컨테이너에 이미지 a+b를 사용중인데 다른 컨테이너에는 a+b+c 이미지가 필요합니다. 이때 이미지가 서로 다르더라도 a+b가 두번 겹치는 중복문제가 발생할 수 있었는데 현재는 여러가지의 레이어들의 조합으로 제공되고 있습니다. 이렇게 조합된 레이어들을 하나의 통합된 뷰로 제공하는 오버레이 파일 시스템이 있습니다.
오버레이 파일시스템의 기원은 Union 파일시스템으로, 일명 '상속파일시스템'이라고도 합니다. "상속"에서 유추해 볼 수 있듯이, 오버레이 파일시스템은 파일시스템 여러 개를 쌓고, 밑에서부터 레이어들을 층층이 쌓아올립니다. 최상위층에서 보면 레이어들이 하나로 합쳐져 보입니다. 이렇게 여러 파일시스템을 하나로 합쳐서 하나의 파일시스템으로 마운트 하는 기능을 'Union 마운트'라고 합니다. 그리고 Union 마운트를 수행하는 시스템을 Union 파일 시스템이라고 합니다.
Union 파일시스템을 쉽게 비유하면, 투명한 겹겹이 쌓인 파일 폴더라고 생각할 수 있습니다. 각각의 폴더(레이어)는 따로 존재하지만, 마치 하나의 폴더처럼 보이게 됩니다. Union 파일시스템의 개념을 쉽게 설명하자면
1. 여러 폴더를 하나로 합치기 (Union 마운트)
- 여러 개의 폴더가 있는데, 이 폴더들을 한꺼번에 볼 수 있게 겹쳐서 보여주는 것이라고 생각하면 됩니다.
- 예를 들어, 폴더 A와 폴더 B가 있다고 하면, 이 두 폴더를 하나의 폴더처럼 보여주는 방식입니다. 하지만 실제로는 두 폴더가 따로 존재합니다.
2. 레이어 순서가 중요하다 (덮어쓰기)
- 만약 폴더 A와 폴더 B에 같은 이름의 파일이 있다면, 나중에 겹친 폴더(상위 폴더)인 폴더 B의 파일이 우선으로 보입니다.
- 즉, 같은 이름의 파일이 있으면 나중에 올라온(상위) 파일이 먼저 보이는 겁니다.
3. 읽기 전용 폴더와 쓰기 가능한 폴더 (Copy-On-Write)
- CD-ROM을 예로 들 수 있습니다. CD-ROM은 읽기 전용이라 내용을 수정할 수 없습니다. 하지만, 파일을 수정하고 싶을 때는 수정된 내용을 다른 디스크에 저장할 수 있습니다.
- 이를 Union 파일시스템에서 어떻게 처리하냐면, **CD-ROM(읽기 전용)**을 Lower Layer로 두고, 쓰기 가능한 디스크를 Upper Layer로 둡니다. 그래서 원본 파일은 건드리지 않고, 수정된 내용만 Upper Layer에 기록합니다.
비유:
- Lower Layer(읽기 전용 CD): 수정할 수 없는 책.
- Upper Layer(쓰기 가능한 디스크): 수정된 내용을 메모지에 적는 것.
- Copy-On-Write: 책에 직접 쓰지 않고, 메모지에 내용을 수정해서 붙이는 방식입니다.
최신 컨테이너에서는 주로 OverlayFS2를 사용합니다.
- 도커 같은 컨테이너는 이러한 방식으로 기존 파일은 건드리지 않고, 필요한 파일만 수정할 수 있게 합니다. 그리고 이 방식의 최신 구현체가 OverlayFS2입니다.
OverlayFS2의 구조
OverlayFS2는 쉽게 말해서 투명한 셀로판지를 겹쳐서 사용하는 방식이라고 생각하면 이해가 쉽습니다. 각 셀로판지(레이어)가 파일 시스템에 해당하고, 이 레이어들이 겹쳐져서 하나의 통합된 파일시스템처럼 작동하는 방식입니다.
1. Lower Dir (읽기 전용 레이어)
- Lower Dir는 읽기만 가능한 원본 이미지를 저장하는 곳입니다.
- 도커 허브 등에서 다운로드한 이미지가 이 Lower Dir에 해당합니다.
- Lower Dir은 여러 레이어로 나누어져 있고, 각 레이어는 순서대로 쌓입니다. 이 레이어들을 겹쳐서 하나의 이미지처럼 사용하게 됩니다.
2. Upper Dir (쓰기 가능한 레이어)
- Upper Dir는 쓰기 가능한 레이어입니다. 컨테이너 안에서 새로운 파일을 만들거나 기존 파일을 수정할 때 Upper Dir에 저장됩니다.
- 예를 들어, 도커 이미지에서 파일을 수정하고 싶다면, Lower Dir에는 직접 수정할 수 없으니, 먼저 Upper Dir로 파일을 복사(Copy)한 후 수정합니다. 이게 바로 Copy-On-Write(CoW) 방식입니다.
- 이렇게 해서 Lower Dir는 원본 그대로 유지하고, 수정된 내용은 Upper Dir에 기록하게 됩니다.
3. Merged View (통합된 뷰)
- Merged View는 Upper Dir와 Lower Dir가 합쳐져 보이는 곳입니다.
- 마치 여러 겹의 투명 셀로판지를 겹쳐 놓은 것처럼, Lower Dir의 원본 파일들과 Upper Dir의 수정된 파일들이 한꺼번에 보이게 됩니다.
비유:
- Lower Dir(읽기 전용): 원본 책(변경할 수 없음).
- Upper Dir(쓰기 가능): 원본 책 위에 메모지를 붙여서 내용을 추가하거나 수정하는 것.
- Copy-On-Write(CoW): 책을 직접 수정하지 않고, 메모지에 수정된 내용을 기록하는 방식.
- Merged View: 책과 메모지를 함께 읽을 수 있도록 겹쳐 놓은 상태.
즉, Lower Dir는 원본을 보존하고, Upper Dir는 변경된 내용을 처리해서, 두 레이어가 합쳐진 Merged View에서 모든 파일을 볼 수 있게 해주는 구조입니다.
(오버레이 파일시스템 마운트 실습은 위 출처 사이트에서 자세한 설명이 나와있습니다!!)
컨테이너 레이어 구조
컨테이너 레이어 구조를 쉽게 설명하자면, 투명한 책을 여러 권 겹쳐 놓고 사용하는 방식으로 생각하면 됩니다.
1. Image Layers (Lower Dir):
- 이미지 레이어는 원본 책처럼, 읽기만 가능한(Read-Only) 상태입니다.
- 책 페이지처럼 여러 레이어가 차곡차곡 쌓여 있는데, 각 페이지는 수정할 수 없어요. 도커 이미지라고 생각하면 됩니다.
2. Container Layer (Upper Dir):
- 컨테이너 레이어는 메모지 같은 느낌입니다. 컨테이너를 실행할 때 이 메모지를 책 위에 올려서 **쓰기/읽기(Read/Write)**가 가능하게 합니다.
- 컨테이너가 실행되면 이 메모지(컨테이너 레이어)가 생성되고, 이미지 레이어에 있는 내용이 변경될 필요가 있을 때는, 메모지 위에 그 내용을 복사해서 수정하는 방식으로 작동합니다. 이것이 Copy-On-Write(CoW) 방식입니다.
3. 공유와 저장공간 절약:
- 여러 컨테이너가 같은 이미지 레이어를 공유할 수 있습니다. 책을 여러 사람이 같이 읽는다고 생각하는 대신에 각 컨테이너는 자신의 메모지(컨테이너 레이어)를 가지고 있습니다.
- 이렇게 함으로써, 호스트의 저장 공간을 절약 가능합니다. 여러 개의 컨테이너가 하나의 이미지를 사용하니까, 중복 저장을 피할 수 있습니다.
4. 성능 오버헤드:
- 하지만 이미지 레이어의 파일을 수정할 때는, 메모지로 파일을 복사해서 변경해야 하므로 속도가 느려지고 작업에 부담이 생길 수 있습니다. 특히 큰 파일일수록 복사 작업이 시간이 걸리기 때문에, 이미지 레이어를 자주 변경하는 것은 피하는 게 좋습니다.
5. 휘발성:
- 컨테이너 레이어는 휘발성이어서, 컨테이너가 삭제되면 함께 사라집니다. 그래서 데이터가 유지되어야 한다면 볼륨 마운트 같은 방법으로 별도의 저장소를 사용해야 합니다.
- 만약, 컨테이너에서 변경된 내용을 영구적으로 저장하고 싶다면, 커밋하여 새로운 이미지 레이어로 만들 수 있습니다.
비유하여 설명하는 정리:
- Image Layers(원본 책): 여러 권의 책을 쌓아놓고 읽을 수만 있는 상태.
- Container Layer(메모지): 각자 메모지를 붙여서 책 내용을 수정하거나 추가하는 방식.
- Copy-On-Write(CoW): 원본 책은 그대로 두고, 수정이 필요할 때 메모지에 복사해서 쓰는 것.
- 휘발성: 메모지는 책을 덮고 나면 사라지는 상태라, 영구적으로 남기려면 별도의 기록을 남겨야 한다.
이렇게 하면 저장 공간을 절약하면서 여러 컨테이너가 원본 이미지를 공유해 사용할 수 있지만, 파일 수정 시에는 성능 오버헤드가 발생할 수 있습니다.
'DevOps > Docker' 카테고리의 다른 글
chroot - 컨테이너를 직접 만들어보기! (1) | 2024.09.15 |
---|---|
Docker Image 상세 구조 (1) | 2024.09.15 |
Docker Compose (2) | 2024.02.06 |
컨테이너 교차 통신, Docker로 다중 어플리케이션 구성하기 (0) | 2024.02.06 |
Docker 이미지와 컨테이너 내부의 데이터 관리 방법 (1) | 2024.02.06 |