리눅스 컨테이너

김동현·2024년 5월 12일

Study

목록 보기
5/8
post-thumbnail

Linux

처음에는 맥북에서 시도했다. 하지만, 원하는 데로 동작하지 않아 구글링을 진행하다 해당 사이트를 만났다.
혹.. MacOS에서도 할 수 있는 방법이 있으시다면 공유해 주시면 감사하겠습니다 🙃

Container

네이버 사전 정의를 보면 아래와 같다.
화물 수송에 주로 쓰는, 쇠로 만들어진 큰 상자. 짐 꾸리기가 편하고 운반이 쉬우며, 안에 들어 있는 화물을 보호할 수 있는 장점이 있다.

출처

인터넷에 떠돌아 다니는 Docker ContainerVM를 비교하는 이미지를 본적이 있을 것이다!
컨테이너를 설명하는 이미지를 보면 Container Engine위에 Bins/Lib, App 이 차례대로 쌓여 있는 것을 확인할 수 있는데 왜 그런지 한 번 살펴보자 🧐

Chroot

커스텀 컨테이너를 만들기위해 먼저 알아야 할 명령어는 chroot명령어이다.

chroot는 change root의 축약어로 root경로를 변경하는 데 도움을 주는 명령어이다.

  1. ~ 경로에 container 폴더 생성

mkdir ~/containter

  1. container 폴더를 루트로 변경 시도

sudo chroot ~/container

🧐 check) sudo로 진행해야 하는 이유
아래 chroot 설명을 보면 루트 사용자 권한을 조작하는 사용만 사용 가능하다고 나와 있다

❗️명령어를 실행하면 위 이미지와 같은 에러가 발생하게 된다.
chroot 메뉴얼을 보면 root directory를 변경하고 command를 실행한다고 되어 있다.
-> sudo chroot ~/container 라고 입력하면 사실은 sudo chroot ~/container /bin/bash가 실행되는 것이다.
이 후 변경된 루트에서는 ~/container/bin에 있는 bash 쉘을 이용하는 터미널로 변경되게 된다!

  1. /bin/bash 파일 복사

chroot가 새로운 경로에 존재하는 bash를 실행할 수 있도록 ~/container/bin 경로에 bash 파일을 복사해 넣어주자.

mkdir ~/container/bin
cp /bin/bash ~/container/bin
sudo chroot ~/container

~/continer/bin 아래 bash가 정상적으로 복사되었지만, 동일한 에러가 발생하는 것을 볼 수 있다.
이는 bash를 실행할 때 필요한 라이브러리라 설치되어 있지 않기 때문이다.

  1. /bin/bash 의존 라이브러리 추가

ldd 명령어를 사용하면 지정한 프로그램/파일의 의존성을 살펴볼 수 있다.
/bin/bash의 의존 라이브러리를 한 번 살펴보자

위 의존 라이브러리를 추가해보자!

mkdir ~/container/lib64

cp /lib64/libtinfo.so.6 ~/container/lib64
cp /lib64/libdl.so.2 ~/container/lib64
cp /lib64/libc.so.6 ~/container/lib64
cp /lib64/ld-linux-x86-64.so.2 ~/container/lib64

  1. sudo chroot ~/container

위 4가지 library들을 복사해주면 아래와 같이 chroot를 통해 새로운 루트 경로로 만들어 줄 수 있다!

❗️ pwd, echo, history 와 같은 bash 내장 명령어는 사용할 수 있다.

하지만, 평소에 주로 사용하는 date, ls 와 같은 명령어는 찾을 수 없는 명령어라고 나온다. 이를 사용하기 위해서 chroot 명령어를 사용하기 위해 진행한 과정을 동일하게 진행하면 된다 :)

ldd ls <<< 의존 라이브러리 추가해주기!

Bin/libs

tree 명령어로 chroot로 변경할 폴더 구조를 찍어 보면 bin/lib64가 있는 것을 볼 수 있다.

폴더명이 완벽하게 일치하진 않지만 bin <> bins, lib <> lib64 대략 이런 식으로 진행되기에 VM과 Docker를 비교하는 이미지에 Bins/lib가 App 아래 있는 것 아닐까?!

컨테이터(이해 불가능의 원칙)

여기에 프로세스 격리만 추가되면 우리가 이야기하는 리눅스 컨테이너 기술이 된다.

리눅스 컨테이너는 커널을 공유하지만, 프로세스가 격리되는 것을 말한다.

🤔 어디로부터의 격리일까?
다른 프로세스로부터의 격리이다.

docker로 nginxmysql 컨테이너를 실행시켰다.
docker ps를 찍어보면 아래와 같이 두 개의 컨테이너가 띄어져 있는 것을 볼 수 있다

🔥 호스트는 격리된 프로세스를 볼 수 있다.

docker top CLI를 통해 컨테이너 내에 실행되고 있는 프로세스 목록을 찍어보면 root 프로세스와 nginx, mysql만 돌고 있는 것을 볼 수 있다.

-> 🔥 컨테이너는 호스트를 볼 수 없다!
컨테이너 관점에서는 마치 자신이 독립적인 환경을 가진 것으로 인식한다!

컨테이너 자신 말고 다른 프로세스는 볼 수가 없다. < 격리되어 있다!
mysql은 nginx를 모른다.
nginx는 mysql을 모른다.

아래와 같은 기능을 제공하는 기술을 컨테이너라고 부르기로 했다.
1. 다른 프로세스로부터의 격리
3. 루트 디렉토리 격리
2. 리눅스 커널 공유

참고 자료

profile
달려보자

0개의 댓글