dockerで共有ボリュームを試してみる

複数のコンテナ間でストレージを共有したい、ということで
[こちらのサイト](https://thinkit.co.jp/story/2015/09/15/6384)を参考に試してみる。

## やること
share、mainという２つのコンテナを作成。
　コンテナ起動時にそれぞれ以下のようにボリュームオプションを指定
　share： -v /data/vol0001 ※共有ディレクトリ作成
　main ： --volumes-from share ※shareのボリュームオプションを引き継ぐ

起動したら共有ボリュームにファイルを作成し
それぞれのコンテナからきちんと見えることを確認する。


##shareコンテナ起動
```sh:shareコンテナ起動
$ docker container run -it -d -v /data/vol0001 --name share registry.access.redhat.com/ubi7/ubi:latest /bin/bash
c72dff13bff397a38c70d3b45ba022ffb3f808b9124296971568396e8ec4d1e6
$
$ docker container ls -a
CONTAINER ID        IMAGE                                        COMMAND             CREATED             STATUS              PORTS               NAMES
c72dff13bff3        registry.access.redhat.com/ubi7/ubi:latest   "/bin/bash"         10 seconds ago      Up 9 seconds                            share
$
```

##mainコンテナ起動
```sh:mainコンテナ起動
$ docker container run -it -d --volumes-from share --name main registry.access.redhat.com/ubi7/ubi:latest /bin/bash
e942908dca92c1a2f76d78bb256d4403442b5e89cd86e45a1feb7dcb957bafa6
$
$ docker container ls -a
CONTAINER ID        IMAGE                                        COMMAND             CREATED             STATUS              PORTS               NAMES
e942908dca92        registry.access.redhat.com/ubi7/ubi:latest   "/bin/bash"         3 seconds ago       Up 2 seconds                            main
c72dff13bff3        registry.access.redhat.com/ubi7/ubi:latest   "/bin/bash"         2 minutes ago       Up 2 minutes                            share
$
```

##shareコンテナに入り、共有ボリュームにファイルを作成
```text:shareコンテナ側からファイル作成
$ docker container exec -it share /bin/bash
#
# cd /data/vol0001
# echo "this is share" > test.txt
# cat test.txt
this is share
# exit
exit
$
```

##mainコンテナに入り、共有ボリュームを確認し追記
```text:mainコンテナ側から追記
$ docker container exec -it main /bin/bash
# cd /data/vol0001
# ls -l
total 4
-rw-r--r-- 1 root root 14 Jun 28 12:44 test.txt
#
# cat test.txt
this is share
#
# echo "this is main" >> test.txt
#
# cat test.txt
this is share
this is main
#
# exit
exit
$
```

##shareコンテナで追記内容を確認
```text:shareコンテナ側で確認
$ docker container exec share cat /data/vol0001/test.txt
this is share
this is main
$
```


##shareコンテナを停止してもmainから共有ボリュームが見れるか
```sh:shareコンテナ停止
$ docker container stop share
share
$

$ docker container ls -a
CONTAINER ID        IMAGE                                        COMMAND             CREATED             STATUS                        PORTS               NAMES
e942908dca92        registry.access.redhat.com/ubi7/ubi:latest   "/bin/bash"         13 minutes ago      Up 8 minutes                                      main
c72dff13bff3        registry.access.redhat.com/ubi7/ubi:latest   "/bin/bash"         15 minutes ago      Exited (137) 13 seconds ago                       share
$

$ docker container exec main cat /data/vol0001/test.txt
this is share
this is main
$
```
問題なく見える

##shareコンテナを削除してもmainから共有ボリュームが見れるか
```sh:shareコンテナ削除
$ docker container rm share
share
$

$ docker container ls -a
CONTAINER ID        IMAGE                                        COMMAND             CREATED             STATUS              PORTS               NAMES
e942908dca92        registry.access.redhat.com/ubi7/ubi:latest   "/bin/bash"         14 minutes ago      Up 9 minutes                            main
$

$ docker container exec main cat /data/vol0001/test.txt
this is share
this is main
$
```
問題なく見える

## 後片付け
```sh:後片付け
$ docker container rm -f main
main
$

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$
```


##気になったことを調べてみる
run時に　-v /data/vol0001 でdockerボリュームを作成したが
このボリュームはどこに存在するのか。

下記サイトのおかげで疑問は解消。
https://karuta-kayituka.hatenablog.com/entry/2019/05/04/114056

>ファイル内のVOLUMEが指すものは、どこに存在するものなのか?(ホストのどこか?)
⇒ホストに存在するが特定のディレクトリと共有してるわけではなく、
　docker volumeとして作成された新たなボリュームを指している

>docker runのvオプションとはVOLUMEは別物なのか?
⇒同じである。 名前付きかどうかという違いがあるぐらいだ

また、共有ボリュームは docker volume ls で確認できるが
名前がハッシュ値になっているためどれがどれだか分からなかった。
これはdocker volume createで事前にボリュームを作成せず
docker run -vで自動で新規作成してしまったため（自動作成だと名前がハッシュになる)。

docker volume create v1
のように明示的に名前を指定してボリュームを作成し
docker container run -v v1:/data/vol0001 … 
のようにコンテナ起動するべきだった。


ということで、きちんと後片付けしたつもりだったが
共有ボリュームが残っていることが分かったので docker volume で削除。

```sh:共有ボリューム削除
$ docker volume rm 5e123abdf19ececb4e3791aeedafc2d7bc8c50bfaeccbdf8f4c1df7b99d4a019
5e123abdf19ececb4e3791aeedafc2d7bc8c50bfaeccbdf8f4c1df7b99d4a019
$
$ docker volume ls
DRIVER              VOLUME NAME
$
```

個人メモ
　dockerボリュームはホスト上に存在するので
　fargateだと同じことはできなそう。そのためのEFSのはず。