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 frameworkはmacOS内蔵の仕組みで、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にせよ、macOSでLinuxを動かすというところではLimaを使っている。
LimaはQEMUを使っているが、最近ちょうどVirtualization frameworkのサポートが追加されつつあり、同時にvirtiofsも利用可能になる。
Lima v0.14.0-beta.0 experimentally supports Virtualization.framework for faster filesystem sharing (virtiofs) on macOS 13:
— Akihiro Suda (@_AkihiroSuda_) 2022年11月16日
```
brew install --HEAD lima
limactl start template://experimental/vz
```https://t.co/kmpAsyyvgT
Thanks to balajiv113 and @codehex
それだけでなく、Apple SiliconではRosetta 2によるx86_64バイナリの実行がサポートされようとしており、最新のベータにもこれが含まれている。
ということで、Lima 0.14に大注目だ。
まとめ
macOSでのコンテナ開発環境は、macOS上でどうやってLinuxを動かすかというところから始まっていて、最近ではmacOSに搭載されたVirtualization frameworkの採用が広がっている。そしてvirtiofsとRosetta 2によって、開発体験が改善されつつある。Docker DesktopもLimaを採用する他のソリューションも同様に進歩していて、目が離せない。
筆者は現在、勤め先がDockerの有料プランを契約しているため、それを使っています。