はじめに
Dockerでは、コンテナのファイルシステムは基本的に一時的なものです。コンテナを停止・削除すると、その中で作成したファイルは原則として失われます。また、別のコンテナからそのデータにアクセスすることも簡単ではありません。
こうした制約を補うため、Dockerには以下のようなデータマウント機能が用意されています:
- ボリューム:Dockerが管理するデータ保存領域
- バインドマウント:ホストマシンのディレクトリをコンテナにマウント
- tmpfsマウント:一時的にメモリ上にデータを保存
本記事では、これらのマウント方式について丁寧に解説し、データ永続化の基本的な知識を身につけることを目指します。
ボリュームの基本
ボリュームは、Dockerが自動的に管理するデータ保存領域です。コンテナ間でデータを共有したり、コンテナ削除後もデータを保持したりするために使います。
作成と確認
ボリュームは以下のコマンドで作成できます:
$ docker volume create my_volume
作成したボリュームは docker volume ls
で一覧表示できます。
$ docker volume ls
DRIVER VOLUME NAME
local my_volume
docker volume inspect
を使うと、そのボリュームの保存場所(Mountpoint)や作成日時など詳細情報を確認できます。
$ docker volume inspect my_volume
[
{
"CreatedAt": "2025-08-01T12:00:00Z",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/my_volume/_data",
"Name": "my_volume",
"Options": null,
"Scope": "local"
}
]
コンテナへのマウント
ボリュームは、コンテナ起動時に -v
オプションまたは --mount
オプションを使って、コンテナ内の任意のパスにマウントします。
どちらの方法も同等の機能を持ちますが、--mount
のほうが構造的にわかりやすく、明示的な指定ができるため推奨されることが多いです。
$ docker run -it -v my_volume:/data ubuntu:20.04 bash
または
$ docker run -it --mount type=volume,src=my_volume,dst=/data ubuntu:20.04 bash
以下は、ボリュームをマウントした /data
ディレクトリ内にファイルを作成し、それを ls
コマンドで確認する例です:
$ docker run -it -v my_volume:/data ubuntu bash
root@container:/# echo "Hello World" > /data/hello.txt
root@container:/# ls /data
hello.txt
root@container:/# cat /data/hello.txt
Hello World
コンテナ間の共有
同じボリュームを使用すれば、複数のコンテナ間でデータを共有できます。
# コンテナAでファイル作成
$ docker run -it -v my_volume:/data ubuntu bash
root@a:/# echo "shared" > /data/shared.txt
# コンテナBで確認
$ docker run -it -v my_volume:/data ubuntu bash
root@b:/# cat /data/shared.txt
shared
読み取り専用マウント
ボリュームを読み取り専用でマウントしたい場合、-v
オプションなら :ro
を、--mount
オプションなら readonly
を付けます。
$ docker run -it -v my_volume:/data:ro ubuntu bash
または
$ docker run -it --mount type=volume,src=my_volume,dst=/data,readonly ubuntu bash
バックアップと復元
ボリュームのバックアップを取るには、対象ボリュームとバックアップ先ディレクトリ(ホスト)を同時にマウントし、tar
でアーカイブします。
$ docker run --rm \
--mount type=volume,src=my_volume,dst=/data \
--mount type=bind,src=$(pwd),dst=/backup \
ubuntu tar cvf /backup/backup.tar /data
復元も同様に、復元先のボリュームに tar
で展開します。
$ docker run --rm \
--mount type=volume,src=restored_volume,dst=/data \
--mount type=bind,src=$(pwd),dst=/backup \
ubuntu bash -c "cd /data && tar xvf /backup/backup.tar --strip 1"
--mount
オプションでは以下のようにパラメータを指定します:
type=
:マウントの種類(volume, bind, tmpfs)src=
:マウント元のボリューム名やディレクトリdst=
:マウント先のパス(コンテナ側)readonly
:読み取り専用(任意)
$(pwd)
はカレントディレクトリを取得するUNIXシェル構文です。
バインドマウント
バインドマウントは、ホストマシンのディレクトリをコンテナ内にマウントします。コンテナ内外でファイルを即時共有できるため、開発用途などで便利です。
$ mkdir data
$ echo "Hello Host" > data/example.txt
$ docker run -it -v $(pwd)/data:/data ubuntu bash
root@container:/# cat /data/example.txt
Hello Host
ファイルを編集・追加・削除すれば、ホストとコンテナの両方で即時に反映されます。
tmpfsマウント
tmpfsマウントは、コンテナ内の一時ファイルをメモリ上に保持する方法です。コンテナを停止するとデータは消失します。
$ docker run -it --mount type=tmpfs,dst=/tmpdata ubuntu bash
root@container:/# echo "temporary" > /tmpdata/tmp.txt
root@container:/# cat /tmpdata/tmp.txt
temporary
別のセッションで同じコンテナに再接続しても、このデータは残っていません。中間生成物やキャッシュなど、一時的な用途に適しています。
マウント方式の使い分け
手法 | データの保持性 | ホストからのアクセス | 主な用途 |
---|---|---|---|
ボリューム | 永続的 | 基本的に不可 | 本番データの保存、共有 |
バインドマウント | 永続的 | 可能 | 開発時のホットリロードなど |
tmpfs | 一時的 | 不可(メモリ上) | 一時データ、高速処理 |
MySQLを使った実践例
ボリュームを活用して、MySQLコンテナのデータ永続化を行ってみましょう。
$ docker volume create db-store
$ docker run --name mysql1 \
-e MYSQL_ROOT_PASSWORD=pass \
--mount type=volume,src=db-store,dst=/var/lib/mysql \
-d mysql
コンテナに接続し、テーブルとデータを作成します。
$ docker exec -it mysql1 bash
$ mysql -p
> CREATE DATABASE test;
> USE test;
> CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(10));
> INSERT INTO user VALUES (1, 'Taro'), (2, 'Jiro');
その後コンテナを削除し、同じボリュームで新しいコンテナを起動すれば、データは保持されたままです。
$ docker stop mysql1
$ docker rm mysql1
$ docker run --name mysql2 \
-e MYSQL_ROOT_PASSWORD=pass \
--mount type=volume,src=db-store,dst=/var/lib/mysql \
-d mysql
$ docker exec -it mysql2 mysql -p
> SELECT * FROM test.user;
また、MySQLイメージはボリューム未指定でも自動で匿名ボリュームを作成します。ただし名前がランダムになるため、明示的に作成・指定するほうが望ましい運用です。
まとめ
Dockerにおけるデータ管理は、単にファイルを保存する以上に重要な要素です。特にボリュームは、データの永続化や共有を行ううえで中心的な手段となります。
- ボリュームは安全・簡潔で再利用性が高い
- バインドマウントは柔軟だが注意が必要
- tmpfsは一時データ向きで高速
目的に応じて適切なマウント方法を選び、信頼性と効率性を両立したコンテナ運用を目指しましょう。