コンテナ
Linuxのしくみ
仮想マシンのための仮想的なハードウェアやカーネルが不要、ホストOSのカーネルを共有する
仮想マシンに必要な仮想化ソフトウェアのマシン起動、GRUBなどのブートローダー起動、ブートローダーからカーネル起動をスキップできる
ハードウェアアクセスによって物理マシンに制御を返す必要があったがその必要がない
システムコンテナ:lxc/lxd: Powerful system container and virtual machine manager
アプリケーションを複数動かせる環境を用意できる
アプリケーションコンテナ:昨今はこちらを指す
namespace
コンテナを実現するカーネルの機能
pid namespace: 独立したpid名前空間を見せる
root pid ns に存在するプロセスABCがあり、ns fooを作成してBCをそこで実行させるとroot pid nsにあるAからはBCが見えるが、ns foo からはAが見えない
https://scrapbox.io/files/6367ad70730c56001ea9ac52.png
このコマンド実行は id: 4026531836 の pid ns に属している
これが root pid ns、指定しない限りはinitをはじめ全てのプロセスがroot pid nsに所属する
code:unshare.sh
sudo unshare --fork --pid --mount-proc bash
echo $$ # 1
bash を独自の pid ns で実行させる、ここでの pid ns においては pid -> 1
https://scrapbox.io/files/6367aeda82231b001d54c7f6.png
root pid ns とは異なるIDになっている
https://scrapbox.io/files/6367adaff60c7d00213e6c08.png
プロセス一覧に上記しか出てこない(見えない
https://scrapbox.io/files/6367ae1cb6d23c001d6b2713.png
root pid ns からはbashが見える
https://scrapbox.io/files/6367aebb321e240023386c3e.png
このpidから見たpid nsのIDを見ると独自のpid nsで調べたIDと同じになっている
user namespace: 独立したuid,pidを見せる
mount namespace: 独立したファイルシステムマウント状況を見せる
コンテナは、「独立したnamespaceを持ち他のプロセスとは実行環境が分かれている1つないし複数のプロセス」
ホストOSや他のコンテナに起因する問題はコンテナ自身からはわからない(見えないので)
セキュリティリスク
悪意のあるコンテナのユーザからホストOSまたは他のコンテナの情報を盗み見られる、攻撃するなどができてしまう
Docker runC というランタイムと違ったアプローチで安全性を高めるランタイムもある
Kata Containers - Open Source Container Runtime Software | Kata Containers
google/gvisor: Application Kernel for Containers