操作環境
OS:Windows10
使用ターミナル:WindowsPowerShell、コマンドプロンプト
環境構築ソフト:Docker
課題
ある朝、いつものようにDockerでコンテナを立ち上げてPHPファイルを実行しようとしたところ、コンテナは立ち上がっているものの、PHP実行用のコンテナが起動していません。
デーモンさん(サーバー側で、クライアントからの要求に応じるために常駐している門番のようなプログラムのこと)からは、「50080のポートにアクセスしようとしましたが、上手くいきませんでした」と言われている様子。
$ docker-compose ps、 docker-compose logs コンテナ名 でコンテナの状況を確認しても、「STATUS: created」とあるものの、やはり起動はしていない。(起動していたら「running」となります。)
Dockerのアプリの画面から起動ボタンを押しても、「ポート番号80が使われています。」という趣旨のエラーが画面上部に表示され、イメージを起動できません。
解決手順
まず、ポート番号80をどのアプリケーションが使用しているのか調べるために、コマンドプロンプトで、$ netstat -nao と入力し、実行します。
すると、次のように、ローカルアドレスや外部アドレス、状態や使用されているプロトコル(ネット上の通信の際の決まり事のようなもの)の一覧が表示されます。(-naoのnは「IPアドレスとポート番号を数字で表示」、aは「LISTENING状態にあるTCPポートも表示」、oは「プロセス状態を表示」という意味のコマンドです。)
ポート番号は外部アドレスの一番最後の部分で表されるので、末尾が80のものを探すと、...ありました!!
ここに表示されているPID(プロセスID)から、このポート番号80を使用しているアプリケーションを調べます。
タスクバーにあるWindowsマークを右クリック→タスクマネージャー→詳細 で、アプリケーションの名前やPIDなどが載っている一覧が表示されます。この中から、先ほど調べたPID0のアプリケーションを探します。
すると、Pythonの標準機能として搭載されている、IDLEがどうやらポート番号80と通信していることが分かりました。
さて、次は、IDLEで行われている通信を切断!!...としたいところだったのですが、試しに先ほどのDockerのコンテナを起動しようとしたら起動できました。もしかしたら最初は何らかしらの通信がIDLEの方で行われていたものの、そのプロセスが数分間のうちに終了したのかもしれませんね。ちなみにSystem Idle Processの状態は今も「実行中」のままです。何はともあれ、とりあえず一件落着でめでたしめでたし。
総論
ということで、今回は途中で解決してしまったため、使用されているポートの確認まででしたが、インターネットの勉強で出てきていたデーモン、ポート、プロトコルなどが実際にどのように使われているのか確認でき、良い経験になりました。
今後もポートの重複などでトラブルが発生した時は、この手順で状態を確認することができそうです。
それではまた次回の記事までごきげんよう!!
参考
独学エンジニア(実際の内容は有料会員のみ見れます。)
https://dokugaku-engineer.com/