후니의 IT인프라 사전
컨테이너 만들기 3) Overlay Filesystem 본문
패키징의 문제 (중복, 그로 인한 비용 등)
패키징으로 잘 모으긴 했지만 우리가 서버를 사용할 때 단순히 운영체제만 사용하는 것이 아니고, nginx, mysql 등 다양한 프로그램을 올려서 사용하고 있다. 이 경우 운영체제 + nginx, 운영체제 nginx+mysql 등 추가될 때마다 이미지를 만들어야하고, 개개인 별로 이미지를 만들게 되면서 중복이 많이 발생하게 된다.
이 경우 점점 불필요한 비용과 비효율이 발생하게 되므로 이러한 중복문제를 해결하고자 한다.
오버레이 파일 시스템 (Overlay Filesystem)
그래서 이러한 중복 문제를 해결하기 위해 다음과 같은 생각을 한다. 이를 오버레이 파일시스템이라고 한다.
- 여러 이미지 레이어를 하나로 마운트
- Lower 레이어(이미지 레이어)는 ReadOnly - 변경 불가
- Upper 레이어는 Writable - 변경 가능
- CoW(Copy-on-Write) - 원본유지
이는 현재 컨테이너에서도 쓰이는 방식이다. CoW는 만약 아래 그림에서 처럼 Lower layer에 있는 File4를 수정하고 싶을 경우, Upper layer로 가져와서 해당 부분을 수정한다. 사용자는 Merged View에서 수정된 File4를 보게 된다.
실습
오버레이 파일 시스템을 실습하기 위해 다음과 같이 진행합니다. 기존의 myroot 위에 tools라는 lower 디렉터리를 생성하고 rm과 which바이너리를 둡니다. 그리고 upper 디렉터리로 container를 두고 merged view로 merge 디렉터리를 생성하겠습니다.
Lower Dir 준비
which와 rm 명령어를 tools라는 폴더 밑에 준비합니다.
# tools 생성
mkdir tools
# which 복사
which which
mkdir -p tools/usr/bin;
cp /usr/bin/which tools/usr/bin/;
# rm 복사
which rm
ldd /usr/bin/rm
mkdir -p tools/{bin,lib,lib/aarch64-linux-gnu};
cp /usr/bin/rm tools/bin/;
cp /lib/aarch64-linux-gnu/libc.so.6 tools/lib/aarch64-linux-gnu/;
cp /lib/ld-linux-aarch64.so.1 tools/lib/;
오버레이 마운트 준비
mkdir -p rootfs/{container,work,merge}
아래 디렉터리 들을 rootfs 디렉터리 밑에 생성합니다.
- container : upper 디렉터리로 사용
- work : CoW를 보장하기 위한 디렉터리
- merge : 통합뷰, 하위 디렉터리가 모두 보임
오버레이 마운트 진행
mount -t overlay overlay -o \
lowerdir=tools:myroot,\
upperdir=rootfs/container,\
workdir=rootfs/work rootfs/merge
마운트를 진행하고 아래와 같이 확인해봅니다.
tree -L 2 myroot/{bin,usr};
tree -L 2 rootfs/merge/{bin,usr};
이처럼 myroot에서는 보이지 않지만 merge 내부에서는 rm과 which를 확인할 수 있다. merge는 merged view이기 때문에 tool가 가지고 있던 rm과 which가 보이게 된다.
이번에는 rm으로 escape_root를 지워보자.
rm rootfs/merge/escape_chroot
tree -L 2 rootfs
지워진 escape_chroot는 container 디렉터리에서 노란색으로 볼 수 있는데, container 디렉터리는 앞서 upper 디렉터리로 삭제된 정보를 저장하기 위해서 새로 생성된 것이다. 우리가 lower 디렉터리로 사용하는 이미지 원본인 myroot에서는 여전히 escape_chroot가 존재함을 확인할 수 있다.
정리
컨테이너를 사용하기 전에는 모두 호스트의 루트파일 시스템을 참조하게 되었다. 전용 루트 파일시스템을 가지게 되면서 호스트의 것을 사용하는게 아니라 컨테이너 자체의 루트 파일 시스템을 사용할 수 있게되었다.
또한 오버레이 파일시스템을 통해서 중복되지 않게 이미지를 패키징 할 수 있고, 기존의 이미지는 보존하면서 새로운 내용을 덮어쓸 수 있게되었다.