既存のdockerコンテナにポートが割り当てられているため新規のコンテナでDB接続できないときの解消法


##やりたいこと
####ポートがすでにあるコンテナに割り当てられているため新しいコンテナに割り当てたい

ミドルウェアのバージョンアップで新しいバージョンの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