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

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

인터넷에 떠돌아 다니는 Docker Container와 VM를 비교하는 이미지를 본적이 있을 것이다!
컨테이너를 설명하는 이미지를 보면 Container Engine위에 Bins/Lib, App 이 차례대로 쌓여 있는 것을 확인할 수 있는데 왜 그런지 한 번 살펴보자 🧐
커스텀 컨테이너를 만들기위해 먼저 알아야 할 명령어는 chroot명령어이다.
chroot는 change root의 축약어로 root경로를 변경하는 데 도움을 주는 명령어이다.
~경로에 container 폴더 생성
mkdir ~/containter
- container 폴더를 루트로 변경 시도
sudo chroot ~/container🧐 check)
sudo로 진행해야 하는 이유
아래 chroot 설명을 보면 루트 사용자 권한을 조작하는 사용만 사용 가능하다고 나와 있다

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

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

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

- sudo chroot ~/container

위 4가지 library들을 복사해주면 아래와 같이 chroot를 통해 새로운 루트 경로로 만들어 줄 수 있다!
❗️ pwd, echo, history 와 같은 bash 내장 명령어는 사용할 수 있다.
하지만, 평소에 주로 사용하는 date, ls 와 같은 명령어는 찾을 수 없는 명령어라고 나온다. 이를 사용하기 위해서 chroot 명령어를 사용하기 위해 진행한 과정을 동일하게 진행하면 된다 :)
ldd ls <<< 의존 라이브러리 추가해주기!
tree 명령어로 chroot로 변경할 폴더 구조를 찍어 보면 bin/lib64가 있는 것을 볼 수 있다.

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

여기에 프로세스 격리만 추가되면 우리가 이야기하는 리눅스 컨테이너 기술이 된다.
리눅스 컨테이너는 커널을 공유하지만, 프로세스가 격리되는 것을 말한다.
🤔 어디로부터의 격리일까?
다른 프로세스로부터의 격리이다.docker로
nginx와mysql컨테이너를 실행시켰다.
docker ps를 찍어보면 아래와 같이 두 개의 컨테이너가 띄어져 있는 것을 볼 수 있다
🔥 호스트는 격리된 프로세스를 볼 수 있다.
docker top CLI를 통해 컨테이너 내에 실행되고 있는 프로세스 목록을 찍어보면 root 프로세스와 nginx, mysql만 돌고 있는 것을 볼 수 있다.-> 🔥 컨테이너는 호스트를 볼 수 없다!
컨테이너 관점에서는 마치 자신이독립적인 환경을 가진 것으로 인식한다!
컨테이너 자신 말고 다른 프로세스는 볼 수가 없다. <
격리되어 있다!
mysql은 nginx를 모른다.
nginx는 mysql을 모른다.
아래와 같은 기능을 제공하는 기술을
컨테이너라고 부르기로 했다.
1. 다른 프로세스로부터의 격리
3. 루트 디렉토리 격리
2. 리눅스 커널 공유