先日までの記事で書いた通り、最近自分のPCにWSL2を導入し、そのうえでDockerを動かす形の環境に変更しました。
基本、快適に動作しており、VirtualBox上へVMとして起動するDocker Toolsと比較すると容量も比較的節約できてかなり気にっているのですが、先日、ちょっと対処に苦労したトラブルが発生していました。
とりあえず、DockerがPC起動と同時に起動するように設定してあったのですが、その時はどういうわけかDockerのバックエンドがいつまでたっても起動が完了しないという状況になっていました。
Dockerのメニューからリスタートも行ったのですが応答しないため、やむを得ず強制終了して再起動を行いました。
Docker自体はなんとか正常に起動したのですが、その後、何度やってもMySQLが入ったコンテナが起動しません。
その際のエラーは下記の通り。
Starting project_mysql_1 ... error
ERROR: for project_mysql_1 Cannot start service mysql: 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.
ERROR: for mysql Cannot start service mysql: 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.
Encountered errors while bringing up the project.
Failed to deploy 'Compose: docker-compose.yml': `docker-compose` process finished with exit code 1
このエラーは通常、すでに別のサービスやプロセスが指定されたポートを占有している場合に出てくるエラーなので、このポートを使用しているプログラムを特定して、止めてしまえば解決するはずです。
ところが、今回の場合は、そもそもこのポートを使用しているプログラムがOS中どこを探しても見つからない…
netstat -a
コマンドを使用しても、専有されているはずのポートを使用しているプロセスがそもそも一覧に上がってこないという怪現象がはっせいしていました。
こんなまるで幽霊のような現象に悩まされて調べまくったところ、Windowsのドキュメントでこんな情報を発見。
ポートの枯渇問題のトラブルシューティング – Microsoft
最後に、上記の方法でプロセスを分離できなかった場合は、コンピューターの完全なメモリダンプを問題の状態で収集することをお勧めします。 このダンプによって、どのプロセスの最大ハンドルが表示されているかがわかります。
回避策として、コンピューターを再起動すると、通常の状態に戻り、問題を解決するのに役立ちます。
OSの再起動で…治るだと…
ハハハここまで悩まされた問題でまさかそんなことあるわけ…
普通に動いたあああああああ
どうやら、何らかの原因でプロセスの終了時などに問題が発生した際に、ポートをつかんだまま死んでしまうことがあり、一覧には出てこないがポートは専有されっぱなし、という状況が起きうるのだそうで。
こういう時はOS再起動すれば治るということのようです。
原因が非常にわかりづらい問題なだけに勘弁してほしいトラブルですが、もし同様の状況になった場合はOS再起動を試してみてください。