検査容器隔離



以下の実験をMacOS(v 11.1)で行った.

Vagrantのインストール


VirtualBoxで仮想マシンを構成するにはVagrantをインストールします.
# brew를 이용하여 설치
$ brew install --cask vagrant

# 설치 확인
$ vagrant --version

VirtualBoxのインストール


Macバージョン6.1.28以降、ホストネットワークのみの帯域幅制限のため、6.1.26バージョンの使用を推奨します.
https://download.virtualbox.org/virtualbox/6.1.26/

Vagrant -> VirtualBox -> VM


Valgrantは、Valgrantfileを使用して仮想マシンを構成し、どのBoxファイルを使用するか、および仮想マシンのハードウェア設定(CPU、メモリサイズ、ネットワークなど)を定義します.
Valgrantfileを設定した後、遊泳するsshコマンドで接続します.
|Valgrantfileは、Gashidaが提供する🙏
# Ubuntu 배포 관련 Vagrantfile 파일 다운
$ curl -O https://raw.githubusercontent.com/gasida/NDKS/main/1/Ubuntu/Vagrantfile

# vagrant 프로비저닝
$ vagrant up

# Ubuntu SSH 접속
$ vagrant ssh
仮想マシンに接続した後、アカウント情報とバージョンを表示します.
# 현재 사용 계정 정보 확인
$ whoami

# 버전 확인
$ lsb_release -a

ドッキングコンテナの取り付け


Install link
インストール後、プロセス、ネットワーク情報などを表示します.
# 프로세스 확인
$ ps -ef

# 네트워크 정보 확인
$ ip -c addr

# 이더넷 브리지 정보 확인
$ brctl show

コンテナ分離


ネーミングスペースは、プロセスを実行するときにシステムのリソースを分離して実行するのに役立つ機能です.
単一のネーミングスペースでは、1つのシステムのプロセスは基本的にシステム内のリソースを共有して実行されます.実際、Linuxでは、最初のプロセス(init)に割り当てられたネーミングスペースは、サブプロセス共有で使用される構造から構成される.
以下に示すように、ネーミングスペースを表示します.

(O’REILLY—Networking and Kubernetes)
上の図に示すように、ノードはUbuntuホストで、青いブロックはコンテナを表します.図に示すように、UID、PID、NET、IPCのネーミングスペースはホストから隔離されている.

PID


例は、異なるネーミングスペースのPIDを示します.
PIDネーミングスペースは、プロセスIDを分離できるネーミングスペースです.Linuxでは、PIDがinitプロセス1を開始し、それ以外のすべてのプロセスには常に1より大きいPIDが与えられる.
ハブのように新しいPIDネームスペースに分離したらどうなりますか?
👉 PIDは再び1から始まる.ただし、このプロセスはデフォルトネームスペースと分離されたPIDネームスペースの両方に属し、分離された新しいネームスペースではPIDが1から始まるが、デフォルトネームスペースの観点から、あるプロセスでプロセスが分岐するため、1より大きいPID値を持つ.
( https://netpple.github.io/docs/make-container-without-docker/container-internal-2 )pstree -pコマンドで確認できます.
詳細については、ここです。を参照してください.

実践による検証

# Ubuntu 컨테이너 bash 접속 후 명령어 실행
$ ![](https://media.vlpt.us/images/dojun527/post/eca517ce-ae3b-4aa6-b9ff-757e1d9106b1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-01-12%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.58.28.png)

# 현재 bash 쉘의 프로세스 ID
$ ps $$
# 컨테이너 내부의 네임스페이스 정보
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Jan 12 14:59 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 ipc -> 'ipc:[4026532260]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 mnt -> 'mnt:[4026532258]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 net -> 'net:[4026532263]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 pid -> 'pid:[4026532261]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 pid_for_children -> 'pid:[4026532261]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 12 14:59 uts -> 'uts:[4026532259]'
# 호스트 shell의 네임스페이스 정보
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Jan 12 15:01 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 net -> 'net:[4026531992]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 12 15:01 uts -> 'uts:[4026531838]'
📍 上の2つのネーミングスペースを比較すると、異なるipc、mnt、net、pid、uts->が表示されます.ホスト環境から隔離された環境です.
前述したように、コンテナはホストから分離されていますが、1つのプロセスで分岐して生成されるため、ホストからコンテナ内のプロセスにアクセスして終了できます.
# 터미널 1(컨테이너) : Ubuntu 컨테이너 bash 접속 후 명령어 실행
$ sleep 1000


# 터미널 2(호스트)
$ ps -C sleep
    PID TTY          TIME CMD
   4912 pts/0    00:00:00 sleep
   
# 컨테이너 내부에서 실행되고 있는 sleep 프로세스 kill
$ kill -9 4912
コンテナとホストのネーミングスペースを比較すると、Cgroupはホストのカーネルを共有しているため、同じです.
  • Cgroup:Linuxカーネル機能
  • プロセスのリソース(CPU、メモリ、ネットワークなど)の制限と分離に使用
    👉 コンテナは独立したオペレーティングシステムではなく、ホストカーネルを共有するLinuxプロセスです.

    参考資料


    https://www.44bits.io/ko/keyword/linux-namespace
    https://www.44bits.io/ko/post/is-docker-container-a-virtual-machine-or-a-process