
이번 실습은 다음을 보여준다.
리눅스에서 독립적인 실행 환경을 만드는 방식 : 즉, 실제 운영체제처럼 작동하는 작은 루트 파일 시스템(rootfs)을 구성해보고, 그 환경에서 직접 명령어 실행이 가능하도록 세팅하는 것이 목적이다.
컨테이너 기술의 기초 원리를 실습으로 이해하기 : Docker, LXC(Linux Container), systemd-nspawn 같은 컨테이너 기술은 결국 chroot, namespaces, cgroups를 활용한다. 그중 chroot는 파일 시스템 관점에서 "루트(/)를 제한"하는 가장 기본적인 격리 수단이다. 이 실습은 Docker의 내부 동작의 파일 시스템 격리(File System Isolation)을 이해하기 위한 기초 실습이다.
sudo chroot ./myroot /usr/bin/bash
ldd /usr/bin/bash
예시출력:
libtinfo.so.6 => /lib/aarch64-linux-gnu/libtinfo.so.6
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6
mkdir -p ~/myroot
which bash
# -> /usr/bin/bash
mkdir -p ~/myroot/usr/bin
cp /usr/bin/bash ~/myroot/usr/bin/

ldd /usr/bin/bash

mkdir -p ~/myroot/lib/aarch64-linux-gnu
sudo cp /lib/aarch64-linux-gnu/libtinfo.so.6 ~/myroot/lib/aarch64-linux-gnu/
sudo cp /lib/aarch64-linux-gnu/libc.so.6 ~/myroot/lib/aarch64-linux-gnu/
sudo cp /lib/ld-linux-aarch64.so.1 ~/myroot/lib/

sudo chroot ~/myroot /usr/bin/bash
ls
# -> bash: command not found
명령어를 찾을 수 없다고 뜨는 것이 당연하다. ls 명령어가 없기 때문이다.
bash처럼 ls도 동일한 작업이 필요하다.
먼저 ldd 명령어로 필요한 라이브러리를 확인해준다.

cp /usr/bin/ls ~/myroot/usr/bin/
sudo cp /lib/aarch64-linux-gnu/libselinux.so.1 ~/myroot/lib/aarch64-linux-gnu/
sudo cp /lib/aarch64-linux-gnu/libpcre2-8.so.0 ~/myroot/lib/aarch64-linux-gnu/


cd ~
sudo tar -C myroot -cf myroot.tar .
tar : 파일을 묶어서 .tar 형식으로 압축하는 명령어이다.
-C myroot : myroot/ 디렉토리로 먼저 이동해서 tar 작업 수행
-c : 새 tar 파일을 생성(create)
-f myroot.tar : 결과를 myroot.tar라는 파알로 저장
. : 현재 디렉토리(즉 myroot/ 내부)의 모든 파일과 폴더를 압축 대상으로 지정
결과적으로 myroot/ 내부 내용만 담긴 myroot.tar가 생성된다.
cat myroot.tar | docker import - my-custom-image
cat myroot.tar : tar 파일 출력
| : 그 출력을 다음 명령어로 전달(파이프)
docker import - my-custom-image : 표준 입력(즉 -)으로 받은 tar 파일을 Docker 이미지로 가져오기
결과적으로 myroot.tar에 있는 루트 파일 시스템이 Docker 이미지로 변환된다.
docker images 명령으로 확인이 가능하다.


tar은 여러 개의 파일과 디렉토리를 하나의 파일로 묶어주는 유틸리티이다. 원래 이름은 tape archive이다. .tar 확장자는 묶기만 하고 압축은 하지 않는다.
tar -cf archive.tar folder/ # folder/를 하나의 tar 파일로 묶는다.
tar -xvf archive.tar # 묶은 tar 파일을 다시 푼다.
docker import [TAR FILE | URL | -] [REPOSITORY[:TAG]]
Docker 데몬과 API는 "tar 포맷"을 기준으로 파일 시스템을 해석하도록 설계되어 있다. 따라서 파일을 직접 하나하나 넘겨줄 수 없고, 내부적으로든 외부적으로든 결국 tar로 포장해서 주어야 한다.