dockerコンテナ上で何故かcurlが上手くつながらない問題にハマったのでメモするシリーズ。
環境
- Ubuntu 14.04.5 LTS ( on OpenStack)
- Docker version 1.11.2, build b9f10c9
症状
ホストで curl https://github.com
は正常にレスポンスを受け取れるのにもかかわらず、コンテナ上で同じことを行うとレスポンスが帰ってこない(ハングする)。また極稀にレスポンスが中途半端に返ってくることがある。
原因
コンテナのMTUの値がホストのeth0と合っていなかった。( ip addr
などで確認)
(暫定的な)対処法
DOCKER_OPTSに --mtu 1400
など(数字はeth0のMTUと合わせる)を加えてdockerを再起動する。
背景とか
調べてみると何個かこういう報告がありました。
- docker 1.10, 1.11 do not infer MTU from eth0; docker 1.9 does · Issue #22028 · docker/docker · GitHub
- containers in docker 1.11 does not get same MTU as host · Issue #22297 · docker/docker · GitHub
don't try to use default route MTU as container MTU by phemmer · Pull Request #18108 · docker/docker · GitHub というPRがあり、docker v1.10からはdefault route(今回はeth0)からMTUを取得するのを止めたようです。
とはいえ--mtuでMTUを固定するのはハックで、本来はPMTU discoveryを正しく設定すべきらしいです。ちゃんと設定している人がどのくらいいるのかは不明です。 https://github.com/docker/docker/issues/22297#issuecomment-214570420