Closed1
DockerでTimeoutエラーが出る
dockerでのタイムアウト
現象
あるサーバで
docker pull ubuntu
としたら、
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
みたいなエラーが出る。https://registry-1.docker.io/v2/
にアクセスできないのかと
curl https://registry-1.docker.io/v2/
しても、正しく
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
と返ってくる。dockerサーバを再起動しても全く効果なし。
原因
ネームサーバのタイムアウトが原因だった。/etc/resolve.conf
がデフォルトで参照しているネームサーバが、上位のサーバに投げ、上位のサーバが「プライマリサーバ」「セカンダリサーバ」と順番に問い合わせるが、「プライマリサーバ」の設定がまずくてタイムアウト、セカンダリサーバの回答がくるまで待たされる。この「待ち時間」にdockerがTimeoutしていた。
一方curl
の方はdockerよりも待ち時間が長いため、タイムアウトせずにセカンダリサーバの結果を参照して接続できていた模様。
まとめ
dockerでなんかしたとき、
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
というエラーは、要するに「dockerの接続タイムアウト」なので、「ネットワーク接続がまずいよ」という非常に一般的なことしか言っていない。
とりあえず
curl https://registry-1.docker.io/v2/
してみて、つながらなければネットワークまわり(例えばプロキシ)を疑い、つながってちゃんと
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
が返ってくるなら、タイムアウトを疑うと良い。僕の環境ではDNSのタイムアウトが原因だったが、おそらくレアケースであろう。
誰かの参考のために記録を残しておく。
このスクラップは2022/02/25にクローズされました