Docker ボリュームの操作

DockerBeginner
オンラインで実践に進む

はじめに

この実験では、ボリュームを使用して Docker コンテナ内のデータを管理する方法を学びます。Docker ボリュームは、Docker コンテナによって生成および使用されるデータを永続化するための推奨される仕組みです。この実験では、ボリュームの作成、管理、データの共有、バックアップ、および復元など、Docker ボリュームのさまざまな側面について順を追って説明します。この実験を終える頃には、Docker 環境でデータを効果的に管理する方法をしっかりと理解できているはずです。

Docker ストレージオプションの理解

Docker ボリュームの詳細に入る前に、Docker で利用可能なさまざまなストレージオプションを理解しておくことが重要です。Docker はデータを保存するために主に 3 つのオプションを提供しています。

  1. ボリューム(Volumes):Docker でデータを永続化するための推奨される仕組みです。
  2. バインドマウント(Bind mounts):ホストマシンの特定のパスをコンテナに直接接続します。
  3. tmpfs マウント(tmpfs mounts):ホストマシンのメモリ内に一時的にデータを保存します。

この実験では、Docker でデータを管理する上で最も柔軟性が高く、推奨されるオプションである「ボリューム」に焦点を当てます。

まず、システム上の現在のボリュームをリスト表示してみましょう。

docker volume ls

次のような出力が表示されます。

DRIVER    VOLUME NAME
local     jenkins-data

このコマンドは、システム上のすべての Docker ボリュームを表示します。出力には、ボリュームドライバ(通常は "local")とボリューム名が表示されます。既存のボリュームが表示される場合もあれば、まだボリュームを作成していない場合はリストが空の場合もあります。

表示されるボリューム名が異なっていたり、ボリュームが一つもなかったりしても心配しないでください。これは正常なことであり、以前にそのシステムで Docker をどのように使用していたかによって異なります。

名前付きボリュームの作成と管理

次に、新しい「名前付きボリューム(Named Volume)」を作成しましょう。名前付きボリュームとは、明示的に作成し、特定の名前を付けたボリュームのことです。これにより、後で参照したり管理したりするのが簡単になります。

次のコマンドを実行して、新しいボリュームを作成します。

docker volume create my_data

このコマンドは、my_data という名前の新しいボリュームを作成します。Docker は、このボリュームがホストシステム上のどこにどのように保存されるかという詳細をすべて自動的に処理します。

ボリュームが作成されたことを確認しましょう。

docker volume ls

ボリュームのリストに、以前からあったものに加えて my_data が表示されているはずです。

ボリュームに関するより詳細な情報を取得するには、inspect コマンドを使用します。

docker volume inspect my_data

出力は以下のようになります。

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

この出力から、ボリュームについていくつかのことがわかります。

  • 作成日時
  • 使用しているドライバ(この場合は local)
  • マウントポイント(ホストシステム上で実際にデータが保存されている場所)
  • 指定した名前

現時点でこれらの詳細をすべて理解していなくても大丈夫です。私たちにとって最も重要な部分は Name(名前)と Mountpoint(マウントポイント)です。

コンテナでのボリュームの使用

ボリュームが作成できたので、次はそれをコンテナで使用してみましょう。新しいコンテナを起動し、作成したボリュームをマウントします。

次のコマンドを実行してください。

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

このコマンドの内容を分解して説明します。

  • docker run: 新しいコンテナを実行するよう Docker に指示します。
  • -d: コンテナをデタッチドモード(バックグラウンド)で実行します。
  • --name my_container: コンテナに名前を付け、後で参照しやすくします。
  • -v my_data:/app/data: my_data ボリュームをコンテナ内の /app/data ディレクトリにマウントします。
  • ubuntu:latest: コンテナに使用するイメージです。
  • sleep infinity: コンテナが実行するコマンドです。これにより、コンテナが無期限に実行され続けます。

これで、ボリュームがマウントされた状態でコンテナが動作しています。ボリューム内にデータを作成してみましょう。

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

このコマンドは以下の処理を行います。

  • docker exec: 実行中のコンテナ内でコマンドを実行します。
  • my_container: 対象となるコンテナの名前です。
  • sh -c "...": コンテナ内でシェルコマンドを実行します。
  • 実際のコマンドは、ボリューム内の /app/data/test.txt という名前のファイルを作成し、"Hello from Docker volume" という内容を書き込みます。

データが書き込まれたことを確認するために、ファイルを読み取ってみましょう。

docker exec my_container cat /app/data/test.txt

コンソールに "Hello from Docker volume" というメッセージが表示されるはずです。

コンテナ間でのデータ共有

Docker ボリュームの大きな利点の一つは、複数のコンテナ間でデータを共有できることです。同じボリュームを使用する別のコンテナを作成してみましょう。

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

このコマンドは先ほど使用したものと非常に似ていますが、コンテナに別の名前を付け、ボリュームをコンテナ内の異なるパス(/app/shared_data)にマウントしています。

では、この新しいコンテナが先ほど作成したデータにアクセスできるか確認してみましょう。

docker exec another_container cat /app/shared_data/test.txt

先ほど書き込んだのと同じ "Hello from Docker volume" というメッセージが表示されるはずです。これは、両方のコンテナが同じデータにアクセスしていることを示しています。

この新しいコンテナからさらにデータを追加してみましょう。

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

このコマンドは、test.txt ファイルに新しい行を追記します。

ここで、どちらかのコンテナからファイルの内容を確認すると、両方の行が表示されるはずです。

docker exec my_container cat /app/data/test.txt

出力に "Hello from Docker volume" と "Data from another container" の両方が表示されることを確認してください。

これにより、Docker ボリュームを使用してコンテナ間でデータを共有する方法が理解できたと思います。これは多くのアプリケーションにおいて非常に便利な機能です。

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

Docker ボリュームのバックアップと復元は、データを保護するために非常に重要です。そのプロセスを順に見ていきましょう。

まず、ボリュームを使用しているコンテナを停止して削除する必要があります。ボリュームが使用中の間は削除できないためです。

docker stop my_container another_container
docker rm my_container another_container

次に、ボリュームのバックアップを作成します。

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source .

このコマンドは複雑に見えるかもしれないので、分解して説明します。

  • docker run --rm: 一時的なコンテナを実行し、終了時に自動的に削除します。
  • -v my_data:/source:ro: ボリュームを読み取り専用(ro)としてコンテナにマウントします。
  • -v $(pwd):/backup: 現在のディレクトリをコンテナ内の /backup としてマウントします。
  • ubuntu: Ubuntu イメージを使用します。
  • tar cvf /backup/my_data_backup.tar -C /source .: ボリュームデータの tar アーカイブを作成します。

では、元のボリュームを削除してみましょう。

docker volume rm my_data

データを復元するには、新しいボリュームを作成し、そこにバックアップを解凍します。

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

これにより、新しいボリュームが作成され、バックアップの内容がそこに抽出されます。

データが正しく復元されたか確認しましょう。

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

先ほど作成したファイルの内容が表示されるはずです。

まとめ

この実験では、Docker ボリュームの操作方法を学びました。名前付きボリュームの作成と管理、コンテナでのボリュームの使用、コンテナ間でのデータ共有、そしてバックアップと復元の操作を行いました。これらのスキルは、Docker 環境で効果的にデータを管理するために不可欠です。

主なポイント:

  • Docker ボリュームは、コンテナ内の永続データを管理するための柔軟で効率的な方法を提供します。
  • ボリュームは、Docker CLI コマンドを使用して簡単に作成、検査、削除できます。
  • ボリューム内のデータは、複数のコンテナ間で共有可能です。
  • ボリュームのバックアップと復元はデータ保護のために不可欠であり、標準的な Linux コマンドを使用して実行できます。

今後 Docker を使用していく際には、コンテナ化されたアプリケーションの重要な側面として、データの永続化と管理を常に考慮するようにしてください。特に本番環境では、常にデータのバックアップとリカバリの計画を立てるようにしましょう。