도커는 어떻게 컨테이너를 만들까?
도커는 리눅스의 LXC를 이용하여 컨테이너를 생성한다
LXC의 3대 기능
namespace
1.PID namespace
PID와 프로세스를 분리 (systemd와 분리)
namespace가 다른 프로세스는 서로 엑세스 불가능
2.Network namespace(netns)
네트워크 디바이스, IP ADress, 포트 번호, 라우팅 테이블, 필터링 테이블 등 네트워크 리소스를 namespace 별로 할당 가능
3.mount namespace
5.UID namespace
6.IPC namespace
Cgroup
2.HostOS의 CPU, 메모리같은 리소스를 그룹별로 제한 가능
3.컨테이너가 다른 컨테이너에게 영향을 주는 것을 막는다
Chroot
프로세스로부터 컨테이너 프로세스를 격리한다
컨테이너에서 새로운 왕을 뽑는다(컨테이너 상에서 새로운 root를 만든다)
이 중에서 도커없이 컨테이너 생성하기에 필요한 친구는 누굴까?
바로 Chroot이다
자 새로운 왕을 만들어 보자
우선 새로운 왕이 될 디렉터리를 만들어야 한다.
컨테이너를 만드는 명령어
chroot /BACKUP/change_root
프로세스가 생성되었다!
자 들어가서 확인해볼까?
chroot /BACKUP/change_root /bin/bash
ㅠㅠㅠ 안들어가진다
왜냐하면 myroot 컨테이너는 bash라는 기능이 없기 때문!!
그럼 bash를 만들어주자
1차 타켓 /bin/bash
myroot 안에 /bin/bash를 넣어줄 bin 디렉터리를 생성해줘야한다
mkdir -p /BACKUP/change_root/bin
cp /bin/bash /BACKUP/change_root/bin
자 이제 chroot를 통해 컨테이너를 생성해 보자
chroot /BACKUP/change_root /bin/bash
어라? 안들어가지다 왜?
/bin/bash 관련된 의존성 파일들을 복사해서 넣어줘야지만 복사가 가능하다
ldd 의존성 라이브러리 확인
root@hostos1:/BACKUP/myroot# ldd /bin/bash
linux-vdso.so.1 (0x00007fffc4732000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f2ffcc3e000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2ffca3a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2ffc649000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2ffd182000)
위에 있는 라이브러리들을 myroot안에 디렉터리를 만들고 넣어줘야 한다
mkdir -p /BACKUP/change_root/lib/x86_64-linux-gnu
mkdir -p /BACKUP/change_root/lib64
자 디렉터리를 만들어줬으면 이제 라이브러리들을 복사해 보자
cp /lib/x86_64-linux-gnu /BACKUP/change_root/lib/x86_64-linux-gnu/libtinfo.so.5
cp /lib/x86_64-linux-gnu/libdl.so.2 /BACKUP/change_root/lib/x86_64-linux-gnu/libdl.so.2
cp /lib/x86_64-linux-gnu/libc.so.6 /BACKUP/change_root/lib/x86_64-linux-gnu/libc.so.6
cp lib/x86_64-linux-gnu/libc.so.6 /BACKUP/change_root/lib/x86_64-linux-gnu/libc.so.6
모든 라이브러리들을 복사해 줬으면 다시
chroot /BACKUP/change_root /bin/bash를 실행해 보자
짜잔 들어가졌다!!
안에 무슨 파일이 있나 볼까?
ls
....
왜 안되지?
이게 바로 도커를 쓰는 이유 모든 bin파일을 이런식으로 등록해 줘야 한다
똑같이 /bin/bash와 똑같은 과정으로 /bin/ls를 등록시키면
짜잔
아래와 같이 이제 ls를 사용할 수 있게 되었다
ps -ef 로 프로세스 상에 떠있는 내 컨테이너를 확인해보자
다음과 같이 확인할 수 있다~~
도커없이 컨테이너 만들기 성공!!