Docker Volume についてまとめてみた

## はじめに
最初volumeの関係がよく分からなかったので
まとめてみました。
(重要な点のみ記載してます、間違ってたらコメント下さい)

## 環境
本記事は以下の環境等を使用しております。

| 環境 | Version | application |
|:-----|:--------|:--------|
| Windows | 10(64bit) | Docker for Windows |
| macOS | Mojave(64bit) | Docker for Mac |

## 前準備 
[Windows：Docker環境が使用可能であること](https://qiita.com/osugizmo/items/81cc3581e8b40189c470)

Mac：Docker環境が使用可能であること(Coming Soon)

## 【結論】`-v` オプションの動作はこんな感じ
![Docker2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269640/da66d7da-f8a6-bbe9-6c64-73be0760e682.png)
ちなみに公式では`--mount` が推奨されていますが
今回は` -v` の確認なので`--mount`には触れません。
以降は確認した内容です。

## コンテナの起動とボリューム生成(自動)
```shell:terminal
# ① ～ ⑤
>docker run -v vol1 --name c1 -itd osugizmo/alpine:3.9.4 /bin/sh
>docker volume ls ★ボリューム名をメモっておく
>docker run -v vol1 --name c2 -itd osugizmo/alpine:3.9.4 /bin/sh
>docker run -v <①Volumeのhash値>:/vol1 --name c3 -itd osugizmo/alpine:3.9.4 /bin/sh
>docker run -v vol2:/vol1 --name c4 -itd osugizmo/alpine:3.9.4 /bin/sh
>docker run -v /c/vol3:/vol1 --name c5 -itd osugizmo/alpine:3.9.4 /bin/sh

# 起動コンテナの確認
>docker ps -a
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
d44602250ba5        osugizmo/alpine:3.9.4   "/bin/sh"           26 minutes ago      Up 26 minutes                           c5
fd986a43c555        osugizmo/alpine:3.9.4   "/bin/sh"           26 minutes ago      Up 26 minutes                           c4
52170f5abcd0        osugizmo/alpine:3.9.4   "/bin/sh"           26 minutes ago      Up 26 minutes                           c3
b0899080f006        osugizmo/alpine:3.9.4   "/bin/sh"           27 minutes ago      Up 27 minutes                           c2
4a7d512beff1        osugizmo/alpine:3.9.4   "/bin/sh"           27 minutes ago      Up 27 minutes                           c1

# ボリュームの確認
>docker volume ls
DRIVER              VOLUME NAME
local               3fe77f2217648fad943a325442a85ec350213eb837f7169d653ddbf04c61b4fd
local               62ec5b816fc407e53582a092762ff43610e7f91f99b95c112fd83b6745a3abd6
local               vol2
```

## C1コンテナに接続しているボリュームにファイル作成
```shell:terminal
>docker exec -it c1 /bin/sh
/# ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var    vol1 # <---★マウントされている

/# echo c1-container > /vol1/c1-file1.txt # <---★ファイル作成＋書き込み

/# ls -la /vol1/
total 12
drwxr-xr-x    2 root     root          4096 Jun 16 17:39 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:04 ..
-rw-r--r--    1 root     root            13 Jun 16 17:39 c1-file1.txt # <---★ファイルが存在する

/# cat /vol1/c1-file1.txt
c1-container # <---★書き込まれている

/# exit
```

## C2コンテナに接続しているボリュームにファイル作成
```shell:terminal
>docker exec -it c2 /bin/sh
/# ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var    vol1 # <---★同じvol1でマウントされている

/# ls -la /vol1 # <---★C1とは別のボリュームなのでファイルが存在しない

total 8
drwxr-xr-x    2 root     root          4096 Jun 16 17:04 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:04 ..

/# echo c2-container > /vol1/c2-file1.txt # <---★ファイル作成＋書き込み

/# ls -la /vol1/
total 12
drwxr-xr-x    2 root     root          4096 Jun 16 17:50 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:04 ..
-rw-r--r--    1 root     root            13 Jun 16 17:50 c2-file1.txt # <---★ファイルが存在する

/# cat /vol1/c2-file1.txt
c2-container # <---★書き込まれている

/# exit
```


## C3コンテナに接続しているボリュームにC1ボリュームのC1ファイルがあるか確認
```shell:terminal
>docker exec -it c3 /bin/sh
/# ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var    vol1 # <---★同じvol1でマウントされている

/# ls -la /vol1 # <---★C1のボリュームなのでファイルが存在する
total 12
drwxr-xr-x    2 root     root          4096 Jun 16 17:39 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:05 ..
-rw-r--r--    1 root     root            13 Jun 16 17:39 c1-file1.txt

/# cat /vol1/c1-file1.txt
c1-container # <---★C1で作成したファイル＋内容と一致

/# exit
```

## C4コンテナに接続しているボリュームにファイル作成
```shell:terminal
>docker exec -it c4 /bin/sh
/# ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var    vol1 # <---★マウントされている

/# echo c4-container > /vol1/c4-file1.txt # <---★ファイル作成＋書き込み

/# ls -la /vol1/
total 12
drwxr-xr-x    2 root     root          4096 Jun 16 18:20 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:05 ..
-rw-r--r--    1 root     root            13 Jun 16 18:20 c4-file1.txt # <---★ファイルが存在する

/# cat /vol1/c4-file1.txt
c4-container # <---★書き込まれている

/# exit
```



## C5コンテナに接続しているボリュームにファイル作成
```shell:terminal
>docker exec -it c5 /bin/sh
/# ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var    vol1 # <---★同じvol1でマウントされている

/# ls -la /vol1 # <---★C1～C4とは別のボリュームなのでファイルが存在しない

total 8
drwxr-xr-x    2 root     root          4096 Jun 16 17:04 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:04 ..

/# echo c5-container > /vol1/c5-file1.txt # <---★ファイル作成＋書き込み

/# ls -la /vol1/
total 5
drwxrwxrwx    2 root     root             0 Jun 16 18:13 .
drwxr-xr-x    1 root     root          4096 Jun 16 17:05 ..
-rwxr-xr-x    1 root     root            13 Jun 16 18:13 c5-file1.txt<---★ファイルが存在する
※ホスト(Windows)とbindしているから？実行権限が自動でついた

/# cat /vol1/c5-file1.txt
c5-container # <---★書き込まれている

/# exit

>cd c:\vol3
>c:\vol3>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C823-E669 です

 c:\vol3 のディレクトリ

2019/06/17  03:13    <DIR>          .
2019/06/17  03:13    <DIR>          ..
2019/06/17  03:13                13 c5-file1.txt # <---★書き込まれている

```

## 最後に
個人的にはホストのpermissionに影響を受けたくないので
抽出したいときは④ベースでtarにまとめてcpです。
(あくまでも個人的見解なのでオススメがあれば教えてください)

```shell:terminal
# 抽出したいものをtarでまとめる
>docker exec -i c4 tar -zcvf vol1.tar.gz /vol1

# コンテナからホストにコピー
>docker exec -i c4 ls -la
>docker cp c4:/vol1.tar.gz ./

# コンテナからまとめたtarを削除
>docker exec -i c4 rm /vol1.tar.gz
>docker exec -i c4 ls -la

# 解凍
>tar -zxvf vol1.tar.gz
```