日記「仮想マシンとコンテナについて調べたこと」
仮想マシンとコンテナについて調べたので分かった範囲で残します。
仮想マシンについて
複数のOSを使いたい場合、仮想化の手段としては大きく2つあると思ってた。それは、OSの仮想化とマシンの仮想化。調べるとOSの仮想化というのはなくて、コンテナという技術だった。コンテナ技術がOSの仮想化のように書いてある記事も見かけたけど、コンテナについて調べていくとそれは違うんじゃないかなぁという印象。これは後述する。
コンテナを仮想化に含めないとすると、結局複数のOSを使いたい場合は仮想マシンしかない。
マシンの仮想化には大きく分けて2種類あるけどそのどちらのソフトウェアもハイパーバイザと呼ばれている。そのハイパーバイザには Type1, と Type2 の2種類がある。
Type1 はベアメタル・ハイパーバイザやネイティブ・ハイパーバイザと呼ばれている。ハードウェア上で動くのでこのソフトウェアがホストOSになる。Hyper-V や KVM, VMWare vSphere, Xen など。
Type2 はホスト型ハイパーバイザと呼ばれている。ホストOS(Windows や macOS, Linux など)の上で動くソフトウェア。Oracle VirtualBox や VMware Workstation は Type2 らしい。
ホストOSはハードウェア上で動く唯一のOSのことで、ゲストOSはその上で動くOSのことだと認識してる。なので、Type1 のハイパーバイザはそれ自身がホストOSになると理解している。
で、Hyper-Vが Type1 ってことは、Hyper-V を有効にしたり、WSL2 を使ったりするとホストOSだった Windows もゲストOSになるってことで、つまりハイパーバイザを介して動くようになる。これがどういうことかというとゲームするときに多少なりとも影響出るんじゃないのかな。対戦ゲームとかするならゲームするPCと開発用PCはわけたほうがいいのかな。
Hyper-V はパーティションと呼ばれる領域で仮想マシンを分けていて、ルートとなるパーティション(親パーティション/ルートパーティション)が必ず一つ存在するらしい。これはもともと入れてた Windows が親パーティションに割り当てられる(?)。この親パーティションは他の子パーティションを作成したり、子パーティションからのデバイスへのアクセス要求を処理したりする。
コンテナ
コンテナ技術について調べたけどまだ理解しきれてない感じがある。 コンテナには2種類ある。アプリケーションコンテナとシステムコンテナ。Docker で流行ってるコンテナはアプリケーションコンテナのことで、システムコンテナは古くからあるコンテナ技術らしい。
アプリケーションコンテナというのは、1機能1コンテナとして扱う。プロセス単位で扱うのは厳密には正しくないそうだけど正直よく分かってない。 システムコンテナは、仮想OSと呼ぶ方が近いのかもしれない。正直こっちもよく分かってない。システムコンテナの場合は、1コンテナに複数の機能が混ざってもいい。
コンテナはホストOSのカーネルを利用するので、同種類のOSじゃないとダメ。例えば、Linux の上に Windows のコンテナを立ち上げることはできない。Windows の方で Docker が使えるのは、昔は、 Hyper-V 上で Moby VM という仮想マシンを作ってそれを使って Docker が動いてた。今は WSL2 を使って Docker を使えるようになっている。WSL2 は Hyper-V 上で動く Linux カーネルのため、通常の Linux 上で動かす Docker と変わりない。
Docker で使われているコンテナの仕様は Open Container Initiative(OCI)によって標準化されている。コンテナイメージや、ランタイム、レジストリなどが定められている。そのため、この仕様に則っていれば Docker に限らずにコンテナ化することができるし、コンテナイメージを作って共有することができる。
システムコンテナのほうはこの仕様とは関係ないので Docker や同じ仕様で作られたイメージを使うことはできない(?)。Linux だと LXC/LXD などで作れる。
アプリケーションコンテナとシステムコンテナが共通しているのは、namespace や cgroup のような Linux カーネルの機能を使ってコンテナを実現している点。Linux はカーネルの互換性が高いのでそこに依存している。イメージ側が最新のカーネルにしかない機能を使っているいて、ホストOSのカーネルにその機能がないなら動かない。
おわりに
調べれば調べるほどわからなくなっていくけど前よりは理解している状態になったかなという感じ。これ以上はそれぞれのアプリを実際に使って理解を深めていくしかないかな。とくにコンテナ側は Docker や Kubernetes, LXD/LXC とか使ってみないとしっくりこない。あと Linux 側の知識がなくて理解できてない部分もあるかな。
参照した資料
仮想マシンに関して
仮想マシンとOS仮想化とは似て非なるもの | Think IT(シンクイット)
ハイパーバイザー (hypervisor) とは | Red Hat
Hyper-Vの実装--親パーティション | 日経クロステック(xTECH)
Hyper-V のアーキテクチャ | Microsoft Docs
Hyper-V のアーキテクチャ | Microsoft Docs
コンテナに関して
雲になったコンピュータ: コンテナーの世界!(1) -Virtuozzo、Soralis、Linux(LXC)、そしてDocker-
Linux Containers - LXD - イントロダクション
コンテナってなんだろう― 「コンテナ」の概要を知る | Think IT(シンクイット)
Linux Containers - LXD - イントロダクション
コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう - エンジニアHub|Webエンジニアのキャリアを考える!
Docker
Software Design 2021年12月号|技術評論社
イラストでわかるDockerとKubernetes (Software Design plus) | 徳永 航平 |本 | 通販 | Amazon
図解即戦力 仮想化&コンテナがこれ1冊でしっかりわかる教科書 | 五十嵐 貴之, 薄田 達哉 |本 | 通販 | Amazon
Dockerコンテナの仕組み -namespace、cgroup、overlayfs- - ネットワークエンジニアを目指して
俺は Linux コンテナについてなんにも解っていなかった 〜 haconiwa で学ぶ Linux コンテナ (1) 〜 | iret.media