疑問が解消する軌跡をつらつらと書いただけなのですが、調査の過程で見つけた最後の方にも載せた漫画は面白いのでそれだけは読む価値あると思います。
混乱した
❯ 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することの違いをよく分かっておらず意識できていなかったために湧いた疑問だと言えます。
解決したので良かったです。