docker run start stop rm これらの違いが分かってないせいで混乱したので整理した

疑問が解消する軌跡をつらつらと書いただけなのですが、調査の過程で見つけた最後の方にも載せた[漫画](https://linuxhandbook.com/sigterm-vs-sigkill/#:~:text=Though%20both%20of%20these%20signals,cannot%20be%20handled%20or%20blocked.)は面白いのでそれだけは読む価値あると思います。


## 混乱した
`❯ docker-compose down && docker-compose build && docker-compose up -d`

でコンテナを立ち上げようとしたところ、以下のようなエラーが出た。

```
xxxxx is already in use by container XXXX. You have to remove (or rename) that container to be able to reuse that name.
```

状況


変更を加えたので動作確認。

```
❯ docker-compose down && docker-compose build && docker-compose up -d

ERROR: error while removing network: network api_default id 60787690a4b735345074058c898ff548a05bb40620df966be71b49f199b3143d has active endpoints
```

```
❯ docker ps                                                                                               ✘ 1
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                                          NAMES
f82550be9b32        my_fluent-bit   "/fluent-bit/bin/flu…"   55 minutes ago      Up 55 minutes       2020/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp   fluent-bit
```

fluent-bitのコンテナだけ動いている。これがnetworkを掴んでしまっているせいで`docker-compose down`できない。


```
❯ docker stop fluent-bit
fluent-bit
```

もう一度

```
❯ docker-compose down && docker-compose build && docker-compose up -d
```


ここで冒頭のエラー

```
xxxxx is already in use by container XXXX. You have to remove (or rename) that container to be able to reuse that name.
```

疑問
このエラー何度か見たことある気がするけど、動いているコンテナないのになぜその名前は使用されているというエラーが出る？？コンテナってDockerfileをビルドしてできたDockerイメージから作る、メモリ上で動いているインスタンスだと思っていたのだが・・・。

## 整理した

ちなみに、気になってAnkiを検索してみたら、

>
コンテナ（container） とはイメージのランタイム・インスタンス（runtime instance；実行状態にあるモノ）です。言い換えれば、イメージからメモリ内に展開し、実際に実行する何かです。

とあった。ググってみたらソース元はhttps://man.plustar.jp/docker/get-started/index.html
結構信頼できそうなページだが、違うのだろうか。いろいろな意味があるのかな。


このエラーの解決策を調べ、

`docker rm fluent-bit`を実行したところこの問題は解決された。

`docker stop`ではダメで`docker rm`じゃないといけない・・・？

### 動いているコンテナと止まっているコンテナと削除されたコンテナ

>
docker stop preserves the container in the docker ps -a list (which gives the opportunity to commit it if you want to save its state in a new image).

docker ps -a をやるとたくさん出てきたけど、このコマンドは何を表示している？

>
-a is short form for --all. It shows all the containers both stopped and running. Normal docker ps shows only the running containers. When you provide the option -a, it shows all the containers.
https://stackoverflow.com/questions/58869556/what-is-the-meaning-of-docker-ps-a

なるほど。動いているコンテナと止まっているコンテナがある。とすると自分の認識はちょっとずれていたみたい。

ここで改めてインスタンスについて調べてみると、インスタンスとはclassやDockerfileなどの設計図とも言えるものから作ったメモリで動作できるもの、でインスタンスがインスタンスであるためにメモリで動作している必要性は必ずしもない、と理解した。

>
ソフトウェアの分野では、あらかじめ定義されたコンピュータプログラムやデータ構造などを、メインメモリ上に展開して処理・実行できる状態にしたものを指す。
http://e-words.jp/w/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9.html

メインメモリ上に展開して処理・実行できる状態だがメインメモリ上に展開して処理・実行しているとは限らないということですかね。

とすると、動いているコンテナと止まっているコンテナが両方ともインスタンスと呼ばれても納得できる。


>
docker rm will remove the container from docker ps -a list, losing its "state" (the layered filesystems written on top of the image filesystem). It cannot remove a running container (unless called with -f, in which case it sends SIGKILL directly).


ちなみに、ドキュメントではdocker-compose downの説明は以下のようになっている。

>
Stops containers and removes containers, networks, volumes, and images created by up.

やっぱりremoveまでやっているのか。

### docker stop docker startの挙動
つまり、stopだけだとインスタンスの削除までは行われない。stopしたコンテナをもう一度動かすには、`docker run`ではなく`docker start`というコマンドがあるのでそっちを使う必要がある。

ビルドし直すときは、同じ名前使いたいなら`docker rm`することになりますね。


docker rmをしてしまうと、ファイルシステムはリセットされてしまうが、docker stopだとコンテナのファイルシステムはそのまま保持される。

```
docker run --name app -d app
docker exec -it app bash
mkdir aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

docker stop app

docker start app

root@63e4214977ef:/dir# ls
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
```

ここで、

```
docker stop app

docker run --name app -d app
```
としてしまうと、どんなエラーが出るかもうわかるでしょうか？

>
"app" is already in use by container "63e4214977ef803a2ec8e0ab13c76cd051f0da10120c02c4642ea28ab07f9d6d". You have to remove (or rename) that container to be able to reuse that name.

というエラーが出てしまいます。

## ちなみに docker stopについて
docker stopが実行された時には、docker daemonからSIGTERM, そしてSIGKILLがコンテナの全てのプロセスに送られるようです。
よって、stopped状態のコンテナがたくさんあってもホストの容量が圧迫される以外のホストマシンへの悪影響はないそう。

SIGTERM, SIGKILLの違いについて説明している非常に面白い漫画があったので読んでみてください！↓
https://linuxhandbook.com/sigterm-vs-sigkill/#:~:text=Though%20both%20of%20these%20signals,cannot%20be%20handled%20or%20blocked.



## 振り返り
冒頭の、
>
動いているコンテナないのになぜその名前は使用されているというエラーが出る？？コンテナってDockerfileをビルドしてできたDockerイメージから作る、メモリ上で動いているインスタンスだと思っていたのだが・・・。

という疑問は、コンテナをstopすることとrmすることの違いをよく分かっておらず意識できていなかったために湧いた疑問だと言えます。

解決したので良かったです。