【Docker】-v オプションを使ってデータをホストに保存する no.15

![パンプキン カフェ (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a6548d08-19f4-28aa-e270-48f742254b17.png)


こんにちは、まゆみです。

Dockerについての記事をシリーズで書いています。

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/41e95a9c0fb02b878521)では『-v』オプションについて書かせていただきました。

-v オプションは、Dockerの中で私が理解に一番苦労した部分であり、それゆえ、周辺知識も含め、たくさん調べながら勉強してきました。

その結果、Qiitaの記事にまとめたい量が膨大になってしまいました。

今回は<font color="DeepPink">前回の記事の続きというか補足的な記事</font>にしています。

ではさっそく始めていきますね。

#-v オプションを使う場面は主に2つある。

-v オプションを付けてコマンドを実行する場面は、大きく分けて２つあります。

下記に説明してきます。

##1)build context 内にあるファイルの更新をオンタイムでContainerに反映させる

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/41e95a9c0fb02b878521)の内容のおさらいになります。

![Build Context.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/91e892a3-55f8-a89e-770f-0bac3ea79433.png)

Dockerfileの入っているディレクトリーのことをbuild context (ビルドコンテキスト)と言います。

例えば、今、簡単なWebアプリを作っていて、build context内に、Dockerfileとapp.jsファイルがあるとします。

app.jsに何か変更が加えられた時、<font color="Red">『-vオプション』を使わなければ、Dockerfileをrebuildして、イメージを作り直して、そのイメージからContainerを実行させて。。。</font>というプロセスを踏まなければなりません。

ただそのような時に-v を使えば、<font color="Red">Containerに『あたかもbuild contextがあるかのように』マウントさせることができ、app.jsの変更がオンタイムでContainerに反映される</font>のです。(Webアプリなら、ブラウザーをリロードするだけでapp.jsの変更が反映されます。)

このような場面で、-vオプションを使いたい時は下記のようなシンタックスになります。

```
-v <build contextまでの絶対パス> : container側のディレクトリー
```

build context までの絶対パスを指定することで、build context内のすべてのファイルをContainerからマウント(参照)していることになります。


![Container (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/71fb1342-17fe-4a5d-4285-bb3b2280b3d7.png)

上記のイラストのような感じです。

##2)containerにデータを置きたくない時

では次に、-v オプションが使われる主な理由の2つ目を書いていきます。

例えば、あなたの作っているアプリに、ユーザーのログイン情報などを入力させる項目を作りたいとします

ユーザーログイン情報のようなデータは、

>Container をストップしたり、削除しても保ち続けたいデータ

ですよね。

そのような場合、Containerにデータを保存するのではなく、Host側にデータを置きContainerからマウントできるようにすると便利です。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/30b302df-4d63-6787-8ac5-29f1dd44ea99.png)
上のイラストのように、ホスト側にあなたの好きな名前の付けたディレクトリーを作り、それをContainer側からマウントして見ているというイメージになります。


そして、その時のシンタックスは以下のようになります。

```
-v <Host側のディレクトリ> ：<Container側のディレクトリ>
```

Host側のディレクトリーと書いている部分に、『あなたの好きな名前』を付けてください。

お客さんからのフィードバックを集計するアプリを作っているなら『feedback』とかなんでも可能です。(後でみて、どのデータを保持しているvolumeなのか分かる名前にしましょう。＼(^o^)／)

このように名前をつけてvolumeを作る方法を『Named Volume』と言います。


<font color="Red">名前を付けてvolumeを作っているため、そのvolumeを他のcontainerと共有することもできますし、Containerを削除してもvolume は別で生き残り続けます。</font>


```
docker volume --help
```

でvolumeを操作したい時のコマンドを表示させることができます(下のスクショ参考)


![2021-06-19_9-01-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3953b026-5b20-1aba-7cc0-0c78ced54bda.png)

では

```
docker volume ls
```
で、今あるvolumeのリストを表示させてみましょう


![2021-06-19_9-00-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/35ff0cc6-ca8d-3f9c-b5ff-9d1dd7aa0aaa.png)

VOLUME NAMEの項目に、名前がついているのがNamed Volumeであり、Containerを削除した後でも生き残りますから、名前を指定して、新しいContainerで再利用することができます。

数字の羅列のvolume はNamed Volume に対して『Anonymous Volume』と呼ばれます。

Anonymous (匿名)という言葉が示しているように、Containerを削除したらそれと同時に消されてしまうデータになります。

もちろん他のContainerと共有する事はできません。

Anonymousの使い方に関しては、また別の記事で取り上げますね。

#Bind Mount と Named Volumeの違いに関するドキュメントの資料

最後に、前回の記事で取り上げたBind Mount (ファイルシステム全体をマウントする事)と、今回の記事のメインテーマNamed Volume の違いに関して、[docker docs](https://matsuand.github.io/docs.docker.jp.onthefly/storage/bind-mounts/) の引用を貼っておきます。


![2021-06-19_9-33-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/b293d144-dab0-cc61-c2c4-51924da84a27.png)

#まとめ
今回の記事はここらあたりで締めくくらせていただきます。

お役に立てたなら幸いです。＼(^o^)／