Dockerで、ホストからcurlでアクセスするとEmpty reply from serverがでてしまう
最終更新日:2024-08-25
コンテナ起動時、-pをつけるとホストとコンテナ内のポートを繋ぐことができます。しかしコンテナ内でサーバーが指定したポートで起動しているにもかかわらず、ホスト側からcurlでリクエストを投げると「curl: (52) Empty reply from server」となることがあります。
何が原因?
コンテナ内で起動しているサーバーがlocalhost指定でListenしている可能性があります。
サーバーは起動時、ポート番号を指定しますが、同時にIPアドレスも指定することができます。例えばNode.jsだと次のような指定ができます。
var http = require("http");
var express = require('express');
var app = express()
app.get('/', function(req, res) {
res.send("Hello World!");
});
var server = http.createServer(app)
console.log('start server at 8080')
// 127.0.0.1指定でListen
server.listen(8080, '127.0.0.1')
IPアドレス指定でListenした場合、そのIPアドレス以外からのリクエストは受け付けられません。もちろんホスト側からのcurlリクエストは127.0.0.1ではないため、「curl: (52) Empty reply from server」となってしまいます。
解決方法は?
コンテナ内でnginxなどのリバースプロキシを置き、コンテナ外からのリクエストをプロキシしてみましょう。