DockerのVolumeとは?実例付きでわかりやすく解説

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2023年8月)

✔当記事は以下のような方に向けて書かれています

「docker volumeって何だろう?」

「docker volumeの適切なつかい方を理解したい」

「docker volumeの使用例を見てみたい」

✔当記事でお伝えすること

  • docker volumeの基本的な理解
  • docker volumeの規則正しい使い方とその適用
  • docker volumeの事例

当記事では、docker volumeの素朴な基本から、その高度なオプションの活用方法に至るまで、具体的な例を基に細部にわたって解説します。

ぜひ最後までお読みください。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Docker Volumeの基本理解

こちらでは、DockerとそのVolumeについての基本的な理解を深めていきます。

具体的には、Docker自体の概要と、ボリューム(-v)と–mountオプションの理解、さらにそれらの動作の違いについて詳しく見ていきましょう。

  • Dockerとは何か?
  • ボリューム(-v)と–mountオプションの理解
  • -vと–mountオプションの動作の違い

Dockerとは何か?

Dockerは、ソフトウェア開発の世界で革命を起こしたコンテナ技術のひとつです。

アプリケーションとその依存関係を「コンテナ」にパッケージングすることで、開発からテスト、本番環境への移行を迅速かつ一貫したものにします。

これにより、「私のマシンでは動作したんだけど、、、」という問題を劇的に減せます。

ボリューム(-v)と–mountオプションの理解

Dockerのボリュームとは、データを永続化し、コンテナ間で共有するためのメカニズムです。

データをコンテナ内に保存するのではなく、Dockerホスト(あなたのPC等)のファイルシステム上に存在させます。

結果として、コンテナのライフサイクルに縛られず、データはコンテナの生成と削除を超えて持続できるのです。

ボリュームは、-v フラグまたは –mount オプションにより、作成および管理できます。

-v と –mount は同じ目的(ボリュームのマウント)を持っていますが、–mount オプションはより明示的な構文を提供し、追加の設定オプションも提供します。

-vと–mountオプションの動作の違い

-v と –mount オプションの違いを見ていきましょう。

-v または –volume オプションはより簡潔な構文を持ち、以下の形式で使用されます。

docker run -v /host/path:/container/path

一方、–mount オプションはより明示的で柔軟なオプションを提供します。

以下がその例です。

docker run --mount type=bind,source=/host/path,target=/container/path

–mount オプションでは、以下を明示的に指定できます。

  • マウントの種類(type)
  • ソース(source)
  • ターゲット(target)

ユーザーは何がおこなわれているかをより明確に理解できます。

ただし既存のDocker環境やスクリプトで -v が広く使われているため、–mount への切り替えは徐々におこなわれているのが現実です。

Docker Volumeの作成と操作

こちらでは、Docker Volumeの生成と操作について解説します。

具体的なVolumeの生成方法や管理手順など、実戦に役立つ内容です。

  • Volumeの生成と管理手順
  • Volume付きコンテナの起動方法

Volumeの生成と管理手順

DockerのVolumeは、以下のコマンドで作成できます。

docker volume create <ボリューム名>

例えば、次のコマンドはmyvolumeという名前の新しいVolumeを作成します。

docker volume create myvolume

Volumeの一覧を表示するには、docker volume lsコマンドを使います。

docker volume ls

特定のVolumeの詳細情報を取得するには、docker volume inspectコマンドを使いましょう。

次のコマンドはmyvolumeの詳細情報を表示します。

docker volume inspect myvolume

不要になったVolumeを削除するには、docker volume rmコマンドを使います。

myvolumeを削除してみます。

docker volume rm myvolume

Volume付きコンテナの起動方法

Volumeを持つコンテナを起動するには、docker runコマンドに-vオプションまたは--mountオプションを使用します。

次のコマンドは、myvolume/dataディレクトリにマウントしたコンテナを起動します。

docker run -d -v myvolume:/data ubuntu

–mountオプションでは以下のとおりです。

docker run -d --mount source=myvolume,target=/data ubuntu

この場合、ubuntuコンテナの/dataディレクトリにデータを書き込むと、そのデータはホストマシンのmyvolumeに永続化されます。

このように、Volumeはコンテナ間でデータを共有したり、データをコンテナのライフサイクルを超えて永続化するための便利なメカニズムを提供しているのです。

Docker Composeを使ったVolumeの活用

こちらでは、Docker Composeを使用してVolumeを管理する方法について解説します。

  • Docker ComposeでのVolumeの利用方針
  • サービスでのVolume利用とその文法
  • データコピーの方法と技巧

Docker Composeは、複数のコンテナからなるアプリケーションを、一貫した環境で開発、テスト、デプロイするために使うもの。Webサーバーとデータベースなど複数のサービスを連携させられます。

Docker ComposeでのVolumeの利用方針

Docker Composeを使用すると、YAMLファイルでVolumeを定義してサービスに割り当てられます。

一貫した環境を迅速にセットアップできるのです。

以下のdocker-compose.ymlの例では、dbdataという名前のVolumeを作成し、dbサービスの/var/lib/mysqlディレクトリにマウントしています。

version: "3"
services:
  db:
    image: mysql:5.7
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:

このコンフィギュレーションを適用するには、docker-compose upコマンドを使用します。

docker-compose up

サービスでのVolume利用とその文法

Docker ComposeのYAMLファイルでは、volumesキーを使用してサービスごとにVolumeを割り当てます。

Volumeを割り当てるためには、以下の形式での記述が必要です。

<ボリューム名>:<マウントポイント>

またデフォルトでは、Composeは指定した名前のVolumeが存在しない場合に自動的に作成します。

既存のVolumeを使用するには、external: trueを指定しましょう。

volumes:
  dbdata:
    external: true

データコピーの方法と技巧

Docker Composeを使用して、ひとつのサービスから別のサービスにデータをコピーすることも可能です。

これは、volumes_fromキーを使用しておこないます。

ただしこの機能は、Composeのバージョン2でのみ利用可能であり、バージョン3では廃止されています。

例えば次のように指定すると、webサービスはdbサービスの全てのマウントされたボリュームを引き継ぎます。

version: '2'
services:
  web:
    image: nginx:latest
    volumes_from:
      - db
  db:
    image: mysql:5.7
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:

この機能は、初期化スクリプトやアセットなどのデータを共有する場合に有用です。

ただし注意点として、volumes_fromはボリュームの所有権を変更しないため、ファイルのパーミッションに気をつけなければなりません。

Volumeの特殊利用法

こちらでは、Docker Volumeの特殊な利用法を学びます。

具体的には、読み取り専用ボリュームの設定と利用方法、そしてマシン間でのデータ共有方法などです。

  • 読み取り専用ボリュームの設定と利用
  • マシン間でのデータ共有方法

読み取り専用ボリュームの設定と利用

Dockerでは、ボリュームを読み取り専用としてマウントすることが可能です。

これは、データの不変性を確保するために重要な機能です。

読み取り専用のボリュームを作成するには、docker runコマンドで:roオプションを使用します。

以下が例です。

docker run -d --name mycontainer -v myvol:/app:ro myimage

myvolという名前のボリュームを/appディレクトリに読み取り専用としてマウントしています。

同様に、Docker ComposeのYAMLファイルでも読み取り専用ボリュームを設定できます。

以下の例をご覧ください。

version: "3"
services:
  db:
    image: mysql:5.7
    volumes:
      - type: volume
        source: dbdata
        target: /var/lib/mysql
        read_only: true
volumes:
  dbdata:

dbサービスの/var/lib/mysqlディレクトリを読み取り専用としてマウントしています。

マシン間でのデータ共有方法

Dockerでは、マシン間でデータを共有する方法も提供しています。

これは、Docker SwarmモードやDocker Volumeプラグインを使用して実現可能です。

Docker Swarmモードでの共有

Docker Swarmモードでは、共有ストレージシステム上のVolumeを複数のノードで共有できます。

このための具体的な設定や手順は、使用する共有ストレージシステムやDocker Volumeプラグインにより異なります。

Docker Volumeプラグインを使う

個々のDockerホスト間でデータを共有するには、NFSやSSHFSなどのネットワークファイルシステムが利用できます。

これには、専用のDocker Volumeプラグインが必要で、docker volume createコマンドでネットワークファイルシステムに接続しなければなりません。

以下に示す例では、vieux/sshfsプラグインを使用して、SSH経由でリモートホストのディレクトリをマウントします。

docker volume create -d vieux/sshfs -o sshcmd=user@host:/path remote_vol

このremote_volボリュームは、任意のDockerコンテナでマウントできます。

Docker Volumeドライバの利用

こちらでは、Docker Volumeドライバの利用について解説します。

Volumeドライバの基本から具体的な利用法までご覧ください。

  • Volumeドライバの意義と設定
  • Volumeドライバを活用したボリューム生成手順
  • NFSボリュームとCIFS/Sambaボリュームの利用法

Volumeドライバの意義と設定

Docker Volumeドライバは、ストレージプロバイダーと連携し、遠隔地にあるデータをローカルのDockerホストにマウントできるようにします。

複数のDockerホスト間でデータを共有する場合や、特殊なストレージ要件を持つ場合に便利です。

Dockerでは、ローカルファイルシステムを対象とするデフォルトのVolumeドライバだけでなく、以下を対象とするドライバも利用できます。

  • Amazon EBSやMicrosoft Azure File Storageなどのクラウドストレージサービス
  • NFSやCIFS/Sambaなどのネットワークファイルシステム

これらのドライバはDockerプラグインとして提供されており、docker plugin installコマンドでインストールできます。

以下の例では、vieux/sshfsプラグインをインストールしています。

docker plugin install vieux/sshfs

Volumeドライバを活用したボリューム生成手順

インストールしたVolumeドライバは、docker volume createコマンドの-dオプションで指定できます。

以下の例では、vieux/sshfsドライバを使用してボリュームを作成しています。

docker volume create -d vieux/sshfs -o sshcmd=user@host:/path myvolume

このように作成したボリュームは、Dockerコンテナを起動する際に-vオプションで指定することでマウントできます。

NFSボリュームとCIFS/Sambaボリュームの利用法

NFSボリュームとCIFS/Sambaボリュームは、ネットワークファイルシステムを対象とするVolumeドライバの一例です。

これらを利用することで、Dockerホスト間でデータを共有できます。

それぞれのドライバを使用するには、専用のDockerプラグインが必要で、以下のようにインストールします。

docker plugin install --grant-all-permissions vieux/sshfs
docker plugin install --grant-all-permissions sapk/plugin-volume-gluster

これらのプラグインをインストールした後、docker volume createコマンドでネットワークファイルシステムに接続しましょう。

例えば、次のようにNFSボリュームを作成します。

docker volume create -d vieux/sshfs -o sshcmd=user@host:/path nfsvolume

また、以下のようにCIFS/Sambaボリュームを作成します。

docker volume create -d sapk/plugin-volume-gluster -o device=//server/share cifsvolume

これらのボリュームは、Dockerコンテナを起動する際に-vオプションで指定することでマウントできます。

データボリュームの保全と管理

こちらでは、データボリュームの保全と管理について詳しく説明します。

  • データボリュームのバックアップと復元
  • ボリュームの削除方法: 匿名ボリュームと全ボリューム

データボリュームのバックアップと復元

Dockerボリュームのバックアップを取るには、docker cpコマンドを使用します。

以下の例では、mycontainerからmyvolumeボリュームをバックアップしています。

docker cp mycontainer:/path/to/volume /host/path/to/backup

このバックアップを新しいボリュームに復元するには、以下の手順を実行します。

  1. 新しいボリュームを作成
    docker volume create mynewvolume
  2. 新しいコンテナを作成し、作成した新しいボリュームをマウント
    docker run -v mynewvolume:/path/to/volume --name tempcontainer -d myimage
  3. バックアップから新しいボリュームにデータを復元
    docker cp /host/path/to/backup tempcontainer:/path/to/volume
  4. コンテナを停止し、削除
    docker stop tempcontainer docker rm tempcontainer

この新しいボリュームは、その他のコンテナでも使用できます。

ボリュームの削除方法: 匿名ボリュームと全ボリューム

ボリュームを削除するには、docker volume rmコマンドを使用します。

以下は、myvolumeボリュームを削除する例です。

docker volume rm myvolume

匿名ボリュームを削除するには、docker rm -vコマンドが利用できます。

コンテナ名を指定することで、その関連する匿名ボリュームを削除できるのです。

docker rm -v mycontainer

すべての未使用のボリュームを削除するには、docker volume pruneコマンドを使用します。

docker volume prune

こちらのコマンドでボリュームを削除すると、そのボリューム上のすべてのデータが永久に失われます。

ボリュームを削除する前に必要なデータのバックアップを取ることを忘れないでください。

Docker Volumeの選択とまとめ

このセクションでは、Dockerのストレージオプションの選択ガイドを提供し、Docker Volumeの重要性と活用についてまとめます。

  • Dockerのストレージオプション選択ガイド
  • Docker Volumeの重要性と活用まとめ

Dockerのストレージオプション選択ガイド

Dockerでは、バインドマウント、tmpfsマウント、そしてボリュームという三つの主要なストレージオプションがあります。

それぞれには利点と欠点があり、使用シーンにより最適なオプションが変わります。

  • バインドマウント
    ホストマシン上の既存のディレクトリをコンテナにマウントします。これは開発作業に便利ですが、ホストマシンのファイルシステムのセキュリティを維持するためには注意が必要です。
  • tmpfsマウント
    メモリ内にデータを格納する一時的なマウントポイントを提供します。これはパフォーマンスが重要な場合やデータの永続性が必要でない場合に役立ちます。
  • ボリューム
    Dockerが管理するディスク上の領域を提供します。これはコンテナ間でデータを共有したり、データを永続化するための最良の選択です。

選択する際には、パフォーマンス、セキュリティ、データの永続性などの要件を検討してください。

まとめ

当記事では、Docker Volumeについて学習してきました。

  • Docker Volumeは、Dockerでデータを永続化するための重要なツール
  • コンテナのライフサイクルに関係なく、ボリュームはデータを永続的に保持できる
  • 異なるコンテナ間でデータを共有するためにも使用可能

さらに、Docker Volumeは、Docker Composeを使用して複数のコンテナ間でデータを共有したり、特定のドライバを使用してボリュームを作成したりなど、より高度な操作を可能にします。

バックアップと復元、削除など、適切なボリュームの管理は、アプリケーションのデータ保全と安全性を確保する上で不可欠です。

当記事を参考に、Docker Volumeを効果的に使用してください。

タイトルとURLをコピーしました