症状
以前から、Dockerを使用していました。
久しぶりに使ったら、
"Error response from daemon: Ports are not available: listen tcp 0.0.0.0:3306: bind: An attempt was made to access a socket in a way forbidden by its access permissions."
エラーで使用できません。
環境は、windows(WSL2) + Docker Desktop
エラーが出る原因は複数あるようなので、それに合う解決策を行う必要があります。
参考のため、私が調査したことも解決策を記載しておきます。
原因調査
エラーによると、portが他で使用されているようです。
該当ポートを使っているアプリを確認
ターミナル(PowerShell)でポートの使用状況を調べる。
netstatコマンドでポートを使うプロセスを一覧表示し、それを今回はSelect-Stringで3306ポートで絞って表示する。
netstat -ano | Select-String ":3306"
今回は違ったが、プロセスがある場合は下の画像のように表示されるのでコマンドやタスクマネージャーで終了させれば良い。
taskkill /F /PID 20344
windowsを再起動してみる
たまに、アプリがポートを解放せずに終了することがあるようなので、windowsを再起動。
私の場合は改善しなかった。
ファイアウォールを確認
Dockerで使用するport番号を変えてためしても同様のエラーが出た。
もしかして、docker全体がネットワークを使えないのではと考えた。
サードパーティーのファイアウォールを使っている場合は、ブロックする場合がある。
windows純正のファイアウォールで、"すべての通信をブロック" or "意図的にブロック"を行わない場合は、wslは通信許可されているようです。
解決方法
今回は、現在のバージョンのDockerのバグ(?)を踏んだようです。
該当issue
https://github.com/docker/for-win/issues/3171#issuecomment-739740248
windowsのNATドライバーを再起動することで解決しました。
管理者権限でpowershellを開き
Restart-Service -Name winnat
( @fattonton1さんコメントの方が便利なので変更しました。ありがとうございます。)
これで、もう一度Dockerを立ち上げると解消されました。
症状が頻発する方は
@oedktyさんコメントで、"該当ポートを除外する"ことで問題を発生させない記事を教えて頂きました。
原因の究明記事↓
簡単にポートを除外する方法の記事↓
記事では、"ポートを除外することはセキュリティ上、よろしくない"とありますが、
開発中に症状が頻発する方は、参考になると思います。
以上です。