プログラミングと絵と音楽

コンピューター科学を専攻し、絵と音楽を趣味とするエンジニアのブログです。

Dockerコンテナ内のlocalhost起動に気をつける

問題

Rubysinatra で、APIサーバー (server.rb) を作っていました。

ReactJS と共存させるために Docker へ移行していたのですが、少し詰まってしまいました。

docker-compose.yml で

api:
  command: ruby server.rb
  ports:
    - "12345:4567"

と mapping を設定することで、外部から ttp://(ホスト名):12345" で読み込めるはずだったのですが、接続できません。

ホストで curl localhost:12345 を実行しても、

curl: (56) Recv failure: 接続が相手からリセットされました

を乱発することに。

ただし、 docker コンテナの中に入って

curl localhost:4567

とすると問題なく反応しています。

解決

ローカルで実行していたときは、実行時のコマンドで

ruby server.rb -o 0.0.0.0 -p 12345

としていたのですが、ポートは docker-compose.yml でマッピングできるからと、引数 (-p 12345) を消していました。
このとき、ホスト (-o 0.0.0.0) の部分まで消してしまっており、そこが問題の発生に繋がりました。

通常ならすぐに原因は見つかるはずだったと思うのですが、今回は Docker 移行の際にこの問題に直面し、 Docker に関する問題と疑ってかかってしまったため、調査が長引く結果となりました。

Docker コンテナ内でも、 localhost で起動するのではなく、 ホストを 0.0.0.0 とすることが必要です。

api:
  command: ruby server.rb -o 0.0.0.0
  ports:
    - "12345:4567"

で無事繋がりました。