はじめに

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は一時データ向きで高速

目的に応じて適切なマウント方法を選び、信頼性と効率性を両立したコンテナ運用を目指しましょう。