cockscomblog?

cockscomb on hatena blog

macOSのコンテナ開発環境におけるVirtualization frameworkの採用

Docker Desktop for Mac

Docker Desktop for Macでは、仮想マシン上のLinuxでDockerを動かしている。仮想マシンにはhyperkitやQEMUが使われていた。が4.14.0からVirtualization frameworkがデフォルトで使われる。

Set Virtualization framework as the default hypervisor for macOS >= 12.5.

Virtualization frameworkmacOS内蔵の仕組みで、macOS 11で導入されてから、徐々に機能が拡張されている。Virtualization frameworkは高レベルなAPIで、より低レベルなAPIとしてmacOS 10.10から搭載されているHypervisor frameworkがあり、おそらくVirtualization frameworkもこれを利用している。(hyperkitやQEMUも利用している。)

Virtualization frameworkを使うと、Docker Desktopの設定でvirtiofsを有効にできる。現時点ではベータ扱いになっている。4.15.0でGAになった。おそらくVirtualizatoin frameworkのVZVirtioFileSystemDeviceConfigurationを利用しているのだろう。

virtiofsを有効にすると、ホストのmacOSとゲストのLinuxの間でのファイル共有が高速化される。ファイルの共有の遅さは、Docker Desktop for Macの積年の課題だった。

さて、Docker Desktopのロードマップを見ると、今後はApple Siliconでx86_64アーキテクチャのバイナリを実行する際にRosetta 2を利用することが検討されている検討されていたが、4.16.0でベータリリースされた

macOS 13では、Virtualization framework上のLinuxでもRosetta 2が利用できる機能が追加されており、これを利用するつもりだろう。

Rosetta 2はAOT変換(とJIT変換)によって、Apple Silicon上でx86_64のバイナリをかなり高速に実行させられることが知られている。現在、Apple Siliconでx86_64のDocker Imageを実行する際にはエミュレーションが行われており、ネイティブよりかなり遅い。Rosetta 2が利用できれば、一定の高速化が期待できる。

ということで、Docker Desktop for MacはVirtualizaton frameworkへの移行によって、高速化を達成しつつある。

Lima

ところで、Docker Desktop以外のソリューションはどうしているのかというと、Rancher DesktopにせよFinchにせよ、macOSLinuxを動かすというところではLimaを使っている。

LimaはQEMUを使っているが、最近ちょうどVirtualization frameworkのサポートが追加されつつあり、同時にvirtiofsも利用可能になる。

それだけでなく、Apple SiliconではRosetta 2によるx86_64バイナリの実行がサポートされようとしており、最新のベータにもこれが含まれている。

ということで、Lima 0.14に大注目だ。

まとめ

macOSでのコンテナ開発環境は、macOS上でどうやってLinuxを動かすかというところから始まっていて、最近ではmacOSに搭載されたVirtualization frameworkの採用が広がっている。そしてvirtiofsとRosetta 2によって、開発体験が改善されつつある。Docker DesktopもLimaを採用する他のソリューションも同様に進歩していて、目が離せない。

筆者は現在、勤め先がDockerの有料プランを契約しているため、それを使っています。