はじめに
こんにちは!ITスクールRareTECHにてCS(Customer Support)を担当している池村です!
今回の記事はDockerのストレージについて解説します。ここから結構難しくなってくる印象です。要はDockerコンテナ内のデータをどう保存していくのか?というお話です。
前回の記事を読んでいただけた方はイメージを作ることによってデータを保存していたと認識していると思います。それ以外にも方法がありますので、学習していきましょう。
前回の記事はこちら
Dockerのボリューム
Dockerコンテナ内のデータをなるべくずっと使いたい。要は永続化したい場合、コンテナとホストでデータを共有するボリュームという仕組みが使われます。
メリットは以下になります。
- データの永続化ができる
- 複数のコンテナで同じデータを共有できる
我々の使うPC内の特定の場所にデータを保存しておくことで、コンテナを削除してもデータが消えることなく保存されます。ボリュームの大きな利点です。
ボリュームにはいくつか種類があります。
- ボリューム
- バインドマウント
- tmpfs マウント
今回はその中のボリュームについて初学者が押さえてほしい範囲を解説します。
ボリューム
ボリュームですが、こちらはホストにあるDocker areaという場所にデータを保存する方法です。この場所はDockerが管理している場所になります。
まあどういった形で保存されているのか、最初はよくわからないと思うので、ハンズオンをしながら見ていきましょう!
docker volume create ボリューム名
docker volume create ubuntu_volume_test
上記、ボリュームの名前はなんでも大丈夫です。また今回もUbuntuを使いますので、私の書いたボリューム名を真似してもOKです。
ではUbuntuのコンテナを起動して、今作成したボリュームを紐付けてみましょう。
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
以下のような画像と同じようになったと思います。無事データが保存されていますね。
ボリュームはどこに保存されているのか?
/var/lib/docker/volumes/
上記のディレクトリ内にデータが保存されます。
docker run -it --rm --privileged --pid=host justincormack/nsenter1
右下にubuntu_volume_test
がありますね。
Macの場合は上記のコマンドを使って、Docker Desktopの仮想マシン内に入って確認する必要があります。MacはLinuxと親戚のようなものではありますがUNIX系列のOSなので、アクセスの方法が変わってくるんですね。
--mount
の使い方
-v
以外にもボリュームを指定する方法があります。
Dockerのバージョンがかなり古くない限り、現在はこちらの方法が推奨されています。
こちらのやり方の方が記述は長くなるものの、直感的でわかりやすい書き方になるのが特徴です。
docker run --mount type=[タイプ],source=[ボリューム名],target=[コンテナ側パス]
例えば
docker run --mount type=volume,source=ubuntu_volume_test,target=/data ubuntu
type
:こちらは、マウントするボリュームのタイプです。volume
以外にbind
とtmpfs
があります。
source
:これはボリュームの名前を指定します。src
でも指定可能です。
target
:コンテナ内のどこにマウントするかを指定します。
ボリュームの詳細を確認
ボリュームの情報を見るときに使うコマンドがあります。
inspect
というコマンドです。
docker volume inspect ボリューム名
例えば
docker volume inspect ubuntu_volume_test
項目 | 説明 |
---|---|
CreatedAt |
ボリュームの作成日時 |
Driver |
基本的にlocal だが、外部ストレージを使用する場合は変更される可能性あり |
Labels |
管理用にラベルをつけることができる |
Mountpoint |
ローカルのマウントされている場所のパス |
Name |
ボリュームの名前 |
Options |
読み取り専用やパーミッションなどの設定を記述(初学者はまだ理解不要) |
Scope |
分散管理時にはlocal ではなくglobal (初学者はまだ理解不要) |
おわりに
今回はDockerのストレージの中のボリュームについて解説しました。初学者に押さえておいて欲しい基本的なところしか書いていないので、しっかり覚えていきたいですね。次回はバインドマウントについて解説していく予定です。バインドはローカルでのアプリの作成時にも使うことが多いので、なるべくわかりやすく解説していきたいと思います。