Dockerコンテナ内のlocalhost起動に気をつける
問題
Ruby の sinatra で、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"
で無事繋がりました。