• 作成:
  • 更新:

Dockerで起動したサーバにcurlでアクセスしても「接続が相手からリセットされました」とエラーメッセージが出るだけの時の解決策

エラー

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

解決法

docker run --network=host

で解決します.

In Mac, curl: (7) Failed to connect to localhost port 8080: Connection refused · Issue #359 · bazelbuild/rules_docker

見てて気が付きました.

1日潰しました.

The host networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.

Use host networking | Docker Documentation

でLinux以外はhostをサポートしてないからLinux以外では使えません.

あとポートマッピングも出来ません.

何故かは知りません.

Dockerへの愚痴

Dockerはセキュリティ上の理由で環境分けたい場合とか, 古いコンパイラを使いたい場合は必要性はよくわかりますが, これで日常的な開発しようとする人がわからない.

メモリは食うし差分ビルドは効かなくなるしトラブルが次から次に降ってくるし, ネイティブでやらない理由がわからない.

エラーになるにしてもまともなエラーメッセージ出してくれるなら良いんですけど, そういう訳でもない.

ENTRYPOINTでサーバ起動してホストでdocker run -itで起動してるのにC-cで終了しないのは何故なんですかね. 色々調べましたが全くわからず, 結局自分がDocker使わなければ良いという結論に戻ってきました.

自分が使わない環境向けのビルドでトラブルに見舞われるのこういうモチベーションになるから本当に良くない.

3年前も別プロジェクトでDockerが流行ってると聞いた上司から「Docker化しないの?」って言われて, 「Dockerを使わない理由」をesaに延々書いて説得したことを思い出しました.

いやDockerには罪はないし, 特にCircle CIとかで日常的に使ってますし, セキュリティ上の理由でビルドに使ったり, 古いコンパイラ使ったり, 今一瞬だけ使いたいソフトウェア使う時に使ってますよ.

乱用が害としか思えません.

追記

--network=bridgeを使ってもアプリケションサーバをlocalhostでlistenさせるのではなく0.0.0.0でlistenさせることで解決します.