Docker Hub の接続問題:なぜタイムアウトが発生するのか
2026年現在でも、多くの開発者が docker pull 実行時に "context deadline exceeded" や "request canceled (Client.Timeout exceeded while awaiting headers)" といったエラーに直面しています。特に Docker Hub (registry-1.docker.io) への接続は、特定のネットワーク環境下で著しく不安定になることが多く、開発ワークフローを停止させる大きな要因となっています。
Docker Desktop や Linux 上の Docker デーモンは、デフォルトではシステムのプロキシ設定を自動的に継承しない場合があります。そのため、ブラウザで Web サイトが見えていても、ターミナル上の Docker コマンドだけが失敗するという「分裂状態」が起こります。これを解決するには、Clash Verge Rev のような強力なプロキシツールを介して、Docker 専用のトラフィック経路を正しく構成する必要があります。
準備:Clash Verge Rev の設定確認
まず、Clash Verge Rev が正しく動作しており、適切なノード(海外サーバーなど)に接続されていることを確認してください。Docker Hub のトラフィックを処理するためには、以下の設定が重要になります。
- Mixed Port: デフォルトでは
7897または7890が使用されます。このポート番号をメモしておいてください。 - TUN Mode: TUN モードを有効にすると、プロキシ設定を個別に記述しなくてもトラフィックを引き込める場合がありますが、Docker のブリッジネットワークと干渉することがあるため、まずは環境変数による設定を推奨します。
- Rule Mode: Docker 関連のドメイン(
docker.io,docker.com,production.cloudflare.docker.com)が PROXY ポリシーに割り当てられていることを確認してください。
方法 1:Docker Desktop の GUI でプロキシを設定する(Windows/macOS)
Windows や macOS で Docker Desktop を使用している場合、GUI 設定画面からプロキシを適用するのが最も簡単です。これにより、Docker デーモン自体が Clash を経由してイメージを取得するようになります。
- Docker Desktop を開き、右上の設定アイコン(歯車マーク)をクリックします。
- 左メニューから Resources > Proxies を選択します。
- Manual proxy configuration をオンにします。
Web Server (HTTP)とSecure Web Server (HTTPS)の両方にhttp://127.0.0.1:7897を入力します。Bypass proxy settings for these hosts & domainsにはlocalhost,127.0.0.1を指定します。- Apply & Restart をクリックして Docker を再起動します。
docker pull が劇的に速くなることを実感できるはずです。
方法 2:Linux システムで Docker デーモンプロキシを設定する
Ubuntu や CentOS などの Linux 環境で Docker を運用している場合、systemd の設定ファイルを編集してプロキシを適用する必要があります。これはサーバー環境で Docker Hub のタイムアウトを解決する標準的な方法です。
まず、設定ディレクトリを作成します:
sudo mkdir -p /etc/systemd/system/docker.service.d
次に、http-proxy.conf というファイルを作成し、以下の内容を記述します:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7897"
Environment="HTTPS_PROXY=http://127.0.0.1:7897"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com"
設定を反映させるために、デーモンをリロードして Docker を再起動します:
sudo systemctl daemon-reload
sudo systemctl restart docker
設定の確認
以下のコマンドを実行して、プロキシ環境変数が正しく読み込まれているか確認してください:
sudo docker info | grep Proxy
方法 3:コンテナ実行時のプロキシ設定(ビルド・実行時)
イメージの取得(pull)だけでなく、コンテナ内での apt-get update や npm install がタイムアウトする場合、コンテナ実行時にもプロキシを渡す必要があります。
コマンドラインで一時的に渡す場合:
docker run --env HTTP_PROXY="http://127.0.0.1:7897" --env HTTPS_PROXY="http://127.0.0.1:7897" my-image
永続的に設定したい場合は、ユーザーディレクトリの ~/.docker/config.json を編集します:
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:7897",
"httpsProxy": "http://127.0.0.1:7897",
"noProxy": "localhost,127.0.0.1"
}
}
}
よくあるトラブルシューティング
プロキシを設定しても解決しない場合は、以下の点を確認してください。
- IP アドレスの競合:
127.0.0.1で動作しない場合、ホストマシンの実際の LAN 内 IP アドレス(例:192.168.1.5)を試してください。 - DNS 汚染: Clash Verge Rev の設定で DNS Settings を開き、
fake-ipモードが適切に動作しているか確認してください。Docker は独自の DNS 解決を行うため、ホストの/etc/resolv.confを参照する場合があります。 - 証明書の検証エラー: プロキシを介した際に SSL 証明書エラーが出る場合は、Clash 側で HTTPS インスペクション(MITM)がオフになっていることを確認してください。
Docker Hub のミラーサイト利用について
プロキシ設定に加えて、ミラーサイト(Mirror Registry)を構成することも有効です。しかし、2026年時点では多くのパブリックミラーが閉鎖または制限されているため、Clash Verge Rev によるプロキシ経由の直接取得が最も確実で汎用性の高い方法となっています。
Docker 向け Clash ルールの最適化
効率的な取得のために、以下のドメインを rules の上位に配置することを推奨します:
- DOMAIN-SUFFIX,docker.io,PROXY
- DOMAIN-SUFFIX,docker.com,PROXY
- DOMAIN-SUFFIX,docker.docker.com,PROXY
- DOMAIN-KEYWORD,docker,PROXY
まとめ:Clash Verge Rev で快適な Docker 開発を
Docker Hub のタイムアウト問題は、一見複雑に見えますが、適切なプロキシ設定によって確実に解決可能です。従来の VPN サービスでは Docker の複雑なネットワークスタックに対応しきれない場面も多いですが、Clash Verge Rev はその柔軟なルール構成と強力なコア(Mihomo)により、開発者の強力な味方となります。
他のプロキシツールでは、Docker Desktop の再起動のたびに設定がリセットされたり、特定のレイヤーのダウンロードだけが極端に遅くなったりすることがありますが、Clash を使用すれば、安定した海外ノードを選択することで、ギガバイト単位のイメージも数分で取得できるようになります。まだ導入していない方は、この機会に開発環境をアップグレードしてみてはいかがでしょうか。