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にクローズされました