취약점분석 (Blue Team)/Cloud

[Cloud] 도커 컨테이너 리눅스에서 구현 실습

poiri3r 2026. 6. 15. 23:03

이번 포스팅에서는 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

https://anweh.tistory.com/67

 

https://akashrajpurohit.com/blog/build-your-own-docker-with-linux-namespaces-cgroups-and-chroot-handson-guide/

 

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을 사용합니다.

출처 : https://velog.io/@_gyullbb/1-2.-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B2%A9%EB%A6%ACpivotroot

기존의 / 루트 파일시스템을 우리가 원하는 파일시스템으로 격리시켜주는 기능입니다.

참고로 컨테이너안에서의 루트 디렉토리는 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라는 더 고개념이 있습니다.

같은 이미지에서 컨테이너를 여러 개 띄워도 이미지 레이러를 공유하는 기술입니다.

 

이미지를 빌드하는 소프트웨어는 도커말고도 몇 개 더 존재하긴 합니다.

 

일단 여기까지 해서 실습을 마치도록 하겠습니다.

뭔가 도커를 사용하는데 어려움이 있었는데 좀 한발짝 가까워진 느낌입니다.

읽어주셔서 감사합니다!