技術

Dockerボリュームとは?コンテナのデータを永続的に保存できる仕組みを解説!

広告

今回はDockerボリュームについて解説します。

Dockerコンテナ上に保存するデータは、コンテナの削除と同時に削除されてしまいます。コンテナを実行したログはdocker logsコマンドで確認できますが、コンテナを削除すると確認ができません。

よってコンテナの外部にデータを保存する仕組みが必要です。ここでDockerボリュームを使うと、コンテナの外部にデータの保存ができます。

Dockerボリュームとは?

Dockerボリュームは、コンテナのデータを永続化するために使用される仕組みです。

コンテナは基本的に短命な存在で、削除されるとデータも削除されてしまいます。しかし、実行ログやコンテナ内で作成したファイルなどを残しておきたい場合があるでしょう。

データをコンテナの外(ホストマシン)に保存するための手段としてDockerボリュームを使います。

データ永続化の問題

Dockerコンテナはデータを扱いにくいポイントとして以下があります。

ポイント

  • コンテナ自体の削除
  • コンテナイメージの更新
  • コンテナ間のデータ共有

コンテナ自体を削除するとコンテナ内のデータやログが残りません。
コンテナイメージを更新し、再ビルドすると再ビルド前のデータが残らなくなります。
コンテナ間のデータ共有はDockerネットワーク経由で可能ですが、コンテナ内での閉じた対応ができません。

ボリュームの利点

Dockerボリュームを使うことで上記のポイントを解消できます。

ポイント

  • Dockerボリュームにデータを保存すれば、コンテナが削除されてもデータが残る
  • コンテナイメージを更新する際も、Dockerボリュームに保存しておけば、データが残る形での更新が可能
  • コンテナ間のデータ共有も、コンテナ内でボリュームをマウントしているディレクトリにデータを保存すれば共有可能

Dockerボリュームの種類

Dockerボリュームには以下の3種類があります。基本的には名前付きボリュームを使うことになるでしょう。

ボリュームの種類概要利用時のコマンド
名前付きボリュームユーザーが名前を指定して作成するボリューム
名前付きで管理されるため、再利用やバックアップが容易です。
作成時のコマンド
docker volume create {ボリューム名}
Bind Mountホストマシンの特定のディレクトリをコンテナにマウントして利用するボリューム
ホスト上の既存のディレクトリやファイルを直接使用します。
docker run -d -v {ホストマシンのディレクトリ}:{コンテナのディレクトリ} {コンテナ名}
tmpfsコンテナのメモリ内に一時的なファイルシステムとして利用するボリューム
データはコンテナの終了時に自動的に削除されます。
docker run -d --tmpfs {コンテナのディレクトリ} {コンテナ名} {コンテナ名}

Dockerボリュームの基本操作

Dockerボリュームの基本操作は以下の通りです。

使用例: nginxコンテナにボリュームをアタッチする

nginxのコンテナにボリュームをマウントして、利用してみましょう。この使い方ができると、例としてWebサーバのコンテナとデータベースのコンテナを分けて構築し、ボリューム間でデータを共有しながらの利用が可能です。

手順

1. ボリュームを作成します。

$ docker volume create nginx-html
$ docker volume create nginx-logs

2. nginxコンテナを起動し、ボリュームをマウントします。

$ docker run -d \
  --name nginx-container \
  -v nginx-html:/usr/share/nginx/html \
  -v nginx-logs:/var/log/nginx \
  -p 8080:80 \
  nginx

3. ボリュームを確認します。

$ docker container inspect nginx-container
[
    {
        ...
        "Name": "/nginx-container",
        ...
        "HostConfig": {
            "Binds": [
                "nginx-html:/usr/share/nginx/html",
                "nginx-logs:/var/log/nginx"
            ],
            ...
    },
    ...
    "Mounts": [
            {
                "Type": "volume",
                "Name": "nginx-html",
                "Source": "/var/lib/docker/volumes/nginx-html/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "nginx-logs",
                "Source": "/var/lib/docker/volumes/nginx-logs/_data",
                "Destination": "/var/log/nginx",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
        ...
]

-技術
-,