##やりたいこと
####ポートがすでにあるコンテナに割り当てられているため新しいコンテナに割り当てたい
ミドルウェアのバージョンアップで新しいバージョンのDBに接続しようとしたら前のバージョンで構築されたコンテナにポートが取られていてmysqlへの接続ができない状態になりました。
WARNING: Image for service hoge was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Recreating hoge_mysql ... done
Creating hoge_apache_php74 ...
Creating hoge_apache_php74 ... error
ERROR: for hoge_apache_php74 Cannot start service web74: driver failed programming external connectivity on endpoint hoge_apache_php74 (f9dfceb538d7f688ad0d26269810a7d889): Bind for 0.0.0.0:8081 failed: port is already allocated
ERROR: for web74 Cannot start service web74: driver failed programming external connectivity on endpoint hoge_apache_php74 (f9dfceb538d7f841d4b2a7d26269810a7d889): Bind for 0.0.0.0:8081 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
Bind for 0.0.0.0:8081 failed: port is already allocated
エラーのメッセージそのままにポートがすでに割り当てられていますと出ています。
新規のコンテナのポートを変えれば良いのですが、プロジェクトで統一しているためDockerfileを触らずに
既存のコンテナを削除し、コンテナをキレイな状態にして再構築することにしました。
docker % docker ps -a //停止中も含めたコンテナの一覧表示
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d13d68d47e2c docker_web74 "/sbin/init" About an hour ago Created hoge_apache_php74
bb1e84be87ce docker_mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp hoge_mysql
5a06cd43f761 docker_web "apache2-foreground" 2 hours ago Up 2 hours 0.0.0.0:8081->80/tcp hoge_apache_php
docker % docker-compose top //docker-composeで作成された稼働コンテナのプロセス確認
hoge_mysql
PID USER TIME COMMAND
----------------------------
2889 999 1:56 mysqld
docker % docker-compose stop //docker-composeで作成されたサービスの停止
Stopping hoge_mysql ... done
docker % docker-compose kill //docker-composeで作成されたコンテナの強制停止
docker % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d13d68d47e2c docker_web74 "/sbin/init" About an hour ago Created hoge_apache_php74
bb1e84be87ce docker_mysql "docker-entrypoint.s…" About an hour ago Exited (0) 2 minutes ago hoge_mysql
5a06cd43f761 docker_web "apache2-foreground" 2 hours ago Up 2 hours 0.0.0.0:8081->80/tcp hoge_apache_php
docker % docker-compose down //docker-composeで作成されたコンテナを停止し、そのコンテナとネットワークを削除する
WARNING: Found orphan containers (hoge_apache_php) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing hoge_apache_php74 ... done
Removing hoge_mysql ... done
Removing network docker_default
ERROR: error while removing network: network docker_default id 46a29f96ef988d2366e0af50d1eb18690bff5db87e7b7cacee8e91d07097702e has active endpoints
docker % docker-compose top //docker-composeで作成された稼働しているコンテナがないことを確認
docker % docker-compose ps -a
Name Command State Ports
------------------------------
docker % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a06cd43f761 docker_web "apache2-foreground" 2 hours ago Up 2 hours 0.0.0.0:8081->80/tcp hoge_apache_php
docker % docker ps -aq | xargs docker rm //コンテナの全削除
Error response from daemon: You cannot remove a running container //稼働中のコンテナがあると全削除できない 5a06cd43f76166e8dc9c3517c3f6d8aeda7315f134b4d35865d893e85fa8ac79. Stop the container before attempting removal or force remove
docker % docker stop 5a06cd43f761 //コンテナの稼働を止める
5a06cd43f761
docker % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a06cd43f761 docker_web "apache2-foreground" 2 hours ago Exited (0) 4 seconds ago hoge_apache_php
docker % docker ps -aq | xargs docker rm ・・ //改めてコンテナの全削除
5a06cd43f761
docker % docker ps -a //コンテナが全て削除されていることを確認
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker % docker-compose up //buildされたのちupする
###構築完了
##まとめ
docker-composeで作成されたコンテナはstopやdown,killコマンドでコンテナの稼働を止め、コンテナとネットワークの削除を行いました。
そしてdocker-composeを利用していないコンテナについては
docker ps -aで確認して稼働していた場合、docker stop {docker ID}で稼働を止めました。
最終的にdocker ps -aq | xargs docker rmでコンテナを全削除を行い、コンテナを完全にない状態にしました。
docker ps -aとdocker-compose ps -aでコンテナの状況を確認しながらやってみるとコンテナが残ってたり、ネットワークが切れてなかったりしたのでかなりしつこくstopやらkillやらを実行しました。
やりたいコマンドが実行できない時はこまめにコンテナの状況を確認しながらコマンド実行すると良いと思います。
##参考
https://qiita.com/etaroid/items/88ec3a0e2d80d7cdf87a
https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2
https://qiita.com/tettsu__/items/302a11fe848dc8fe1f55