Docker Volumeの罠

Dockerを触っていて今回、ドツボにはまってしまったので、備忘録として残します。

# Docker Volumeの罠
Dockerに接続するときに、なぜか接続が上手くできませんでした。
色々を調査をするとDocker Volumeが悪さをしていたらしいとのことです。
まずは、構成図を載せておきます。
分かりやすくするためにtmp/test/の下に適当なファイルを置きます。もう一方にはファイルを置きません。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/96f6b8a2-092c-087d-55f2-c52331b84ef5.png)


適当なディレクトリの下に「test」という名前でプロジェクトを作成し、もう一つはtmpというディレクトリの下にtestというプロジェクトを作成します。

一応画像でも確認しましょう。
lsコマンドでtestがあることが分かります。また、tmpディレクトリも作成されています。（見えにくくて申し訳ないです）
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/248b1093-8ee5-bc9f-19ad-f9ab37cc5ff8.png)

tmpの中にtestがあることが確認できました。
![タイトルなし1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/1da5032e-4c93-7da2-2de5-eb048ef2c6e1.png)

この状態で、tmpディレクトリの中にあるtestをDockerに接続します。
次のコマンドでvscodeを立ち上げます。
```
code .
```
今回はWSL:Ubuntu経由でDockerに接続します。
赤枠をクリックします。
![タイトルなし2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/3c0dfbc1-f11f-f553-61c0-12199d3c1290.png)

「コンテナーで再度開く」をクリックします。
![タイトルなし3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/2012ad12-f7ea-7340-f172-5965ce8c8438.png)

Dockerに接続できました。もちろん「aaa.txt」もあります。
![タイトルなし4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/e626bf85-7f25-c1de-0be7-50ce97fa5e52.png)


では、一旦これを閉じて次はもう一つのtestからDockerに接続してみます。
![タイトルなし5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/8b1c7080-421a-c3da-35e0-152d3d47f497.png)

なぜか、こちらにも「aaa.txt」があります。ちなみに、同じ画面を載せているわけでも、「aaa.txt」を追加しているわけではありません。

色々、調査するとdocker volumeが悪さをしているようです。なので、まずはdocker volumeを見てみましょう。
次のコマンドを実行します。
```
docker volume ls
```
![タイトルなし6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/b6ad8160-5ec2-f886-76ab-f709596bc207.png)
下の２つは無視してもらって構いません。ここで、VOLUME_NAMEというものを見ていただくとtestなんちゃらと表示されています。
どうやら、dockerに初めて繋ぐとdocker volumeを作成し、２回目以降はここから情報をたどって接続するようです。

初回の動き
1.tmp/testからdockerに接続。
2.docker volumeを作成し、tmp/testのディレクトリをマウントする。
3.vscodeに表示する。

２回目以降の動き
1.dockerに接続。
2.testという名前でvolumeが作成されているため、マウント情報を読み込み、tmp/testを返す。
3.vscodeに表示する。

といった流れになると思います。
プロジェクト名で判断されるため、tmpの下にないtestから起動してもtmp/testの中を開いていると思います。
では、ここでtmp/testをtmp/aaaに変えてみます。
![タイトルなし7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/c153287e-72aa-0e52-caca-378ba67dcc5c.png)

この状態でディレクトリ名を変えていない方のプロジェクトからdockerに接続してみます。
![タイトルなし8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/601f0453-24d9-0a5a-87a8-44aef94b0420.png)
接続エラーになり、プロジェクトが開けません。

# 対応策
ここで、原因がdocker volumeにあると分かったので、docker volumeから削除すればいいことが分かりましたので、削除していきましょう。

手順は次の通りになります。
## コンテナから削除

```
docker ps -a
```

上のコマンドを実行すると次のような画面が表示されます。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/69ebe6f3-dc88-da1a-b035-f01ef9682d6c.png)
肝心なところが見えずらいのですが、NAMESというものがあります。そこにtest〇〇というものがあるので、そのコンテナを停止して削除します。今回の場合、IDは「7718c4f48bc8」と「ec972b7c86e3」です。

```
docker stop "コンテナID"
docker rm "コンテナID"
```
![タイトルなし9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/697f12af-ef84-c1fa-5257-b647eb013ff3.png)
これでコンテナから削除されたので、次にdocker volumeを削除します。

## docker volumeの削除
手順は似ています。
```
docker volume ls
```
上のコマンドを実行するとdocker volumeの情報が表示されます。表示内容は上のものと同じです。
ここで、VOLUME_NAMEを調べて次のコマンドを実行します。
```
docker volume rm "ボリューム名"
```
これで削除できたか確認しましょう。
![タイトルなし10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/9bcaa00c-c396-5c38-d160-2e6cae204d86.png)
docker volumeからtest〇〇が消えていることが確認できました。

では、もう一度、tmpディレクトリの下にないtestからdockerに接続してみます。
![タイトルなし11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/fbab80ac-ec5e-2bf6-9bc6-2602808e7834.png)
今度は「aaa.txt」がありません。これで、tmp/testではなく、testに接続されていることが分かりました。

不要になったコンテナは定期的に削除していかないとこの罠に陥ることになると思います。
少しでも参考になれば幸いです。