検査容器隔離
以下の実験を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はホストのカーネルを共有しているため、同じです.
# 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はホストのカーネルを共有しているため、同じです.👉 コンテナは独立したオペレーティングシステムではなく、ホストカーネルを共有するLinuxプロセスです.
参考資料
https://www.44bits.io/ko/keyword/linux-namespace
https://www.44bits.io/ko/post/is-docker-container-a-virtual-machine-or-a-process
Reference
この問題について(検査容器隔離), 我々は、より多くの情報をここで見つけました
https://velog.io/@dojun527/컨테이너-격리-확인
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(検査容器隔離), 我々は、より多くの情報をここで見つけました https://velog.io/@dojun527/컨테이너-격리-확인テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol