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

  • 19
    Like
  • 2
    Comment
More than 1 year has 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.