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

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

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

前回の記事はこちら

https://qiita.com/ikemura-ren/items/8bad27179b09cd507e2c

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

メリットは以下になります。
1. データの永続化ができる
1. 複数のコンテナで同じデータを共有できる

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

ボリュームにはいくつか種類があります。
1. ボリューム
1. バインドマウント
1. tmpfs マウント

![types-of-mounts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/0c8fb194-c83f-22a8-eb54-ac07eeea9a18.png)
※画像はDocker docsより引用

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

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

![types-of-mounts-volume.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/08d072ac-d403-8444-1570-7ce14b2cd5cd.png)


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

```Bash:ボリュームの作り方
docker volume create ボリューム名
docker volume create ubuntu_volume_test
```
上記、ボリュームの名前はなんでも大丈夫です。また今回もUbuntuを使いますので、私の書いたボリューム名を真似してもOKです。

ではUbuntuのコンテナを起動して、今作成したボリュームを紐付けてみましょう。
```Bash:volumeの紐付け
docker run -v [ホスト側パス]:[コンテナ側パス]
例えば
docker run -it -v ubuntu_volume_test:/data ubuntu
```
`-v`：ボリュームを紐づけるオプション
ホスト側パス：作成したボリューム名をつける
コンテナ側パス：コンテナ内のどこに紐づけるかのパス

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

ではコンテナの中に入っていると思いますので、その中でファイルを作成してみましょう。
```Bash:ファイルを作成
cd data && echo 'Hello World' >> test.txt
```
コマンドを叩いたら`exit`で出ていただき、いったんコンテナを削除しましょう。

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

次にもう一度Ubuntuを起動します。もちろんボリュームは先ほど作ったボリュームにします。
```Bash:コンテナを再作成
docker run -it -v ubuntu_volume_test:/data ubuntu
```
以下のような画像と同じようになったと思います。無事データが保存されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/06bafdca-dc36-e8bd-4d5f-ed78824a60f4.png)

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

```Bash:Linux環境の場合
/var/lib/docker/volumes/
```
上記のディレクトリ内にデータが保存されます。
```Bash:Macの場合
docker run -it --rm --privileged --pid=host justincormack/nsenter1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/6e17dccd-e328-336e-c635-c484e224d2e0.png)
右下に`ubuntu_volume_test`がありますね。
Macの場合は上記のコマンドを使って、Docker Desktopの仮想マシン内に入って確認する必要があります。MacはLinuxと親戚のようなものではありますがUNIX系列のOSなので、アクセスの方法が変わってくるんですね。

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

```Bash:--mountの使い方
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`というコマンドです。

```Bash:inspectの使い方
docker volume inspect ボリューム名
例えば
docker volume inspect ubuntu_volume_test
```
以下のような画像の結果が出てくると思い９ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/69393ea5-8033-53ce-5c87-23e6a2ed009d.png)

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


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

次の記事はこちら👇

https://qiita.com/ikemura-ren/items/d9de3d767bdeca3bf089

まとめ記事に戻るにはこちら👇

https://qiita.com/ikemura-ren/items/b961642d55e4e6515203