이번 포스팅에서는 docker의 컨테이너를 리눅스에서 구현하는 실습을 해볼 예정입니다.
저번 포스팅에서 설명했던 namespace나 cgroups는 전부 리눅스에서 제공하는 기능들이고, 컨테이너도 도커가 생기기 이전부터 있던 개념임을 알게되었습니다.

chroot는 1979년에, 나머지 기능들도 2000년대 후반에 다 생겼고, 그 이후에 docker가 생겼습니다.
https://ykarma1996.tistory.com/192
컨테이너의 구조와 오픈소스의 생태계에 관한 리서치(feat. 도커는 적폐인가?)
컨테이너 이미지의 빌드 및 배포에 관한 성능을 개선하기 위해 리서치를 하다보니, 혼자 알기에 너무 재밌는 배경들이 많아서 정리해 보기로 했다. 오늘은 컨테이너와 이미지의 구조 및 원리(특
ykarma1996.tistory.com
https://themapisto.tistory.com/192
[Docker] 컨테이너와 네임스페이스 격리
쿠버네티스를 공부할때 항상 도커를 먼저 공부해봐라. 라는 이야기를 들을때가 많다. 그 이유가 무엇일까라는 고민을 했었고,그에 대한 내 생각을 리서치 결과를 토대로 적어보려고 한다. 내가
themapisto.tistory.com
Build Your Own Docker with Linux Namespaces, cgroups, and chroot: Hands-on Guide
Take a practical approach to containerization as we guide you through the step-by-step process of building your own Docker-like environment using Linux namespaces, cgroups, and chroot. Dive into the code and command examples to gain a deeper understanding
akashrajpurohit.com
위 3가지를 위주로 학습하였고, 마지막 게시물은 리눅스의 Namespaces, cgroups, chroot로 나만의 도커를 만들기글이고 상세하니 참고하실분 보시면 좋을 것 같습니다.
먼저 PID namespace에 대한 부분을 구현해보겠습니다.

기본적으로 ps를 치면 다음 ps 목록이 나옵니다.
namespace에 대한 분리는 리눅스의 unshare 명령으로 구현이 가능합니다.

설명만 봐도 부모로부터 다른 namespace를 만든다고 말해줍니다.
--PID 옵션을 넣으면 pid의 분리를, --uts로 hostname의 분리가 가능해집니다.
sudo unshare --pid --fork --mount-proc --uts /bin/bash
다음 명령어를 통해, pid분리가 가능해지고, /bin/bash를 새로 실행하게 됩니다.
이 상태에서 ps -aux를 쳐보겠습니다.

ps aux를 쳐도 프로세스가 단 2개만 켜져있고 1번 PID도 /bin/bash입니다.
host pc에서 ps aux를 쳐보겠습니다

흰줄이 쳐진 부분에서 저희가 친 명령어가 실행되고 있음을 확인 가능합니다.
다음은 mount namespace와 pivot root입니다.
파일 시스템을 컨테이너화 시키는 부분입니다.
현재 상태는 pid namespace를 분리하긴 하였지만, 파일 시스템은 host wsl과 분리가 안 된 상태입니다.

이걸 컨테이너화 하려면 저장공간 자체를 분리해야 합니다.
이때 사용하는게 chroot와 pivot_root입니다.
둘 다 프로세스가 보는 /디렉토리를 바꾸는 기술입니다.
chroot가 더 간단하긴 하지만, 보안 관점에서 조금 허술한 부분이 있어서 pivot_root을 사용합니다.

기존의 / 루트 파일시스템을 우리가 원하는 파일시스템으로 격리시켜주는 기능입니다.
참고로 컨테이너안에서의 루트 디렉토리는 rootfs라고 합니다.
/newroot 안에는 bin, lib, lib64 등등의 기본 구조가 필요합니다.
해당 rootfs를 만들때는
sudo debootstrap jammy /testroot http://archive.ubuntu.com/ubuntu/
명령어를 통해 쉽게 가능합니다.

여기다가 testroot 디렉토리를 만들어주었습니다.
원래 작은 우분투나 busybox를 설치하려고 했는데

자꾸 오류가 나서, 위에 모두의 근삼이님의 블로그로 hostos에서 필요파일만 복사해오겠습니다.

bash와 ls의 위치 및 의존 라이브러리를 확인합니다.
new_root에 만들어주고, 각각 new_root/bin, new_root/bash를 만들어줍니다.
cp /usr/bin/{bash,ls} new_root/bin/
해당 명령어로 bash랑 ls를 복사해줍니다.
sudo cp /lib/x86_64-linux-gnu/libtinfo.so.6 \
/lib/x86_64-linux-gnu/libc.so.6 \
/lib/x86_64-linux-gnu/libselinux.so.1 \
/lib/x86_64-linux-gnu/libpcre2-8.so.0 \
/new_root/lib/x86_64-linux-gnu/
sudo cp /lib64/ld-linux-x86-64.so.2 /new_root/lib64/
ls -al /new_root/bin
ls -al /new_root/lib/x86_64-linux-gnu
ls -al /new_root/lib64
sudo chroot /new_root /bin/bash
제 환경에 맞게끔 복사를 수행했습니다.
테스트로 chroot를 한번 써보면,

다ㅓ음과 같이 정상적으로 뜬걸 확인 가능합니다.
pivot_root는 사용하려면 old_root 디렉토리가 필요하므로, 내부에 old_root을 만들어줍니다.

old_root만들고, 아까 unshare를 통해 pid 분리 해줍니다

는 바로 안되더라고요,
mount --bind /home/lacuc/new_root /home/lacuc/new_root
처음부터 명령어 다시 쳐주고 해당 --bind까지 했으니 되긴 했으나

ls랑 bash명령어가 안먹네요

여기 제가 new_root 디렉토리 안에 bin , lib64 , old_root 3개의 디렉토리가 있는데,

lib64안에 아무것도 복사가 안된 듯 하네요

다시 제대로 복사해주고, 다시 pivot_root 해주겠습니다

이후에는 정상적으로 실행이 됩니다.
이렇게하면 docker를 흉내낸 구성을 할 수 있습니다
물론 docker에는 network namespace와 같은 기능들이 훨씬 많이 존재합니다.
일단 이 각각의 라이브러리를 이미지 레이어로 관리해주고, OverlayFS라는 더 고개념이 있습니다.
같은 이미지에서 컨테이너를 여러 개 띄워도 이미지 레이러를 공유하는 기술입니다.
이미지를 빌드하는 소프트웨어는 도커말고도 몇 개 더 존재하긴 합니다.
일단 여기까지 해서 실습을 마치도록 하겠습니다.
뭔가 도커를 사용하는데 어려움이 있었는데 좀 한발짝 가까워진 느낌입니다.
읽어주셔서 감사합니다!
'취약점분석 (Blue Team) > Cloud' 카테고리의 다른 글
| [Cloud] Kubernetes 보안 실습 시나리오 1 ( RCE후 Pod 생성 ) (1) | 2026.06.16 |
|---|---|
| [Cloud] 쿠버네티스 (Kubernetes, k8s) (0) | 2026.06.16 |
| [Cloud] Docker 도커와 컨테이너 (0) | 2026.06.15 |
| Toss의 K8S를 더 안전하게: Falco를 활용한 K8S 위협 모니터링 토스 가디언즈 (0) | 2026.05.05 |
| [Cloud] Falco (Runtime Security Tool) (0) | 2026.03.26 |