본문 바로가기

삽질

도커 없이 컨테이너 만들기 - 6

0. 개요

이 글은 아래 글과 이어집니다.

https://ksb-dev.tistory.com/376

 

도커 없이 컨테이너 만들기 - 5

0. 개요이 글은 아래 글과 이어집니다.리눅스에서는 일반 디렉토리를 피봇(Pivot)을 통해 루트 파일시스템으로 전환할 수 있습니다. 하지만, 루트 파일시스템에는 bin, lib, etc 등 시스템 동작에 중

ksb-dev.tistory.com

 

 

이전 글에서 pivot_root를 활용한 격리는 리소스 중복 문제가 있다는 것을 알 수 있었습니다.

이글에서 다루는 오버레이(Overlay) 파일시스템을 통해 위 문제를 해결할 수 있습니다.

 

오버레이는 여러 레이어를 중복해서 하나의 시스템을 만드는 방법입니다.

Lower 레이어는 ReadOnly로 변경이 발생하지 않습니다.

Upper 레이어는 Writable로 모든 변경은 이 레이어에 작성됩니다.

이를 CoW(Copy on Write)라고 합니다.

출처 : https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=103

 

아래 그림을 만드는 실습을 해보겠습니다.

출처 : https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=106

 

1. Layer Dir 1

myroot는 이전에 사용한 그대로 사용할 것입니다.

tree -L 2 myroot;

 

2. Layer Dir 2

tools 폴더를 만들어 which와 rm 명령어를 추가하겠습니다.

mkdir tools

 

 

which는 의존 라이브러리가 없으므로 바로 복사하면됩니다.

which which
ldd /bin/which
mkdir -p tools/usr/bin
cp /usr/bin/which tools/usr/bin/

 

 

rm은 의존 라이브러리까지 이동시킵니다.

which rm
ldd /bin/rm
mkdir -p tools/{bin,lib64,lib/x86_64-linux-gnu};
cp /bin/rm tools/bin/;
cp /lib/x86_64-linux-gnu/libc.so.6 tools/lib/x86_64-linux-gnu/;
cp /lib64/ld-linux-x86-64.so.2 tools/lib64/;

 

 

복사가 끝나면 아래와 같이 확인할 수 있습니다.

 

3. Upper Dir

오버레이를 위한 세 가지 폴더가 존재합니다.

  1. container : Upper Dir에 해당하면서 변경사항이 존재합니다.
  2. merge : 사용자가 보는 이미지의 최종 통합 뷰를 의미합니다.
  3. work : container의 자동 업데이트를 위해 존재합니다.

먼저 오버레이를 위한 폴더를 생성합니다.

mkdir -p rootfs/{container,work,merge};

 

오버레이 명령어는 아래와 같습니다.

# lowerdir : base 폴더를 설정합니다.
# upperdir : 변경사항이 저장될 폴더를 설정합니다.
# work : upperdir의 자동 변경을 위한 폴더를 설정합니다.
# rootfs/merge : 통합 뷰를 제공하는 폴더를 설정합니다.
mount -t overlay overlay -o lowerdir=tools:myroot,upperdir=rootfs/container,workdir=rootfs/work rootfs/merge

 

 

오버레이 마운트가 성공하니 rm, which가 생성되어 있는 것을 보실 수 있습니다.

 

폴더 구조는 아래와 같습니다.

tree -L 2 rootfs

 

escape_chroot를 삭제하면 변경사항이 container에 저장됩니다.

rm rootfs/merge/escape_chroot
tree -L 2 rootfs

 

레이어 이미지가 아닌 myroot를 조회하면 원본은 변경되지 않음을 알 수 있습니다.

tree -L 2 myroot;

 


rootfs/merge가 마운트되어 있기 때문에 마운트를 해제합니다.

umount rootfs/merge