1. ホーム
  2. networking

[解決済み] コンテナ型 Node サーバに server.listen(port, '127.0.0.1') でアクセスできない。

2023-08-02 14:16:20

質問

Dockerで簡単なNodeサーバを立ち上げてみました。

Dockerファイル

FROM node:latest
RUN apt-get -y update
ADD example.js .
EXPOSE 1337   
CMD node example.js

example.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n'+new Date);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

次に、イメージを構築します。

$ docker build -t node_server .

今度はコンテナで実行

$ docker run -p 1337:1337 -d node_server  
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70

コンテナが動作していること、ポートがマッピングされていることを確認します。

$ docker ps  

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5909e87302ab        node_server         "/bin/sh -c 'node exa"   7 seconds ago       Up 6 seconds        0.0.0.0:1337->1337/tcp   grave_goldberg

では、コンテナにアタッチして、中でサーバーが動作していることを確認してみましょう。

$ docker exec -it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 /bin/bash 

そして、コンテナのコマンドラインには、次のように入力します。

root@5909e87302ab:/# curl http://localhost:1337
Hello World
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC)

良さそうでしょ?

問題点

ホスト上で同じcurlコマンドを実行すると(あるいはブラウザでhttp://localhost:1337)、何も表示されません。

コンテナとホスト間のポートマッピングが機能しない理由について何か思い当たることはありますか?

すでに試したこと

  • を使って実行する --expose 1337 フラグ

どのように解決するのですか?

ポートは正しく公開されていますが、サーバーが接続をリッスンしているのは 127.0.0.1 にあるコネクションをリッスンしています。

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n'+new Date);
}).listen(1337, '127.0.0.1');

このようにサーバーを動かす必要があります。

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n'+new Date);
}).listen(1337, '0.0.0.0');

127.0.0.1ではなく、0.0.0に注意してください。