도커 없이 컨테이너를 만들어보자

yk hi·2021년 7월 30일
1

docker

목록 보기
3/16

도커는 어떻게 컨테이너를 만들까?

도커는 리눅스의 LXC를 이용하여 컨테이너를 생성한다

LXC의 3대 기능

namespace

1.PID namespace
PID와 프로세스를 분리 (systemd와 분리)
namespace가 다른 프로세스는 서로 엑세스 불가능

2.Network namespace(netns)
네트워크 디바이스, IP ADress, 포트 번호, 라우팅 테이블, 필터링 테이블 등 네트워크 리소스를 namespace 별로 할당 가능

3.mount namespace

  1. UTS namespace
    namespace 별로 host명과 e도메인명을 독자적으로 사용가능

5.UID namespace

6.IPC namespace

Cgroup

  1. 프로세스 및 스레드를 그룹화하여 관리

2.HostOS의 CPU, 메모리같은 리소스를 그룹별로 제한 가능

3.컨테이너가 다른 컨테이너에게 영향을 주는 것을 막는다

Chroot

프로세스로부터 컨테이너 프로세스를 격리한다

컨테이너에서 새로운 왕을 뽑는다(컨테이너 상에서 새로운 root를 만든다)

이 중에서 도커없이 컨테이너 생성하기에 필요한 친구는 누굴까?

바로 Chroot이다

자 새로운 왕을 만들어 보자

우선 새로운 왕이 될 디렉터리를 만들어야 한다.

/BACKUP/change_root 디렉터리를 도커 없이 컨테이너로 만들어보자

컨테이너를 만드는 명령어

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 로 프로세스 상에 떠있는 내 컨테이너를 확인해보자

다음과 같이 확인할 수 있다~~

도커없이 컨테이너 만들기 성공!!

profile
엔지니어의 실력은 고통의 총합이다 <임백준 칼럼>

0개의 댓글

관련 채용 정보