目次
想定環境と、そもそも何がボトルネックになりうるか
本文は Laptop またはデスクトップ上の Docker CLI(Linux Engine、または WSL/macOS 上の Docker Desktop) を前提に書いています。コンテナランタイムの実装やバージョンで挙動差はありますが、問題のレイヤーを分類する視点は共通です。docker pull library/nginx のような単純ケースでも、背後では(1)イメージ名からレジストリのホスト名を決める、(2)DNS でその名前を IP に直す、(3)HTTPS でマニフェストとレイヤを取りにいく、という複数ステップがまとめて走ります。
そのため「ずっと待っている」状態は、(A) DNS 応答が遅い・失敗している、(B) レジストリまたは CDN に届く経路そのものがブロックまたは極端に遅い、(C) 認証・レート制限・プロキシのバイトストリームが中途半端、のいずれかに寄りがちです。VPN を使っている場合は、このうち名前解決の出口とレイヤ転送までの経路の両方に影響が出るので、最初から「VPN のせいで遅い」と決めつけず、(A)→(B) の順で足場を確認するほうが手戻りが少なくなります。
Docker と VPN の組み合わせはタイムアウトの総称記事とは現象も切り口も違うため、この稿ではコンテナ開発者が毎日起こるクラウド側レジストリの疎通に絞ります。転送レイヤでの暗号スタックだけを調べたいときは VPNプロトコル比較:WireGuard・OpenVPN・独自方式のシーン別ガイド と併読すると、アプリ側で UDP/TCP を選びなおす場面まで含めて整理しやすくなります。
「止まっている」ように見る典型パターン
画面上は似ていても、原因はレイヤごとに違います。目安だけ列挙します。
- レイヤ一覧の頭の数%で固まったまま時間がだけが経つ:CDN 側やレジストリへのバイトストリームが詰まっている、MTU とパス MTU Discovery の組み合わせでフラグメントが上手く処理されていない、回線単位の DPI/シェイピングがありそうです。
- すぐエラーになり「lookup … no such host」や NXDOMAIN:まずホスト側か Docker が参照しているネームサーバーを疑う段階です。VPN が社内 Split DNS を押し込むと、オン時だけ名前が返らないというパターンも珍しくありません。
- TLS handshake のあと証明書まわりのエラーが出て止まる:意図せぬHTTPS プロキシや企業ランサムウェアゲートウェイが入っていませんか。環境変数
HTTP_PROXY/HTTPS_PROXYが設定されていると CLI 側がそちら経由になります。 - 匿名 pull のときだけ遅く、ログインすると改善する/逆にログインしないと低速:Docker Hub アカウント側のレイヤ並びや匿名レートとの兼ね合いが絡んでいます。後述の認証チェックへ進んでください。
ログの粒度は docker pull --progress plain や設定ファイルのログレベルで上げられますが、まずホスト側の dig/nslookup と curl -Iv https://registry-1.docker.io/v2/ 程度で「DNS と TLS」の外枠が取れる環境も多いです。
手順①:Docker Hub/CDN 側の名前解決を疑う
最初にやるべきことはコンテナとは別にホスト OS で名前が解けるかを見ることです。VPN が有効でも無効でも、両方試して差分があるか確認します。
-
1
代表的な名前を順に試す
registry-1.docker.ioや CDN 側の名前(環境により追加で引かれる fqdn が出ます)について、タイムアウトせず応答時間が許容できるか確認します。dscacheutilやresolvectlなど OS ごとのresolverコマンドで、現在どの DNS に聞きにいっているかも併記してログに残しておくと再現調査が楽です。 -
2
VPN オン時のみ社内 NXDOMAIN になる問題
フルトンネルで社内優先 DNS が強制される構成では、「外部向けクエリ」を社内転送側が黙って捨てることがあります。ここまで来たら単純な
/etc/resolv.confの書き換えより、VPN クライアントが DNS をどう上書きしているか、アプリ側のルール機能で Docker だけを除外できないか、を見ます。 -
3
Docker Desktop と Linux で違う挙動
仮想化レイヤがある環境では、ゲスト側とホスト側で参照 DNS が二分されます。コンテナ実行時のみ失敗するときは、このミスマッチを疑って Docker の DNS 転送設定(公式ドキュメントの networking 項目)や
daemon.jsonの検証フラグへ進みます。
名前解決が安定した時点でも pull が進まないなら経路側です。VPN を一旦オフにして同じクエリだけを再実行すると、「DNS が悪かったのか、VPN オン時だけレジストリ経路が悪かったのか」が切り離せます。
手順②:HTTPS 経路・MTU・中間機器による詰まり
DNS が問題ないのに転送だけ遅いケースでは、ブラウザで docker.com が開けるかどうかよりもCLI でレジストリの v2 API に届くかを見ます。ポート番号や SNI が一般的なウェブサイトと同じとは限らないため、コンテナ開発向けにはレジストリエンドポイントを明示的に叩くほうが信頼できます。
TLS のハンドシェイクがすぐ終わってもレイヤ転送だけが細いときは、(1) ICMP がフィルタされておりパス MTU が合っていない、(2) 海外 POP への回線ピーク、(3) ローカルのウイルス対策によるスキャンボトルネック、があります。VPN を張ることで迂回 POP が変わり速度がむしろ改善することもあり得るので、この段階は「経路変更の A/B が有効」を覚えておくと判断が早くなります。
覚えておくとよい視点:エラーログや tcpdump が読めれば理想ですが、まずホスト側の別ターミナルで同一ホストへの短い HTTPS チェックだけでも「DNS と TCP の両方」を切り離せます。VPN のエグレスが地理的に遠くなるぶんだけ RTT が伸びるのは正常であり、異常検知には「桁が違う遅さ」と「恒久タイムアウト」を別扱いにしてください。
手順③:VPN オン/オフで結果が反転しないか確認する
ここまでで「名前は解けるが pull が終わらない」「VPN でだけ DNS が失敗する」など、仮説が立ったはずです。次は単純な二択検証です。
- 同じイメージ、同じホストディスクキャッシュ状態(なるべく未キャッシュ)、同じ時刻帯で、VPN オンとオフの各一回を記録します。
- ログを残せる環境では、DNS クエリ開始から最初のレイヤが流れだすまでの秒数だけメモすると、体感と数字の両方が揃って原因共有が楽になります。
- オン時だけタイムアウトなら、その VPN の出口でのブロック一覧に docker.io 関連 IP が載っていないか、運用側のリストを疑います。
開発者だけでなく、配下の複数コンテナホストがあるチーム運用でもこの手順をテンプレ化しておけば、「ローカルの Docker Desktop 問題なのか、オフィスの出口なのか」が早く分かれます。VPN と HTTP レイヤーを重ねないうちに済む不安定さがあるチームでは、Ubuntu ワークステーション向けクライアントの入れ方を Ubuntu VPN 導入:公式 Linux クライアントのダウンロードと初回設定(2026) と照らして、クライアント更新と並行してレイテンシ指標だけトラックするのも有効です。
スプリットトンネルで「Docker だけ直送」を試すときの視点
開発で「ソースコードレビューやブラウザは VPN 経由にしたいが、巨大イメージの pull はキャリアの素回線へ直させたい」というニーズは珍しくありません。フルルーティングの VPN だけだと、レジストリまでのすべての経路が遠回りになり速度が頭打ちになる場合があります。このとき役に立つのが既定はトンネル、特定ドメインやプロセスだけ直送というスプリットトンネル設計です。
Windows 環境での具体的な構成例として Windows VPN スプリットトンネル設定:アプリ経路を分ける手順(2026) を読むと、ドメインベースの経路選択を GUI どおりに設定する一例が追えるため、Docker Desktop が動くホストで「レジストリFQDNのみ直送」といった粒度の試験にも応用できます。もちろんセキュリティポリシーでフルタイム強制されている場合は申請なく切り替えないでください。あくまで社内許容範囲での効率検証であり、許可されていないときはインフラ担当と握ったうえでのみ実施することが前提です。
macOS/Linux 側も考え方は同じです。システムのルーティングテーブルより前に、アプリ側のプロキシや VPN パケットキャプチャのルール設定が競合しないかをチェックリスト化しておくと、再発時のオンコールが楽になります。
ログイン状態・認証レート/ミラー構成の確認
匿名 pull とログイン済み pull で体感が変わる場合、Docker Hub 側のアカウント状態やプランに紐づく制約を確認します。docker login の認証情報が古いときにトークンの更新で止まっている、単純にパスワードローテしたあと環境へ反映していない、といった単純ミスも多いので、ログアウト→再ログインは早い順の切り分けです。
CI 環境由来の並列ビルドでは、アカウント共通のレイヤ並び順とレート制限に達して intermittent に失敗する例があります。自分のワークステーションで lone pull が通るが CI でだけタイムアウトする場合は、このカテゴリを疑ってください。また、公的ミラーや社内キャッシュレジストリを噛ませているチームでは、ミラー側が古くレプリカの検証チェックだけが遠い経路にある、という二段構えの遅さも現場では珍しくありません。
落とし穴:プロキシ、IPv6、Docker Desktop の DNS 転送
- 環境変数ベースのプロキシ設定:シェルの
http_proxyがコンテナだけでなく daemon にも伝播している構成では意図せずプロキシを踏み、プロキストンネルの中で証明書を差し替えられているという筋もありえます。env | grep -i proxyは最初のひとつ目に確認します。 - IPv6 優先の一本化問題:ISP やキャンパスの IPv6 と VPN の IPv4 出口が両方生きていると、コンテナのみデュアルスタック側に偏って不安定になる場合があります。このときは単純な ping6 だけでは足りず、resolver の優先度と経路確認をセットで見ます。
- システムのスリープ復帰直後だけ失敗する:Wi‑Fi と有線が切り替わるタイミング、VPN の再接続手順順序と Docker の再起動順を整理しておくだけでも再現頻度が下がります。
まとめ:経路選びと検証がしやすい VPN をどう評価するか
この稿で繰り返したのは、docker pull が止まるときにDNS と TLS とバイト転送経路とポリシーを混ぜないことです。「VPN が遅い」という一言にまとめる前に、オン/オフとスプリットの二段で切り、(A)名前解決 (B)到達性 (C)認証・レート、の順にチェックリスト化すると復旧が最短になります。
汎用 VPN のなかにはノード一覧すら細かく出さず、アプリ開発者には DNS 転送ログも吐かないタイプがあります。開発用途では「リストから出口を読める」「運用側で許された範囲で経路だけ分けられる」「WireGuard と OpenVPN など転送レイヤーを切り替えて試せる」の三点が検証効率を大きく左右します。転送レイヤー別の細部は前述のプロトコル記事にも譲りますが、暗号だけでなく開発ループを止めずに済むレイテンシまで含めて比較するのが現実的です。
DVDVPN は複数プラットフォームから同じアカウントで接続でき、リストで地点ごとの指標を読みやすく作られています。新規登録にはカード拘束がなく試用枠から始められるため、ホスト OS の名前解決と VPN の DNS が噛み合うかだけでも、開発マシンの片隅で並行評価しやすい構造になっています。まず ダウンロードページ から自分の環境に合わせクライアントを入れ、(A)(B)(C) のチェックリストを張りながら pull が改善する経路があるか確認してみてください。アカウントだけ先に準備したい場合は アカウント作成 から進めます。