Dockerのデータボリュームについてもう少し詳しい説明


 通常、ハードディスクはコンピュータ1台に最低1基あると思います。ホスト型仮想環境では、仮想化ソフトにて仮想ディスクが用意されており、仮想環境内から現実のハードディスクと同じように利用可能です。

 Dockerの場合も、仮想環境(Dockerコンテナ)内に、ハードディスクに相当するものとしてDockerイメージがあります。その部分はリードオンリー領域ではありますが、コピーオンライトという機能により、更新機能が提供されてます。

 しかしDockerの場合は、Dockerイメージ上のファイルを更新しても、Dockerコンテナが削除されてしまうと消えてしまいます。

 ホスト型仮想環境の場合は、仮想ディスクさえ消さなければファイルは残ってます。

 Dockerにも更新ファイルをずっと保存可能な機能がなければ運用的に破綻してしまいます。

 実は、Dockerには、コピーオンライトによる更新情報の保存以外に、データボリュームという機能がありまして、Dockerコンテナが消えてしまっても、更新ファイルを残すことが可能な仕組みが用意されてます。

 今回は、このデータボリュームについて書きたいと思います。

 

Dockerのデータボリュームの詳細説明

 

データボリュームとは

 繰り返しになりますが、Dockerコンテナ内で書き込まれた更新データは、基本的にDockerコンテナが削除されると全て消えてしまいます。

 「docker commit」コマンドを使用して、新しいDockerイメージを作成すれば、それまでの更新データは保存可能です。しかし、このコマンドは、Dockerイメージを作るためのコマンドであって、日常発生する更新データを保存するためのものではありません。

 このような日々の更新データを、Dockerコンテナが削除されても保存するためには、Dockerコンテナの外で保存する必要があります。

 これを実現するのが、Dockerのデータボリュームになります。

 データボリュームは、DockerホストのディレクトリをDockerコンテナにマウントする仕組みです。

 Dockerコンテナ内で、データボリュームとしてマウントされたディレクトリ内にファイルを保存すると、Dockerホスト上に保存されます。

■ 本記事の目次に戻る ■

データボリュームの設定方法

 

 データボリュームは、Dockerコンテナ起動時に「-v」オプションで指定します。

 データボリュームの設定方法は、2つあります。

 

1.Dockerのデータボリュームを作成し、そのデータボリュームをDockerコンテナ内のディレクトリに割り当てる

 最初に、Dockerコマンド「docker volume」コマンドにて、データボリュームを作成します。

コマンドは以下の通りです。

docker volume --name <データボリューム名> -d <ボリュームドライバ名>

 データボリューム名は、作成するデータボリュームの名前です。その名前を使用して、Dockerコンテナ内のディレクトリにマウントします。

 ボリュームドライバ名は、作成するデータボリュームのタイプを指定します。省略した場合はデフォルトの「local」が指定され、Dockerホスト上の実ディレクトリがデータボリュームとしてアサインされます。

 次に、作成したデータボリュームを「-v」オプションを使用してDockerコンテナにマウントさせます。

オプションのフォーマットは以下の通りです。

-v <データボリューム名>:<Dockerコンテナ内のディレクトリ>

 

2.Dockerコンテナ内の実ディレクトリをデータボリューム化する

 2つめは、データボリューム名を指定しない方法です。

 「-v」オプションは以下のように指定します。

-v <Dockerコンテナ内のディレクトリ>

 データボリュームは、Dockerが自動的に作成します。データボリューム名はランダムに生成されます。

 自動的に作成されたデータボリューム名は、Dockerコマンドで調べればわかりますが、最初にデータボリュームを作成してから「-v」オプションでアサインする1つめの方法のほうが運用的には良いのではないかと思います。

■ 本記事の目次に戻る ■

データボリュームの実体を見てみる

 データボリュームを作成してから「-v」オプションでそのデータボリュームをアサインする方法で実験してみたいと思います。

 まずは、以下のコマンドでデータボリュームを作成します。

$ docker volume create -name testdatavol

 作成されているか確認します。

$ docker volume ls | grep testdatavol
local testdatavol

 では、centosのDockerコンテナ内の/home/testvolディレクトリにマウントさせます。

$ docker run -d -v testdatavol:/home/testvol centos init

 起動したdockerコンテナの中を覗いてみます。

$ docker exec -it xxxxxxxxxxxx bash

※xxxxxxxxxxはDockerコンテナIDです。「docker ps」コマンドで確認できます。

 下はDockerコンテナ内でのオペレーションになります。

[root@xxxxxxxxxx /]# cd /home
[root@xxxxxxxxxx home]# ls -l
total 0
drwxr-xr-x 2 root root 6 Sep 2 13:18 testvol

 testvolディレクトリがあります。これは「-v」オプションを指定したことで作成されたディレクトリですので、データボリュームをマウントしているディレクトリになります。

 このディレクトリ下にファイルを作成してみましょう。

[root@xxxxxxxxxx home]# cd testvol
[root@xxxxxxxxxx testvol]# touch aabbccddeeff.txt
[root@xxxxxxxxxx testvol]# ls -l
total 0
-rw-r--r-- 1 root root 0 Sep 2 13:35 aabbccddeeff.txt

 では、Dockerコンテナから抜けて、Dockerホストに戻ります。

[root@xxxxxxxxxx testvol]# exit

 以下のコマンドで、データボリュームtestdatavolにアサインされているDockerホスト上のディレクトを調べます。

$ docker volume inspect testdatavol
[
 {
 "Name": "testdatavol",
 "Driver": "local",
 "Mountpoint": "/var/lib/docker/volumes/testdatavol/_data",
 "Labels": {},
 "Scope": "local"
 }
]

 出力された内容の「Mountpoint」部分が、データボリュームの実ディレクトリになります。

 つまり、ここがデータボリュームtestdatavolの実体となります。

 ファイルが存在するか確認しましょう。

$ ls -l /var/lib/docker/volumes/testdatavol/_data
ls: /var/lib/docker/volumes/testdatavol/_data にアクセスできません: 許可がありません

 上記のエラーが出た場合は、rootユーザにて再度確認してください。

# ls -l /var/lib/docker/volumes/testdatavol/_data
合計 0
-rw-r--r-- 1 root root 0 9月 2 22:35 aabbccddeeff.txt

 

 先ほどDockerコンテナ内で作成したファイルがありました。Dockerコンテナ内の/home/testvolディレクトリが、Dockerのデータボリュームtestdatavolをマウントしていることが確認できました。

 

 もう1つだけ確認させてください。
 先ほど起動したDockerコンテナを削除してみましょう。

# docker stop xxxxxxxxxxxxxxxx
# docker rm xxxxxxxxxxxxxxxx

※xxxxxxxxxxxxxxxxはDockerコンテナのIDです。

 再度、ファイルの存在確認をしてください。

# ls -l /var/lib/docker/volumes/testdatavol/_data
合計 0
-rw-r--r-- 1 root root 0 9月 2 22:35 aabbccddeeff.txt

 Dockerコンテナを削除してもファイルは残ってます。

 このデータボリュームを指定して、Dockerコンテナを起動すれば、作成したファイルをDockerコンテナ内からまた確認することが出来ます。

 

 次に示しますように、データボリュームを使う方法以外に、Dockerホスト上のディレクトリをDockerコンテナにマウントする方法もあります。

■ 本記事の目次に戻る ■

Dockerホスト上の実ディレクトリを、Dockerコンテナ内のディレクトリに割り当てる

 Dockerホスト上に、Dockerコンテナにマウントするディレクトリを作成します。

 作成したディレクトリをDockerコンテナ起動時に「-v」オプションで指定し、Dockerコンテナ内でマウントさせます。

 オプションのフォーマットは以下の通りです。

-v <Dockerホスト上のディレクトリ>:<Dockerコンテナ内のディレクトリ>

 例えば、Dockerホスト上の「/data/vol」をDockerコンテナ内の「/var/data」としてマウントする場合は、

-v /data/vol:/var/data

となります。

 

 今回はここまでです。

 今回説明させていただいたデータボリュームは、Dockerホストのハードディスク上でしたが、ネットワーク上のストレージも利用できるような情報もあります。ぜひ調査して記事にしたいと思います。

 最後までお読みいただきありがとうございました。

■ 本記事の目次に戻る ■


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください