3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

改めてDockerを理解する④[Dockerのボリュームについて]

Last updated at Posted at 2024-12-06

はじめに

こんにちは!ITスクールRareTECHにてCS(Customer Support)を担当している池村です!
今回の記事はDockerのストレージについて解説します。ここから結構難しくなってくる印象です。要はDockerコンテナ内のデータをどう保存していくのか?というお話です。

前回の記事を読んでいただけた方はイメージを作ることによってデータを保存していたと認識していると思います。それ以外にも方法がありますので、学習していきましょう。

前回の記事はこちら

Dockerのボリューム

Dockerコンテナ内のデータをなるべくずっと使いたい。要は永続化したい場合、コンテナとホストでデータを共有するボリュームという仕組みが使われます。

メリットは以下になります。

  1. データの永続化ができる
  2. 複数のコンテナで同じデータを共有できる

我々の使うPC内の特定の場所にデータを保存しておくことで、コンテナを削除してもデータが消えることなく保存されます。ボリュームの大きな利点です。

ボリュームにはいくつか種類があります。

  1. ボリューム
  2. バインドマウント
  3. tmpfs マウント

types-of-mounts.png
※画像はDocker docsより引用

今回はその中のボリュームについて初学者が押さえてほしい範囲を解説します。

ボリューム

ボリュームですが、こちらはホストにあるDocker areaという場所にデータを保存する方法です。この場所はDockerが管理している場所になります。

types-of-mounts-volume.png

まあどういった形で保存されているのか、最初はよくわからないと思うので、ハンズオンをしながら見ていきましょう!

ボリュームの作り方
docker volume create ボリューム名
docker volume create ubuntu_volume_test

上記、ボリュームの名前はなんでも大丈夫です。また今回もUbuntuを使いますので、私の書いたボリューム名を真似してもOKです。

ではUbuntuのコンテナを起動して、今作成したボリュームを紐付けてみましょう。

volumeの紐付け
docker run -v [ホスト側パス]:[コンテナ側パス]
例えば
docker run -it -v ubuntu_volume_test:/data ubuntu

-v:ボリュームを紐づけるオプション
ホスト側パス:作成したボリューム名をつける
コンテナ側パス:コンテナ内のどこに紐づけるかのパス

今回はコンテナ内の/dataというディレクトリに紐付けました。この紐付けをマウントすると言います。ここに紐付けた理由は特にありません。中身が空で、かつデータを持たせる意味でこのディレクトリ名にしています。

ではコンテナの中に入っていると思いますので、その中でファイルを作成してみましょう。

ファイルを作成
cd data && echo 'Hello World' >> test.txt

コマンドを叩いたらexitで出ていただき、いったんコンテナを削除しましょう。

コンテナを削除
docker rm コンテナID or コンテナ名

次にもう一度Ubuntuを起動します。もちろんボリュームは先ほど作ったボリュームにします。

コンテナを再作成
docker run -it -v ubuntu_volume_test:/data ubuntu

以下のような画像と同じようになったと思います。無事データが保存されていますね。
image.png

ボリュームはどこに保存されているのか?

Linux環境の場合
/var/lib/docker/volumes/

上記のディレクトリ内にデータが保存されます。

Macの場合
docker run -it --rm --privileged --pid=host justincormack/nsenter1

image.png
右下にubuntu_volume_testがありますね。
Macの場合は上記のコマンドを使って、Docker Desktopの仮想マシン内に入って確認する必要があります。MacはLinuxと親戚のようなものではありますがUNIX系列のOSなので、アクセスの方法が変わってくるんですね。

--mountの使い方

-v以外にもボリュームを指定する方法があります。
Dockerのバージョンがかなり古くない限り、現在はこちらの方法が推奨されています。
こちらのやり方の方が記述は長くなるものの、直感的でわかりやすい書き方になるのが特徴です。

--mountの使い方
docker run --mount type=[タイプ],source=[ボリューム名],target=[コンテナ側パス]
例えば
docker run --mount type=volume,source=ubuntu_volume_test,target=/data ubuntu

type:こちらは、マウントするボリュームのタイプです。volume以外にbindtmpfsがあります。
source:これはボリュームの名前を指定します。srcでも指定可能です。
target:コンテナ内のどこにマウントするかを指定します。

ボリュームの詳細を確認

ボリュームの情報を見るときに使うコマンドがあります。
inspectというコマンドです。

inspectの使い方
docker volume inspect ボリューム名
例えば
docker volume inspect ubuntu_volume_test

以下のような画像の結果が出てくると思い9ます。
image.png

項目 説明
CreatedAt ボリュームの作成日時
Driver 基本的にlocalだが、外部ストレージを使用する場合は変更される可能性あり
Labels 管理用にラベルをつけることができる
Mountpoint ローカルのマウントされている場所のパス
Name ボリュームの名前
Options 読み取り専用やパーミッションなどの設定を記述(初学者はまだ理解不要)
Scope 分散管理時にはlocalではなくglobal(初学者はまだ理解不要)

おわりに

今回はDockerのストレージの中のボリュームについて解説しました。初学者に押さえておいて欲しい基本的なところしか書いていないので、しっかり覚えていきたいですね。次回はバインドマウントについて解説していく予定です。バインドはローカルでのアプリの作成時にも使うことが多いので、なるべくわかりやすく解説していきたいと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?