普段のソフトウェアの開発のコンテナ環境には Docker Desktop for Mac
を使っている。これはとても良くできていて概ね満足している。 Docker
は素晴しいけれど、リソースがたくさん必要だったり、動作の遅さだったり、細かな挙動に不満がないわけではない。僕はコンテナ技術を使いはするけれど、その内部実装についてそれほど詳しい訳ではない。最近ではDocker以外のコンテナ環境の選択肢もいろいろと登場している。そこで他のコンテナ環境も使いつつ、コンテナ技術の内部に少しだけ踏み込んで考えてみる。
podmanはhttps://github.com/containers/podmanで開発管理されているコンテナ環境だ。どうやらRedHatが開発しているらしい。podmanをmacOS上で使用する時には、バーチャンルマシンを実行し、その上でpodman経由でコンテナを動作させる。このバーチャルマシンは、最初はQEMUを使用して実現されていたが、現在の最新版はapplehvというバーチャルマシンによって実現されるようになったらしい。僕は、このapplehvというバーチャルマシンがある事を知らなかった。そこでapplehvについて少し調べてみる事にした。
QEMUは、podmanとは直接関係のない独立したプロジェクトで、コンピュータのエミュレータであり、広く使われている。applehvは、どうやらそれとは違い、podmanのコンポーネントとして実装されていた1。しかし、そのソースコードを見てみると、その量は少ない。どうやらラッパーになっているようだ。ソースを眺めていると中心的な部分は、vfkitという外部のライブラリによって実現されている事が分かった。
vfkitは、macOSのVirtualization Frameworkを操作するコマンドラインツールキットらしい2。このソースコードはGoで記述されている。もののついでに、このソースコードも少し眺めてみると github.com/Code-Hex/vz
というライブラリが要所で使われていて、気になった。どうやらvzが、macOSのVirtualization FrameworkのGoバインディングのようだ3。
Virtualization frameworkはmacOSに組み込まれているバーチャルマシンの機構で、位置付けとしてはHypervisor frameworkの上位(つまりVirtualization frameworkは、Hypervisor frameworkを使う)となる。QEMUやhyperkitも、Hypervisor frameworkを使っているらしい4。
だいぶ対応関係が頭の中で整理されてきたので、絵を描いてみよう。
podman
| applehv-------+
| | vfkit -+ |
| | | | |
| | | vz | |
| | | | | |
| | +--|---+ |
| | | |
| +-------------+
| |
|
macOS V | |
| Virtualization Framework | QEMU | Hyperkit
| | | | | |
| V | |
| Hypervisor Framework <-+ |
<---------+