Edited at

機内のようなオフライン環境でDockerコンテナ内とローカル通信する際にレスポンスが遅い件

More than 3 years have passed since last update.


背景

先日、海外出張の際に気がついたことをまとめます。飛行機の中で時間があったので、少しだけ開発を進めようかと思って、docker内のウェブアプリケーションにアクセスすると、異常にレスポンスが遅いことに気が付きました。


環境


  • MacBook (Retina, 12-inch, Early 2015)

  • OS X 10.11.6

  • Docker for Mac OS X (Version 1.12.0-a (build: 11213))


  • こちらのDockerfileを使用


再現方法


  • Docker内でWebrick等でWebサーバを起動

  • ホスト側からcurl http://localhost:9292 等でアクセスして、HTTPコマンドを叩く

  • レスポンスが返るまで40秒ほど掛かる


原因

どうやらDockerがポートフォワーディングする際に、内部的に何処かの外部サーバへアクセスしているように思われる。ホストはオフラインのため、外部サーバへのアクセスに必要な名前解決がタイムアウトするのに40秒かかっていることが原因と思われる。

実際にコンテナ内で curl で適当な外部サーバ(例:google.com)へアクセスしようとすると

curl: (6) Could not resolve host: google.com

というエラーがきっかり40秒で返ってくる。


回避方法

docker runコマンドのオプションにコンテナ内のDNSを指定するオプションがあるので、オフラインの際には 0.0.0.0 を指定することで、すぐに名前解決がタイムアウトするようになる。

docker run --dns 0.0.0.0

Have a safe flight.