コンテナーのストレージの概念
Windows コンテナーは、既定では、すべての入力と出力にエフェメラル ストレージ (スクラッチ領域) を使用します。 各コンテナーには独自のスクラッチ領域があり、すべてのファイル作成とファイル書き込みがキャプチャされるため、ホストにエスケープされることはありません。 コンテナー インスタンスが削除されると、スクラッチ領域で発生した変更はすべて破棄されます。 新しいコンテナー インスタンスが開始されると、インスタンスに新しいスクラッチ領域が用意されます。
レイヤー ストレージ
すべてのコンテナーは、コンテナー イメージから作成されます。 コンテナー イメージとは、ローカル コンピューターまたはリモート コンテナー レジストリに存在する多数のレイヤー (レイヤー ストレージと呼ばれます) に編成されたファイルの集合体のことです。 コンテナー イメージは、以下のために必要なユーザー モードのオペレーティング システム ファイルで構成されています。
- アプリのサポート
- アプリケーション ランタイム
- アプリの依存関係
- アプリの正常な実行に必要なその他のさまざまな構成ファイル
Windows 環境では、レイヤーは CimFS を使用して保存され、レイヤー ストレージの NTFS (New Technology File System)、ReFS、RefDisks でサポートされます。 ファイルの保存場所は docker-root
(または、コンテナーで同等のもの) 構成を使用して変更できますが、レイヤー ディレクトリ内のファイルは変更しないでください。 これらは、docker (または同等のコマンド) を使用して慎重に管理されます。
永続ストレージ
お使いのアプリでコンテナー内のデータを永続化できることが必要になる場合があります。 または、コンテナーのビルド時に含まれていなかったファイルをコンテナーに保存する必要がある場合もあります。 Windows コンテナーに永続的なストレージを提供するには、以下のいくつかの方法があります。
- バインド マウント
- 名前付きボリューム
バインド マウント
バインド マウントを使用すると、ホスト上のディレクトリをコンテナー内のディレクトリにマッピングすることで、コンテナーがホストとディレクトリを共有できるようになります。 バインド マウントは、コンテナーを再起動してスクラッチ領域を失った場合に、ローカル コンピューター上の使用可能なファイルを保存する場所が必要な場合に便利です。 また、複数のコンテナーとファイルを共有する場合にも役立ちます。
ただし、コンテナーを複数のマシン上で実行し、同じファイルにアクセスできるようにするには、代わりに名前付きボリュームまたは SMB (サーバー メッセージ ブロック) マウントを使用する必要があります。 C:\
などの機密性の高いディレクトリは、信頼されていないコンテナーにバインド マウントしないことが重要です。 このようなバインドにより、通常はアクセスできないホスト上のファイルを変更できるようになり、セキュリティ違反が発生する可能性があります。
次の例は、既定の読み取り/書き込みアクセスを使用して、コンテナー内の C:\data
に対するホスト上のフォルダー C:\ContainerData
のバインド マウントを作成する Docker コマンドを示しています。
docker run -v c:\ContainerData:c:\data
名前付きボリューム
名前付きボリュームの機能を使用すると、名前を指定してボリュームを作成し、コンテナーに割り当てて、同じ名前で後で再利用できます。 ボリュームを使用すると、コンテナー データの保存専用の特別な場所をホスト上に作成して管理できます。 作成時の実際のパスを追跡する必要はなく、名前だけを使用します。
Windows 上の Docker エンジンには、ローカル コンピューター上にボリュームを作成できる、組み込みの名前付きボリューム プラグインがあります。 複数のマシンで名前付きボリュームを使用する場合は、別のプラグインが必要になります。
次の例は、ローカル ボリューム c:data
にマップされた mycontainer という名前のコンテナーを作成して起動する docker コマンドを示しています。
docker volume create myvolume
docker run -v myvolume:c:\data microsoft/windowsservercore
バインド マウントはホスト マシンのディレクトリ構造とオペレーティング システム (OS) に依存しますが、Docker はボリュームを完全に管理します。 バインド マウントと比較して、ボリュームには以下のようないくつかの利点があります。
- ボリュームは、バインド マウントよりもバックアップや移行が簡単です。
- Docker CLI コマンドまたは Docker API を使用してボリュームを管理できます。
- ボリュームは Linux と Windows の両方のコンテナーで動作します。
- ボリュームは、複数のコンテナー間でより安全に共有できます。
- ボリューム ドライバーを使用すると、ボリュームをリモート ホストまたはクラウド プロバイダーに保存したり、ボリュームの内容を暗号化したり、他の機能を追加したりできます。
- 新しいボリュームの内容は、コンテナーによって事前に設定できます。
さらに、ボリュームを選択する方が、コンテナーの書き込み可能レイヤー (スクラッチ領域) にデータを永続化するより適していることがよくあります。 ボリュームでは、(バインド マウントと同様に) それを使用するコンテナーのサイズが増えることはありません。また、ボリュームの内容は、特定のコンテナーのライフサイクルの外部に存在します。