#背景
先日、海外出張の際に気がついたことをまとめます。飛行機の中で時間があったので、少しだけ開発を進めようかと思って、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.