Docker BuildのDNSエラーを解決する:「Temporary failure resolving archive.ubuntu.com」

intermediate🐳 Docker2026-07-18| Linux (Ubuntu/Debian/CentOS) 上の Docker Engine、WSL2 を使用した Windows/macOS 上の Docker Desktop。

Error Message

Temporary failure resolving 'archive.ubuntu.com'
#docker#dns#linux-administration#apt-get#devops#troubleshooting

エラーメッセージdocker build の途中で、プロセスが突然停止してしまうことがあります。これは通常、RUN apt-get update のステップで発生します。パッケージをダウンロードする代わりに、コンソールには次のような赤いテキストが表示されます。

Err:1 http://archive.ubuntu.com/ubuntu jammy InRelease
  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/jammy/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.

なぜ Docker で DNS が失敗するのかDocker コンテナは通常、ホストマシンの DNS 設定を継承します。しかし、Ubuntu 22.04 などの最新の Linux ディストリビューションでは、ローカルループバックアドレス (127.0.0.53) でリッスンする systemd-resolved が使用されています。Docker はコンテナ内でこのローカルアドレスを使用できません。また、ホストが企業の VPN や制限の厳しいファイアウォールの背後にある場合、内部 DNS ブリッジがリクエストの転送に失敗することがよくあります。その結果、コンテナはドメイン名を IP アドレスにマッピングできなくなります。

解決するための 3 つの方法### 1. Docker デーモンでグローバル DNS を設定するDocker デーモンの設定は、最も効果的な恒久対策です。これにより、ビルドまたは実行されるすべてのコンテナで、Google や Cloudflare などの信頼できる特定の DNS プロバイダーが強制的に使用されます。

  • Docker 設定ファイルを開きます(ファイルが存在しない場合は作成してください)。sudo nano /etc/docker/daemon.json- Google DNS (8.8.8.8) と Cloudflare (1.1.1.1) を使用するために、次の JSON を貼り付けます。{ "dns": ["8.8.8.8", "1.1.1.1"] }- 変更を適用するために Docker を再起動します。``` sudo systemctl restart docker

### 2. ビルドにホストネットワークを使用するシステムファイルを編集せずに、手っ取り早く解決したい場合もあります。`--network=host` フラグを使用すると、Docker の仮想ネットワークブリッジを完全にバイパスできます。これにより、ビルドプロセスでコンピュータのネットワークスタックが直接使用されます。

docker build --network=host -t my-image .


この方法は迅速ですが、本番環境ではセキュリティが低下する可能性があることに注意してください。ローカル開発や、解決しにくい接続問題のデバッグに最適です。
### 3. systemd-resolved のシンボリックリンクを修正する`/etc/resolv.conf` がローカルのスタブリゾルバーを指しているか確認します。次のコマンドを実行してください。

ls -l /etc/resolv.conf


出力結果に `/run/systemd/resolve/stub-resolv.conf` と表示される場合、Docker が 127.0.0.53 というアドレスによって混乱している可能性があります。`/etc/resolv.conf` を実際のネットワーク DNS 設定にリンクさせることで、これを修正できます。

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf


## 修正のテスト10 分かかるビルドが再び失敗するのを待つ必要はありません。5MB ほどの軽量な BusyBox イメージを実行して名前解決を行い、DNS が機能しているか確認します。

docker run --rm busybox nslookup google.com


修正が成功すれば、`142.250.190.46` のような実際の IP アドレスが返されます。依然として「can't resolve」エラーが表示される場合は、ファイアウォールがポート 53 をブロックしている可能性があります。
## 複雑なネットワーク向けのプロのヒント企業の環境では、Docker のデフォルト範囲(通常は 172.17.0.0/16)と衝突するカスタムサブネットが使用されていることがよくあります。自宅の Wi-Fi では DNS が機能するのにオフィスで失敗する場合は、IP の競合が発生している可能性があります。ToolCraft の [IP Subnet Calculator](https://toolcraft.app/en/tools/developer/ip-subnet-calculator) のようなツールを使用すると、これらの境界を可視化できます。これにより、Docker ブリッジが会社の物理 DNS サーバーと重複しないように設定できます。
最後に、プロキシ設定を確認してください。インターネットへのアクセスにプロキシが必要な場合、DNS だけが問題ではありません。ビルド環境にプロキシ変数を渡す必要があります。

プロキシ環境下にいる場合は、これを Dockerfile に追加してください

ENV http_proxy http://10.0.0.5:8080 ENV https_proxy http://10.0.0.5:8080

Related Error Notes