Docker Desktop とのファイル共有

Docker Desktopのユーザーからよく聞かれるトピックの1つは、ファイル共有です。 コンテナ内のソースコードを確認するにはどうすればよいですか? ボリュームマウントとバインドマウントの違いは何ですか? ファイル共有がLinuxよりも遅いのはなぜですか、どうすれば高速化できますか? このブログ投稿では、あなたが持っているオプション、いくつかのヒントとコツについて説明し、最後に私たちが現在取り組んでいることのスニークプレビューで終わります。

マウントとボリュームのバインド

docker run -it ubuntu bashUbuntuコンテナを実行するとします。 (1)コンテナには、Ubuntuイメージのファイルシステムに基づいて独自のファイルシステムがあることがすぐにわかります。(2)ファイルを作成、削除、変更できますが、変更はコンテナに対してローカルであり、コンテナが削除されると失われます。(3) コンテナーは、ホスト コンピューター上の他のファイルにアクセスできません。

したがって、自然な次の質問は、他のファイルをどのように表示できますか? また、コンテナは後で読み取って他のコンテナで使用できるデータをどのように書き込むことができますか? これがバインドマウントとボリュームの出番です。 これらは両方とも、 -v フラグ docker run を使用して、コンテナーと共有するいくつかのファイルを指定します。

ほとんどの人が最初に遭遇するオプションは、ローカルファイルシステムの一部がコンテナと共有されるバインドマウントです。 たとえば、

docker run -it -v /users/stephen:/my_files ubuntu bash

その後、ファイルは /users/stephen コンテナ内で利用可能 /my_files になり、そこで読み書きできるようになります。 これは非常にシンプルで便利ですが、Docker Desktopを使用している場合は、次のセクションで説明する理由から、名前付きボリュームの方がパフォーマンスが向上する可能性があります。

2番目のオプションである名前付きボリュームは、Dockerによって管理されるファイルシステムです。 のようなコマンドを使用して docker volume create new_vol名前付きボリュームを作成し、フラグを再度使用して -v コンテナで共有できます。

docker run -it -v new_vol:/my_files ubuntu bash

これらのボリュームは、コンテナーが削除された後も保持され、他のコンテナーと共有できます。 また、最近追加した [ボリューム] タブを使用して、Docker Desktop UI からコンテンツを参照することもできます (Docker Personal を含むすべてのユーザーが無料になりました)。

パフォーマンスに関する考慮事項

オプション間のパフォーマンスの違いを理解するには、まずDockerDesktopがどのように機能するかについて簡単に説明する必要があります。 多くの人が、Docker Desktopは一部のオープンソースツールの上にあるUIにすぎないと想像していますが、それはそれが何であるかのほんの一部にすぎません。 Docker Desktopは基本的に、MacまたはWindowsマシン上でLinuxコンテナを開発および実行するための環境であり、ホストにシームレスに統合されているため、ネイティブで実行されているように見えます。 これを行うには、Docker エンジンとコンテナーを実行する Linux VM (または必要に応じて Windows 上の WSL 2 環境) を設定し、ホストと VM の間で CLI コマンド、ネットワーク、およびファイルを渡すことによって行われます。

マックウィンドウズ

残念ながら、仮想化の性質上、ホストと VM の境界を越える際に避けられない小さなオーバーヘッドが常に発生します。 これはごくわずかですが、巨大なソースツリーと多くの読み取りと書き込みがある開発環境では、合計され、パフォーマンスに目に見える影響を与える可能性があります。 また、Docker Desktopは基盤となるVMを隠すのに非常に優れた仕事をしているため、なぜこれが起こっているのかは明らかではありません。 Linuxでは、コンテナはバインドマウントされたファイルシステムに直接アクセスでき、MacとWindowsでの実装は「ネイティブに感じられる」ため、人々は直感的に同じパフォーマンスを期待しています。

名前付きボリュームは、VM 独自のファイルシステム内に作成されるため、Linux マシンと同じくらい高速であるため、同じ問題に悩まされることはありません。 WSL 2 では、Docker が管理するのではなく、Windows がファイル共有を管理しますが、Windows ファイル システムからマウントされたファイルは低速になる可能性があり、名前付きボリュームは高速ですが、この場合は別のオプションがあります: Linux ファイル システムに格納されているファイルも WSL VM 内にあるため、高速です。

おすすめの方法とヒント

これにより、パフォーマンスを最適化するための主なヒントが得られます。 最初はバインドマウントを使用するのが便利で、ユースケースに適している場合があります。 ただし、パフォーマンスが問題になる場合は、(1)共有する必要があるものだけを共有していることを確認し、(2)バインドマウント以外の方法で共有できるものを検討してください。 VM 内にファイルを保持するには、名前付きボリューム、WSL 内の Linux ファイル、コンテナー独自のファイル システムなど、いくつかのオプションがあります。 どちらを使用するかは、ユース ケースによって異なります。 例えば:

  • アクティブに編集しているソース・コードは、バインド・マウントの適切な使用法です
  • 大規模な静的依存関係ツリーまたはライブラリは、名前付きボリューム (WSL) に移動したり、コンテナー イメージにベイクしたりすることもできます
  • データベースは、名前付きボリュームまたは WSL に適しています
  • キャッシュ ディレクトリとログ ファイルは、名前付きボリュームまたは WSL (コンテナーが停止した後も保持する必要がある場合)、またはコンテナー独自のファイル システム (コンテナーが停止したときに消える可能性がある場合) に配置する必要があります。
  • コンテナーが必要としないファイルは、まったく共有しないでください。 特に、ホームディレクトリ全体を共有しないでください。 必要なファイルにいつでもアクセスできるように、これを習慣的に行う人もいますが、Linuxとは異なり、「無料」ではありません。

大規模または高トラフィックのディレクトリにバインドマウントが本当に必要な場合の残りのオプションの1つは、Mutagenやdocker-syncなどのサードパーティのキャッシュ/同期ソリューションです。 これらは基本的に、読み取り/書き込みアクセスを高速化するために VM 内にファイルをコピーし、コピーとホスト間の同期 (一方向または双方向) を処理します。 ただし、管理には追加のコンポーネントが含まれるため、可能な場合は名前付きボリュームが引き続き推奨されます。

今後の展開

長年にわたり、さまざまなファイル共有実装を使用してきました (Windows Hyper-V では Samba と gRPC FUSE、Mac では osxfs と gRPC FUSE、WSL 2 では Windows で 9P を使用)。 時間の経過とともにパフォーマンスがいくらか向上しましたが、どれもネイティブのパフォーマンスに匹敵するものはありませんでした。 しかし、私たちは現在、virtiofsに基づく非常に有望な新しいファイル共有の実装を実験しています。 Virtiofs は、ホストと VM 間でファイルを共有するために特別に設計された新しいテクノロジーです。 VM とホストがネットワーク経由ではなく同じマシン上で実行されているという事実を利用することで、パフォーマンスを大幅に向上させることができます。 私たちの実験では、いくつかの非常に有望な結果を見てきました。

このテクノロジーのプレビュー版 Docker Desktop for Mac は既にリリースされており、 公開ロードマップ (macOS 12.2 が必要) から入手でき、近日リリース予定の Docker Desktop for Linux でも使用する予定です。 バインドマウントをはるかに高速にできると考えています(ただし、適切なユースケースでは、名前付きボリュームまたはコンテナ独自のファイルシステムをお勧めします)。 私たちはあなたの経験を聞いてみたいです。

次のステップ

これらのトピックについてさらに詳しく知りたい場合は、Dockerキャプテンの1人であるJacob HowardがDockerCon 2021で行った「 Dockerファイルシステムの実用的なツアー」というタイトルの講演をお勧めします。 たった26分にたくさんの素晴らしい情報と実用的なアドバイスが詰め込まれています!

virtiofsに関する現在の作業の進捗状況を追跡するには、 公開ロードマップのチケットを購読してください。 そこでプレビュー ビルドを投稿しますので、ぜひ試してみて、フィードバックをお寄せください。

ドッカーコン2022

5月10日火曜日に開催されるDockerCon2022にご参加ください。 DockerCon は、次世代の最新アプリケーションを構築している開発者や開発チームにとってユニークな体験を提供する、無料の 1 日の仮想イベントです。 コードからクラウドにすばやく移行する方法と開発の課題を解決する方法について学びたい場合は、DockerCon 2022 でアプリケーションの構築、共有、実行に役立つ魅力的なライブ コンテンツが提供されます。 今すぐご登録ください https://www.docker.com/dockercon/