« ^ »

macOSでpodmanがコンテナ環境をどのように整備しているかについて考える

所要時間: 約 3分

普段のソフトウェアの開発のコンテナ環境には 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      <-+       |
                               <---------+