💬

ローカルからNginxコンテナにcurlでアクセスできないと思ったら、既にポートが利用されていた件

2024/01/07に公開

以下のようにNginxイメージをPullし、ポートフォワーディング8080->80でコンテナを立ち上げていました。

docker image pull nginx
docker container run -d -p 8080:80 --name nginx nginx

ローカルに対して8080にアクセスすると、コンテナの80ポートにアクセスされ、NginxデフォルトのHTMLコンテンツが返却される想定でした。
しかし、以下のように想定しない内容が返却されました。

curl http://localhost:8080/
<html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body style='background-color:white; color:white;'>


Authentication required
<!--
-->

</body></html>        

返却された内容をネットで検索してみると、Jenkins に対して認証されていない場合に返される内容と類似していました。

https://cgworld.jp/regular/202209-chiyama-46.html

https://github.com/erikdoe/ccmenu/issues/12

しかし、curlからだとアクセスできませんが、ブラウザからのアクセスだと正常にNginxコンテナのデフォルトのHTMLコンテンツが返却されます。

ブラウザとcurlで挙動が異なることを不思議に思いつつ、一旦ローカルのポートを確認してみると、既に8080が利用されていることが確認できました。

lsof -i:8080
COMMAND  PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    1146 xxx  115u  IPv6 xxx      0t0  TCP localhost:http-alt (LISTEN)

ps -A | grep 1146
 1146 ??         8:17.97 /usr/local/opt/openjdk@11/bin/java -Dmail.smtp.starttls.enable=true -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpListenAddress=127.0.0.1 --httpPort=8080

そういえば過去にJenkinsを触った覚えがあり、その際に正常終了していなかったのだと思います。
brew listで確認するとJenkinsをインストールしていたので、ある程度は自分が利用していたものだと裏付けできました。
ということで、この Jenkins のプロセスをkill -9 1146で削除することでcurlでNginxコンテナに正常にアクセスできるようになりました。

なお、既に利用しているポートをポートフォワーディングのポートに指定した場合は通常以下のようにエラーが発生すると思われますが、今回はエラーが発生していなかったような...(見落としかも知れません)

docker container run -d -p 8080:80 --name nginx nginx

0e738e3129e6b8bc53e86b690ad0408e60d407684d308e568e45d257cc59e439
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:8080 -> 0.0.0.0:0: listen tcp 0.0.0.0:8080: bind: address already in use.

ブラウザとcurlでアクセス先が異なった理由も分からないので、分かる方がいらっしゃったらコメントで教えていただけると嬉しいです。

Discussion