DockerコンテナでTCPポートをListenしようとしたら、"Error response from daemon: Ports are not available: listen tcp 0.0.0.0:1080: bind: An attempt was made to access a socket in a way forbidden by its access permissions."となってしまう現象の解消方法 → winnatサービスが原因でした
n番煎じですが、備忘録として書きます。
目次
環境
- Windows 10 Pro 64bit 22H2 (ビルド: 19045.3031)
- Docker Desktop 4.19.0
症状
DockerでTCP 1080ポートをListenするコンテナを立ち上げようとしたら、下記のエラーメッセージが出てStartできませんでした。
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:1080: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
確認 or 試してみてダメだったこと
エラーメッセージでググって出てきた解決策のうち、下記を試してみましたが、コンテナをStartしようとすると同じエラーメッセージが出てしまいました。
- ポートを使用しているプログラムの終了 *1
- Dockerの再起動
- OSの再起動
(試してないこと)
- Hyper-Vを一度無効化してから再度有効化する
確認して該当したこと
ポートのListenを拒否するWindowsのポート除外範囲 *2 に当該ポートが含まれた設定があるかを下記のコマンドで確認しました。
netsh int ipv4 show excludedportrange protocol=tcp
今回の場合には、出力結果に当該ポートが含まれる設定が見つかりました。
PS C:\Windows\system32> netsh int ipv4 show excludedportrange protocol=tcp プロトコル tcp ポート除外範囲 開始ポート 終了ポート ---------- -------- 1050 1149 1150 1249 1250 1349 1605 1704 1705 1804 1805 1904 5357 5357 13200 13299 13300 13399 13400 13499 50000 50059 * * - 管理されている除外ポート。 PS C:\Windows\system32>
解消方法
winnatサービスの再起動によりWindowsのポート除外範囲として予約されている範囲がリセットされたと思われ、DockerコンテナをStartしてポートをListenすることができましたので、その手順を紹介します。
- コマンドプロンプト / PowerShell (どちらも管理者権限)
C:\Windows\system32>net stop winnat Windows NAT Driver サービスは正常に停止されました。 C:\Windows\system32>net start winnat Windows NAT Driver サービスは正常に開始されました。 C:\Windows\system32>
- PowerShellのみ (管理者権限)
PS C:\Windows\system32> Restart-Service -Name winnat PS C:\Windows\system32>
(参考) winnatサービスを再起動してエラーが解消した後のポート除外範囲
PS C:\Windows\system32> netsh int ipv4 show excludedportrange protocol=tcp プロトコル tcp ポート除外範囲 開始ポート 終了ポート ---------- -------- 5357 5357 50000 50059 * * - 管理されている除外ポート。 PS C:\Windows\system32>
参考にさせていただいたページ
- stackoverflow
- Quantum - Qiita 様
- 香り屋 — KaoriYa 様