Dockerで「ポート番号が既に使われている」と出たときの対処法

# Dockerを起動させてエラーが起こる

先日作成したDockerを開く際にエラーが起こりました。
ネットワークの不調ということでdownさせずに落としたせいかな、、、と焦りながら
必死に解決策を試していきます。


```
#Dockerを起動させる
$ docker-compose up -d
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/f8c7941b-2633-416e-a4e4-dc8305ca9ae6.png)

本来は↑のように起動するはずなのですが、エラー時はRunnimgが1/2で止まってしまいました。エラーメッセージを確認すると、、、
```
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:50080 -> 
127.0.0.1:0: listen tcp 0.0.0.0:50080: bind: An attempt was made to access a socket 
in a way forbidden by its access permissions.
```
`このエラーは、ポート 50080 がすでに使用されているか、
アクセス権限の問題で Docker がポートをバインドできないことが原因です。`と表示されました。

今回はメッセージで表示された原因を、

**①ポート番号が既に使用されているか**

**②アクセス権限のやDockerをブロックしているものはないか**

の2つに絞って確認していくことにします。
早速以下の方法で、検証してみました。

# エラーの解消方法①～ポート番号が既に使用されているか～

```
#使用中のポートを確認
netstat -ano | Select-String ":50080"
```

結果は`反応なしで、何も表示されず`。
この場合は50080が使用されていないまたは使用できない状況だと考えられます。


また、この方法でだいたいは表示されるので解決策は下記を参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/7c43324a-efbd-4046-8074-8ec10fadff49.png)

https://qiita.com/shun198/items/ab6eca4bbe4d065abb8f

# エラーの解消方法②アクセス権限またはDockerをブロックしているものはないか～

エラー原因が全く特定できず、想定もできなかったためコパイロットを頼ることにしました。
すると、いくつか解決策を提案してくれました。

- ファイアウォールの設定を確認：ポート 50080 がブロックされていないか確認する
- セキュリティソフトの設定：Docker の通信が制限されていないか確認する

まずは順番に行っていきます。

### 1\.ファイアウォールの設定を確認
- `Win+R` を押し、`firewall.cpl`を実行する
- 左側の「詳細設定」をクリック

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/3cd21e20-6650-40a2-a74c-4c4a0d5e3c9c.png">

- 受信・送信の規則をそれぞれ同様に設定していきます
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/7f574f85-0120-40ac-8dc1-2a9453dd72a5.png">

- 「新しい規則」を選択し、「ポート」を選択して「次へ」
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/b14f0509-b5cf-4527-a050-44cfeb7437b2.png">

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/fd34a62d-aaa1-4a39-b3be-f82632502003.png">

- 「特定のローカルポート」に 50080(ポート番号)を入力し、「次へ」
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/6f0396a9-acdf-470c-af60-3bcad0f1a77f.png">

- 「接続を許可する」を選択し、「次へ」
- 適用するネットワーク（プライベート、パブリックなど）を選択し、「次へ」
- ルール名を設定（例：Docker Port ポート番号）し、「完了」
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/7bb189df-9899-416b-9904-473626d17c12.png">

- 送信ルールの確認も同様の手順で追加しました


### 2\.セキュリティソフトの設定を確認
- 使用しているウイルス対策ソフト（Windows Defender、McAfee、Norton、ESET など）を開いて、ファイアウォールの設定を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/cf9565bd-562a-42de-8abc-7deb07ef1f38.png)
自分のPCにはAVASTがインストールされていたので、さっそく開いて中身を確認しました

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/dc8315e2-79f2-4ab1-9d5e-039e177071f8.png">

- Docker Desktop や com.docker.backend.exe がブロックされていないか確認すると、
「ランサムウェアシールド」にそれらしきファイルが入っていたので、許可を実行しました

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/df0cfb63-756c-4478-8f9a-9c8f72edc387.png">


- 今後もブロックされないようにアプリを 例外設定 またはブロック対象にしないように設定する
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/86d55424-3649-470b-b992-da31f7478ff2.png">

一通り完了したので、ポート番号が受信できる状況になったか確認します。


**ポート番号が許可されているか確認する**
- 再度使用中のポート番号を確認したところ、許可されているようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4052007/7c43324a-efbd-4046-8074-8ec10fadff49.png)


Dockerの起動もでき、見事解決いたしました。
ポート番号を出力できない、状況確認ができない状況にあり大変苦労しました。

以上が1回目で解決した例です。


# ポート番号の切断・接続処理

別日にも同じ挙動でDockerのポート番号がエラーを起こしていました。
またも振り出し、、
と、あきらめましたが、ポート番号の接続・切断処理をする方法を見つけました。

https://mossuru777.hatenablog.com/entry/2023/05/29/162333

```
#ポート番号の表示
netsh int ipv4 show excludedportrange protocol=tcp
```

```
#
net stop winnat

#
net start winnat
```
毎回この処理をするのは面倒ですが、
何が原因か分かるまではこれが最適化と思います。


ソフトウェアのセキュリティでブロックされることもあるので、
ぜひ今回の対処法を参考にしてみてください。