Docker Composeは、Dockerを使用したマルチコンテナアプリケーションの管理とデプロイを簡素化するために設計された強力なオーケストレーションツールです。docker-compose.ymlファイルが、1つのファイル内で複数のサービス、ネットワーク、ボリュームを持つ複雑なアプリケーションを定義することで、デプロイを合理化します。Docker Composeを使用する上で欠かせないことの1つに、ボリュームを使用した永続的なデータの管理があります。

この記事では、Docker Composeで永続データを扱う上でボリュームを使用することの重要性を説明し、ボリュームを効果的に使用する方法を具体例を用いてご紹介します。

Dockerボリュームとは

Dockerボリュームは、エフェメラルコンテナにより生成される永続データを保存・管理する重要なエコシステムコンポーネントです。これにより、コンテナを削除または更新した後でもデータを永続化でき、ルーティーン操作中に重要なアプリケーションデータが失われずに済みます。

ボリュームはコンテナのファイルシステムから切り離され、簡単にバックアップしたり、複数のコンテナ間で共有したり、ホスト間で移行したりできます。

バインドマウント(ホストシステムからコンテナへのディレクトリマウント)よりもボリュームを使用する主な利点は、その移植性です。ボリュームは異なるホストやコンテナ間で素早く移動できる一方で、バインドマウントはホストシステム上の特定のディレクトリに結びつける必要があります。

この移植性により、コンテナベースのアプリケーションで、より柔軟で効率的なデータ管理が可能になります。また、ボリュームは様々なストレージドライバと互換性があるため、特定のユースケースに最適なストレージソリューションを選択することができます。

Dockerボリュームの種類

Dockerボリュームはコンテナベースのアプリケーションでデータを管理するのに不可欠です。ボリュームには、名前付きボリュームと匿名ボリュームの2種類があります。このセクションでは、2つのタイプの主な違いを掘り下げ、アプリケーションでデータを管理する方法を示します。

名前付きボリュームと匿名ボリュームは目的が異なり、制御・管理機能にも違いがあります。一般的に、人間が読める識別子と管理のしやすさから、ほとんどのケースで名前付きボリュームが好まれますが、その利点を最大限に生かすためには、両タイプの機能を理解することが不可欠です。

名前付きボリューム

名前付きボリュームはユーザー定義の名前を持つため、識別、管理、複数のコンテナ間での共有が容易です。Dockerは名前付きボリュームを作成して管理し、そのデータをホストシステム上の特定の場所に保存します。この場所は通常、Dockerのインストールディレクトリ内で、ボリューム名に対応する一意のID下になります。

名前付きボリュームは、人間が読める識別子を使って簡単に参照や操作ができるため、制御と柔軟性の面で優れています。

Dockerで名前付きボリュームを作成するには、以下を実行します。

docker volume create my_named_volume

匿名ボリューム

名前付きボリュームとは異なり、匿名ボリュームにはユーザー定義の名前はありません。その代わりに、Dockerがコンテナを作成する際に、自動でボリュームに一意のIDが割り当てられます。

一般的に、人間が読める識別子が介在しないことで、ボリュームの管理と保存が難しくなります。Dockerによりボリュームが自動的に作成されるため、匿名ボリュームは一時的なストレージとして使用するのが一般的です。また、コンテナ作成時に名前付きボリュームを指定しなかった結果として選択されることもあります。

匿名ボリュームでコンテナを作成するには、以下を実行します。

docker run -v /data nginx

このコマンドは、nginxコンテナ内の/dataディレクトリに匿名ボリュームをマウントするものです。nginxは、ボリュームをマウントするコンテナの名前に置き換えることができます。

Docker Composeでボリュームを作成・管理する方法

Docker Composeでは、docker-compose.ymlファイル内でボリュームを定義できるため、ボリュームの作成と管理が簡単になります。このファイルにはアプリケーションのサービス、ネットワーク、ボリュームの設定が記述され、アプリケーションのリソースを一箇所で簡単に管理できます。

1. Docker Composeでボリュームを定義する

docker-compose.ymlファイルで名前付きボリュームを作成するには、volumesキーで定義します。必要に応じて、ボリュームドライバやオプションも指定可能です。

2. ボリュームをコンテナにマウントする

ボリュームをコンテナに紐付けるには、docker-compose.ymlファイルのservice定義内でvolumesキーを使用します。ボリューム名の後にコロンを続け、ボリュームをマウントするコンテナのパスを指定します。

同じボリューム名を使用することで、複数のコンテナ間でボリュームを共有することもできます。

以下は、docker-compose.ymlファイルにweb_datadb_dataという名前のボリュームを作成する場合の例です。

version: '3.8'
services:
  web:
    image: nginx
    volumes:
      - web_data:/var/www/html
  web-test:
    image: nginx
    volumes:
      - web_data:/var/www/html # Web and web test share the web_data volume
  db:
    image: mysql
    volumes:
      - db_data:/var/lib/mysql
volumes:
  web_data:
  db_data:
    driver: local # Define the driver and options under the volume name
    driver_opts:
      type: none
      device: /data/db_data
      o: bind

この例では、2つの名前付きボリュームを定義し、そのボリュームをそれぞれのコンテナに特定のパスでマウントしています。次に、web_dataボリュームをウェブコンテナの/var/www/htmlディレクトリに、db_dataボリュームをdbコンテナの/var/lib/mysqlディレクトリにマウントする流れです。

webコンテナとweb-testコンテナはweb_dataボリュームを共有し、同じボリュームのデータにアクセスし変更を加えることができます。

docker-compose.ymlファイル内でボリュームを定義・管理することで、Dockerコマンドを使ってボリュームを手動で管理することなく、必要に応じて簡単にボリュームの作成・更新・削除を行うことができます。この合理化されたプロセスにより、Docker Composeが基盤となるリソース管理を行う間、アプリケーションの開発とデプロイに集中可能です。

Docker Composeとボリュームコマンドの使い方

Docker Composeには、アプリケーションとそのリソースを効率的に管理するコマンドが複数用意されています。続いては、このコマンドと、ボリュームとの関係について詳しくご説明します。

  • docker compose up:サービス、ネットワーク、ボリュームを含むアプリケーションを作成し、起動します。docker-compose.ymlファイルに名前付きボリュームが存在しない状態で定義すると、このコマンドにより自動で作成されます。
  • docker compose down:アプリケーションのサービスとネットワークを停止および削除します。デフォルトでは、名前付きボリュームは削除されません。名前付きボリュームを削除するには、--volumesまたは-vを使用します。
  • docker compose ps:ボリューム関連情報を含め、コンテナとその現在のステータスを一覧で表示します。
  • docker compose config:ボリュームの定義を含め、docker-compose.ymlファイルで生成された有効な設定を検証し表示します。

ボリュームの一覧表示

すべてのボリュームを一覧表示するには、lsを使用します。

docker volume ls

出力には、Docker Composeによって作成されたボリュームを含む、すべての名前付きボリュームが表示されます。

ボリュームの検査

特定のボリュームの詳細を表示するには、inspect を使用します。名前、ドライバ、マウントポイント、オプションなど、ボリュームに関する情報が出力されます。

docker volume inspect db_data

ボリュームの詳細情報はJSON形式で表示されます。例えば、上記のdocker-compose.ymlファイルを考慮すると、このような出力になります。

[
    {
        "CreatedAt": "some-date-here",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/path/on/host/where/volume/is/mounted",
        "Name": "db_data",
        "Options": {
            "device": "/data/db_data",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local",
        "Status": {
            "Mounts": [
                ...
            ]
        }
    }
]

名前でDockerボリュームを削除する

Dockerボリュームを削除するには、docker volume rmの後にボリューム名を続けます。

docker volume rm volume-name

未使用ボリュームのクリーンアップ

未使用のボリュームを削除するには、pruneを使用します。

docker volume prune

このコマンドにより開発環境をクリーンアップし、ストレージスペースを確保することができます。Docker Composeが作成するボリュームを含め、コンテナに紐付けられていないすべての未使用のボリュームが削除されます。

ここまででご紹介してきたコマンドとボリューム関連の機能を活用することで、アプリケーションのリソースを効率的に管理し、パフォーマンスの最適化とストレージスペースの効率的な利用を実現できます。

Docker Composeのバージョン

2023年7月現在、Docker Compose V1はアップデートの提供を停止しています。Docker Desktopの新しいリリースでも利用できなくなりました。しかし、Docker Desktopは、利便性とサードパーティのツールやスクリプトとの互換性を向上させるために、docker composeにコマンドをリダイレクトするdocker-composeエイリアスを引き続きサポートしています。

Docker Composeのバージョン1からバージョン2に切り替えるには、ダッシュをスペースに置き換えるだけでOKです。例えば、docker-compose updocker compose upになります。

バージョン2では、Dockerコマンドラインインターフェース(CLI)で直接composeコマンドを使用したり、Dockerコンテキストを切り替えてクラウドサービス上にコンテナを構築したり、Amazon ECSやMicrosoft ACIを使用したりすることができます。

まとめ

この記事では、Docker Composeでボリュームを使用して永続データを管理することの重要性をご紹介しました。ボリュームはDockerエコシステムにおいて非常に重要なコンポーネントであり、Dockerコンテナが生成するデータの保存と管理が可能になります。Dockerボリュームを使用すると、コンテナを削除または更新した後でも重要なアプリケーションデータが存続し、アプリケーションの整合性と一貫性を維持できます。

Docker Composeは、docker-compose.ymlファイル内でボリュームを作成・管理することのできる、合理的なアプローチです。これにより、開発プロセスを簡素化し、リソースを効率的に使用することが可能になります。

ボリュームの使用により、柔軟で効率的な開発が捗ります。Docker Composeには、アプリケーションリソースを効率的に管理するための、ボリューム関連のさまざまなコマンドが用意されています。そのコマンドを活用することで、ボリュームの作成、検査、クリーンアップを簡単に行うことができます。

Kinstaでアプリケーションをホスティングすると、Google Cloud Platformのプレミアムティアネットワーク、C2マシンを土台としてプロジェクトがデプロイされ、高速かつ安全で信頼性の高いインフラストラクチャを利用できます。37のデータセンターと、260+のPoPを持つHTTP/3対応CDNをご利用いただけます。

隔離コンテナ技術、2種類の強力なファイアウォール、Cloudflareを利用した高度なDDoS対策により、高い安全性も維持できます。また、Kinsta APIでアプリを統合したり、ワークフローを自動化したり、Dockerでデプロイしたりすることも可能です。

Kinstaは、様々な言語やDocker Composeのようなツールを対象とした詳しい解説や、ウェブ開発者向けのリソースやコンテンツを豊富に公開しています。Dockerについては、Dockerに特化した各種コンテンツをご覧ください。

Marcia Ramos Kinsta

I'm the Editorial Team Lead at Kinsta. I'm a open source enthusiast and I love coding. With more than 7 years of technical writing and editing for the tech industry, I love collaborating with people to create clear and concise pieces of content and improve workflows.