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)
    • Hyper-V 有効
    • Windows ハイパーバイザー プラットフォーム 有効
    • LinuxWindows サブシステム (WSL2) 有効
      wsl --versionの出力を一部抜粋
      • WSL バージョン: 1.2.5.0
      • カーネル バージョン: 5.15.90.1
    • 仮想マシン プラットフォーム 有効
  • 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することができましたので、その手順を紹介します。

C:\Windows\system32>net stop winnat

Windows NAT Driver サービスは正常に停止されました。


C:\Windows\system32>net start winnat

Windows NAT Driver サービスは正常に開始されました。


C:\Windows\system32>
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>

参考にさせていただいたページ

*1:PowerShellnetstat -ano | Select-String ":1080"を実行して調査しましたが、該当するプログラムはありませんでした。

*2:Windowsのポート除外範囲については、香り屋様のページに詳しく書かれていました。