Dockerは、Docker Desktop for Windowsの2.1.7.0 edgeリリースの一部として、新たなファイル共有サービスをリリースした。FUSE(Filesystem in Userspace)を採用したこの新しいファイル共有は、ホストとコンテナ間のよりシームレスなファイル共有を可能にするものだ。ホスト上のソースを編集して保存した変更を、コンテナ上でライブで確認することが可能になる。
今回のリリースにより、これまで試験的リリースだったgRPC FUSEシステムが、今後はデフォルトになる。この変更によって、アプリをコンテナにホストした状態で、好みのIDEを使ってホストマシン上でファイルを編集する、というようにワークフローが改善される。SambaからFUSEにスイッチすることで、ファイルシステムは通常のWindowsプロセスとして動作するようになり、ドライブを共有する場合のAdministrator権限の必要がなくなる。コネクションを利用するためにドメイン認証に入ることも不要だ。
この変更に伴ってトラフィックも、DNS経由のルーティングではなく、ハイパーバイザソケット上を流れるようになる。トラフィックが仮想イーサネット/IPネットワークを流れなくなるため、この新たなアプローチでは、ファイアウォールポリシに影響されることもなくなる。これまでの実装では、企業のVPNクライアントやエンドポイントセキュリティソフトウェアにも影響を受けていたが、今後はそのようなことはない。
Dockerチームは、今回の新しいファイルシステムを、Sambaベーづの旧モデルと比較するベンチマークを行った。さらに、パフォーマンスの上限を表現するものとして、コンテナとホストでファイルを共有しない場合のユースケースとも比較した。DockerのテクニカルスタッフであるDavid Scott氏によれば、"最初の(キャッシュされていない)フェッチでもすでに以前のDesktopバージョンより高性能だが、2回目の(キャッシュされた)フェッチは60パーセントも高速"である。
FUSEは、非特権ユーザがカーネルコードを変更することなく、自身のファイルシステムを構築するためのソフトウェアインターフェースである。ファイルシステムはFUSEモジュールとともにユーザ空間で動作し、実際のカーネルインターフェースとのブリッジを提供する。
この新しい実装では、コンテナ上で動作するWebサーバからのファイル読み込み要求は、Linuxコマンドのread
をコールする。このコマンドは、カーネルのVFS(Virtual File System)層によって処理される。VFSはモジュール構造で、FUSEを含む複数のファイルシステム実装をサポートする。VM内で動作するのは、FUSEクライアントというヘルパプロセスだ。クライアントはDockerエンジンと同じ名前空間で動作する。
FUSEクライアントがホストのファイルシステムにアクセスする必要のある場合、ハイパーバイザソケット経由でホストに接続する。ハイパーバイザソケットは共有メモリによる通信メカニズムで、VM相互あるいはホストとの通信が可能である。この方法では、トラフィックが一般的な仮想ネットワークを越える必要がなくなるため、前述したようなさまざまなメリットがある。ファイルシステムへの要求が共有メモリに書き込まれると、WindowsカーネルのVMBus実装がそれを読み出す。これらの要求は、通常のWindowsプロセスとして動作するFUSEサーバによって受信される。FUSEサーバがWindows APIを使用してファイル操作を実行し、結果を呼び出し元に返すのである。
今回の変更によるもうひとつの改善は、ファイルが変更された場合のinotify
イベントの生成である。Linux上でファイルが更新されると、カーネルがinotify
イベントを発行する。アプリケーションはこのイベントをリッスンして、アクションを起こすことが可能だ。例えばソースファイルが変更された場合に、再コンパイルしてブラウザを更新することができる。
この機能はファイルシステムのパフォーマンス全般を改善するが、サードパーティ製のツールの中にも、ホストとコンテナ間のファイル共有の改善が可能なものがある。Telepresenceは、Datawireがオリジナルを開発したオープンソースのCNCFプロジェクトである。MacOSとLinux上で動作し、Kubernetes内で動作するサービスのライブコーディングやデバッグなどのローカル開発を可能にする。ksyncもLinux、MacOS、Windowsで利用可能なオープンソースのもうひとつの選択肢として、Kubernetes内で動作するサービスのローカル開発に使用することができる。
この機能は現在、Docker Desktop Edge 2.1.7.0リリースで使用することができる。stableチャネルへのプッシュを前に、Dockerチームは、リリースに対するフィードバックを広く募集中だ。