Dockerコンテナ内で更新したファイルをデータボリュームに保存して消さずに残す方法

Docker公式ロゴ1b
©2023 Docker Inc. All rights reserved

 Dockerコンテナを起動してサービスの設定を行っても、Dockerコンテナが消えてしまうと頑張ってセットアップした内容は消えてしまいます。ベースに指定したDockerイメージの内容に初期化されます。

 でも、更新したファイルをDockerのデータボリュームという仮想領域に保存することで、Dockerコンテナを削除してもファイルは消えません。

 再度Dockerコンテナを起動する際にそのデータボリュームをマウントすれば、Dockerコンテナを削除したときの状態で起動することができます。

 本記事では、データボリュームの設定方法や使い方について解説しています。

 Dockerでインターネットサービスを運用する場合には必須の機能ですので、ぜひ理解していただきたいと思います。

データボリュームとは

 Dockerコンテナ内で行ったファイルの作成や更新、削除などの内容は、基本的にDockerコンテナが削除されると全て消えてしまいます。

 でも提供するサービスによっては、Dockerコンテナが削除されても保存しておきたいデータがあるでしょう。

 そのような場合に使用するのがデータボリュームになります。

 データボリュームは、データ保存が可能な仮想Disk領域でして、Dockerコンテナの外に作成します。

 作成する方法には、Dockerホスト上のディレクトリを直接マウントする方法とDocker標準機能のファイルシステムを利用する方法があります。

 Dockerホスト上のディレクトリを直接マウントする場合は、Dockerコンテナを作成する際にオプションを使用して行います。

 Docker標準機能のファイルシステムを利用する場合は、事前にDockerボリュームというDockerの仮想Diskを作成して、それをDockerコンテナ作成時にアサインします。

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

 この仕組みによって、Dockerコンテナが削除されてもデータボリューム内のファイルは削除されません。

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

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

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

1.Dockerホスト上のディレクトリを直接マウントする方法

 Dockerコンテナを作成、またはdocker runコマンドで起動する場合に、「-v」オプションを使用する方法です。

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

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

 このオプションを指定することによって、Dockerコンテナ内からDockerホスト上のディレクトリを利用可能になります。

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

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

 コマンドフォーマットは以下の通りです。

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

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

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

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

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

-v <データボリューム名>:<Dockerコンテナ内のマウントポイント>

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

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

docker volumeコマンドでデータボリュームを作成する

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

$ docker volume create -name testdatavol

 作成されていることを確認します。

$ docker volume ls | grep testdatavol
local testdatavol

作成したデータボリュームをマウントする

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

$ docker run -dit --init -v testdatavol:/home/testvol --name testvm ubuntu

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

$ docker exec -it testvm bash

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

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

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

データボリューム内にファイルを作成する

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

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

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

# 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をマウントしていることが確認できました。

Dockerコンテナを削除してもデータボリューム内のファイルは消えない

 もう1つだけ確認させてください。

 先ほど起動したDockerコンテナを削除してみましょう。

# docker stop testvm
# docker rm testvm

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

# 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ボリュームは、SAN(Storage Area Network)上のストレージをアサインすることも可能ですので、ストレージのバックアップ運用に組み込むことも難しくないでしょう。

 DockerコンテナにDockerホスト上のディレクトリをマウントできるので、どのような形態のバックアップにも柔軟に対応できると思います。

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

コメント