memo-pad’s blog

自分のためのメモをまとめています。ここに書いてある内容については責任は負いません。全て自己責任でお願いします。

Docker内のNode.jsで作成したhttpサーバにアクセスできない

最近Docker上でNode.jsを動かして遊んでます。

遊んでる際に、Docker内のnodeで作ったhttpサーバにアクセスできないという問題があったのでメモ。

今回利用したファイル

  • test.js(ただ単にHelloWorldを返すだけのもの)
var http = require('http');
var server = http.createServer();

server.on('request', function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello World!!');
  res.end();
})

server.listen(1234, '127.0.0.1');
  • Dockerfile.node(nodeの実行環境作って、test.jsを動かしているだけ)
FROM centos:centos7
MAINTAINER memo

# package install
RUN yum update -y && \
 yum install -y vim && \
 yum clean all

# node install
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash && \
 export NVM_DIR="$HOME/.nvm" && \
 [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && \
 nvm install v8.0.0


ENV PATH=/root/.nvm/versions/node/v8.0.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ADD test.js /root/test.js
EXPOSE 1234
CMD ["node", "/root/test.js"]

実際に行った手順

  • docker buildでDocker Imageを作成
$ sudo docker build --tag="centos7/node:v1.0" --file="/home/dockerroot/Dockerfile.node" .
  • 作成したImageからコンテナ起動
$ sudo docker run -d centos7/node:v1.1
  • 作成したアプリにアクセス
$ curl localhost:1234
curl: (7) Failed to connect to localhost port 1234: Connection refused

……つながらない

ここから試行錯誤

  • 試しにコンテナ内でcurlしてみる
$ sudo docker run -it centos7/node:v1.1 bash
# cd
# node test.js &
# curl localhost:1234
Hello World!!

いけた!!

  • ポートが設定されてないのかなとdocker ps をみてもportsに1234は設定されている……
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
d38253600f9b        centos7/node:v1.1   "node /root/test.js"   2 minutes ago       Up 2 minutes        1234/tcp            happy_khorana

もしかしたら、DockerfileのEXPOSE 1234の設定だけではポートマッピングが不十分なのか??

  • ポートマッピングをちゃんと指定してコンテナを走らせてみる
$ sudo docker run -p 1234:1234 -d centos7/node:v1.1
  • 作成したアプリにアクセス
$ curl localhost:1234
curl: (52) Empty reply from server

今度はポート自体はちゃんと設定されているっぽい。

ただ、ちゃんとhttpサーバからのresponseが返ってきてない??

  • よくわからないけど、試しにtest.jsのserver.listenのIPを0.0.0.0に変更してみる
server.listen(1234, '127.0.0.1');
↓

server.listen(1234, '0.0.0.0');
  • 再度アプリにアクセス
$ curl localhost:1234
Hello World!!

お!いけた!

やったことまとめ

  • server.listenのIPアドレスを0.0.0.0にした
  • docker runでコンテナ作成するときに-pオプションでポートを指定した

ただ、やり方的にこれが正しいかどうか、Node.jsもDockerも勉強中なのでわからない……

今後、触っていってわかったことがあったら追記していきます。