コンテナーのアーキテクチャには、コンテナー化されたイメージ内のアプリケーション層、データ層、およびローカル ストレージが含まれます。 データは、アプリを効果的に実行し、ユーザーにコンテンツを提供するために不可欠です。
実行中のコンテナーは、独自のライフサイクルを超えて存在する必要があるファイルも生成します。 場合によっては、アプリケーションがユーザー生成コンテンツ、データベース コンテンツ、ログ ファイルなどに継続的にアクセスする必要があるため、コンテナー間でこれらのファイルを共有する必要があります。 基盤となるホストファイルシステムを使用することもできますが、Dockerボリュームを永続ストレージとして使用することをお勧めします。
Docker ボリュームは、基になるホスト上のディレクトリを表し、 Docker ランタイムによって管理されるスタンドアロンのストレージ ボリュームです。 ボリュームの利点の 1 つは、永続的なストレージの場所を指定する必要がないことです。 これはDocker内で自動的に行われ、ハンズオフです。 Docker ボリュームの主な目的は、ホストとプラットフォーム間で名前付き永続ストレージを提供することです。
この記事では、ボリュームを活用する方法、Docker Desktop のボリューム管理に関する簡単なヒント、役立つ一般的なユース ケースについて説明します。 飛び込みましょう。
ボリュームの操作
Docker ボリュームを操作するには、次の操作を実行できます。
-v (--volume)
コマンドでdocker run
パラメーターを指定します。ボリュームがまだ存在しない場合は、これにより作成されます。- パラメーターを
volumes
Docker 作成ファイルに含めます。 - ボリュームの作成手順をより細かく制御するために実行
docker volume create
し、その後、1 つ以上のコンテナーにマウントできます。 - ホストで使用可能なさまざまな Docker ボリュームを表示するために実行します
docker volume ls
。 - 永続ボリュームを削除するために実行します
docker volume rm <volumename>
。 - ボリュームの構成を表示するために実行します
docker volume inspect <volumename>
。
CLI は便利ですが、Docker Desktop を使用してボリュームを簡単に作成および管理することもできます。 ボリューム管理は、以前に ブログで発表したv3.5以降のDockerデスクトップの重要な更新の1つです。
次のスクリーンショットは、Docker デスクトップ内のボリューム インターフェイスを示しています。
Docker デスクトップを使用すると、次の操作を実行できます。
- ボタンをクリックするだけで新しいボリュームを作成できます。
- 各ボリュームに関する重要な詳細 (名前、ステータス、変更日、およびサイズ) を表示します。
- 必要に応じてボリュームを削除します。
- インターフェイスを介してボリュームの内容を直接参照します。
ボリューム管理を容易にするためのクイックヒント
Dockerデスクトップを最大限に活用するには、いくつかの便利なプロセスに慣れることを意味します。 Docker ボリュームを管理するための簡単なヒントをいくつか見ていきましょう。
不要なボリュームを削除してスペースを節約する
Docker デスクトップ内で各ボリュームのサイズを表示するのは簡単です。 サイズ列を見つけてそれに応じて並べ替え、最も多くの領域を消費しているボリュームを表示します。 ボリュームの削除は自動的には行われないため、このプロセスを自分で管理する必要があります。
リストから削除するボリュームを見つけて選択し、右側のゴミ箱アイコンまたはそのリストの上に表示される赤い[削除]ボタンをクリックするだけです。 これは、ローカルディスク領域を節約するのに最適です。 このプロセスには数秒かかり、Docker Desktopは、コマンドに最適な docker volume -f <volumename>
アクティブなボリュームを誤って削除するのを防ぎます。
バッチボリューム選択の活用
Docker Desktop v4.7+ では、複数の非アクティブなボリュームを選択して同時に削除できます。 または、CLI コマンドを使用してこれを行うこともできます docker volume prune
。
ボリュームには重要なデータが含まれている可能性があるため、ボリュームを安全に削除できることを確認してください。 現在、削除またはプルーニングされたボリュームからデータを回復する方法はありません。 複数のボリュームをジャグリングしながら重要なアプリケーションデータを消去する方が簡単なので、このCLIコマンドではもう少し注意してください。
ボリューム内のデータの管理
また、ボリューム内の特定のデータを削除したり、ボリュームからデータを抽出 (および保存) して外部で使用することもできます。 ファイル項目の右側にある3ドットメニューを使用して、データを削除または保存します。 また、ボリュームに保存されているファイルのコレクションを使い慣れたリスト形式で簡単に表示できるため、重要なデータとアプリケーションの依存関係がどこにあるかを理解するのに役立ちます。
一般的で賢いユースケース
名前付きボリュームでのデータの永続化
バインドマウントよりも名前付きボリュームを使用または切り替える主な理由 (ソースの場所を管理する必要があります) は、ストレージの簡素化です。 ファイルの保存場所を気にせず、再起動後も確実に保持する必要があるかもしれません。
また、LinuxまたはmacOSで名前付きボリュームのパフォーマンスを議論することもできましたが、 Docker Desktopのv4.6リリース以降はそうではなくなりました。
名前付きボリュームが理想的な領域は他にもいくつかあります。
- より大きな静的な依存関係ツリーとライブラリ
- MySQL、MariaDB、SQLite などのデータベース シナリオ
- ログ ファイルの保存とキャッシュ ディレクトリの追加
- 異なるコンテナ間でのファイルの共有
名前付きボリュームでは、ストレージを意味的に記述する機会も得られ、必須でない場合でもベストプラクティスと見なされます。 これらの識別子は、視覚的に、またはCLIコマンドを使用してより簡単に整理するのに役立ちます。 結局のところ、特定の名前は、ランダム化された英数字文字列よりもはるかに覚えやすいです(これらの複雑な文字列をまったく覚えている場合)。
読み取り専用ボリュームによるテストとセキュリティの向上
ほとんどの場合、実行中のコンテナー化されたワークロードに対して読み取りおよび書き込みストレージ エンドポイントを提供する必要があります。 ただし、読み取り専用ボリュームには特典があります。 たとえば、実際のデータを上書きせずにアプリケーションがデータ バックエンドにアクセスするテスト シナリオがあるとします。
さらに、読み取り専用のデータ ボリュームによって改ざんが減少するセキュリティ シナリオが存在する可能性があります。 攻撃者はファイルにアクセスする可能性がありますが、ファイルシステムを変更することはできません。
読み取り/書き込みアクセスを必要とする サーバー アプリケーションをスピンアップ しているが、コンテナーの実行間でデータを保持する必要がないというニッチなシナリオに遭遇することさえあります。 NGINXとApacheは、重要なPIDまたはロックファイルに対する書き込み権限を特に必要とする場合があります。 読み取り専用ボリュームは引き続き利用できます。 デスティネーション・ファイルシステムの場所を示す フラグを追加する --tmpfs
だけです。
Docker では、以下に示すオプションを使用して :ro
、任意のボリュームを読み取り専用として定義できます。
docker run -v demovolume:/containerpath:ro my/demovolume
クラウドストレージの活用
ローカルストレージは優れていますが、アプリケーションを効果的に実行するためにクラウドベースのデータ共有に依存している可能性があります。 AWS と Azure は人気のあるプラットフォームであり、ビルド内でそれらを活用したいのは理解できます。
Docker の Cloudstor プラグインを使用して、Docker for AWS および Docker for Azure 用の永続的なクラウド ストレージ ドライバーを設定できます。 これにより、CLI を使用してインストールした後にクラウド中心のボリュームを起動および実行できます。 Cloudstorのセットアップ、さらにはコンパニオンNGINXサービスの開始の詳細については、 こちらをご覧ください。
共有オブジェクトストレージはどうですか? NFS または Amazon S3 の外部へのファイルの書き込みをサポートするドライバーを使用してボリュームを作成することもできます。最も重要なデータをアプリケーションロジックに取り組むことなくクラウドに保存できるため、時間と労力を節約できます。
ドッカー作成を使用したボリュームの共有
コンテナー間で Docker ボリュームを共有できるため、これらは Docker 作成 シナリオに最適なソリューションです。 割り当てられた各コンテナーには、ボリューム パラメーターを含めることも、コンテナー間でボリュームを共有することもできます。
ボリュームを含む Docker 作成ファイル は次のようになります。
services: db: # We use a mariadb image which supports both amd64 &amp;amp;amp;amp;amp;amp;amp; arm64 architecture #image: mariadb:10.6.4-focal # If you really want to use MySQL, uncomment the following line image: mysql:8.0.27 command: '--default-authentication-plugin=mysql_native_password' volumes: - db_data:/var/lib/mysql restart: always environment: - [email protected] - MYSQL_DATABASE=wordpress - MYSQL_USER=wordpress - [email protected] expose: - 3306 - 33060 wordpress: image: wordpress:latest ports: - 80:80 restart: always environment: - WORDPRESS_DB_HOST=db - WORDPRESS_DB_USER=wordpress - [email protected] - WORDPRESS_DB_NAME=wordpress volumes: db_data:
このコードは、という名前の db_data
ボリュームを作成し、 db
コンテナー内にマウントします /var/lib/mysql
。MySQL コンテナーが実行されると、そのファイルがこのディレクトリに格納され、コンテナーの再起動間で保持されます。
Docker ボリュームとその管理方法の詳細については、 ボリュームの使用に関するドキュメント を参照してください。
結論
Docker ボリュームは、Docker コンテナー ランタイム用の便利なファイル ストレージ ソリューションです。 また、複数のコンテナー間で同時にデータを共有するための推奨される方法でもあります。 Dockerボリュームは永続的であるという事実を考えると、重要なデータの保存とバックアップを可能にします。 また、コンテナー間のストレージの集中化も可能になります。
また、ボリュームの操作、強力なユースケース、および CLI とは別に Docker Desktop が提供するボリューム管理の利点についても説明しました。
Docker デスクトップをダウンロードして 、より簡単なボリューム管理を開始します。 ただし、ボリューム管理機能(およびユースケース)は常に進化しています。 Docker Desktop の最新リリースを最新の状態に保つには、進化する 変更ログをブックマークすることを忘れないでください。