Sửa lỗi DNS khi Docker Build: 'Temporary failure resolving archive.ubuntu.com'

intermediate🐳 Docker2026-07-18| Docker Engine trên Linux (Ubuntu/Debian/CentOS), Docker Desktop trên Windows/macOS sử dụng WSL2.

Error Message

Temporary failure resolving 'archive.ubuntu.com'
#docker#dns#quan-tri-linux#apt-get#devops#khac-phuc-loi

Thông báo lỗiBạn đang thực hiện docker build thì quá trình đột ngột dừng lại. Điều này thường xảy ra ở bước RUN apt-get update. Thay vì tải các gói phần mềm, bảng điều khiển của bạn hiển thị một loạt văn bản màu đỏ:

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.

Tại sao DNS thất bại trong DockerCác container Docker thường kế thừa cài đặt DNS từ máy host. Tuy nhiên, các bản phân phối Linux hiện đại như Ubuntu 22.04 sử dụng systemd-resolved, lắng nghe trên địa chỉ loopback cục bộ (127.0.0.53). Docker không thể sử dụng địa chỉ cục bộ này bên trong container. Nếu máy host của bạn cũng nằm sau VPN công ty hoặc tường lửa hạn chế, cầu nối DNS nội bộ thường không thể chuyển tiếp các yêu cầu. Điều này khiến container của bạn không thể ánh xạ tên miền sang địa chỉ IP.

Ba cách để khắc phục### 1. Thiết lập DNS toàn cục trong Docker DaemonCấu hình Docker daemon là cách khắc phục lâu dài hiệu quả nhất. Nó bắt buộc mọi container bạn build hoặc chạy phải sử dụng các nhà cung cấp DNS cụ thể, đáng tin cậy như Google hoặc Cloudflare.

  • Mở tệp cấu hình Docker (bạn có thể cần phải tạo nó):sudo nano /etc/docker/daemon.json- Dán đoạn JSON sau để sử dụng DNS của Google (8.8.8.8) và Cloudflare (1.1.1.1):{ "dns": ["8.8.8.8", "1.1.1.1"] }- Khởi động lại Docker để áp dụng các thay đổi:``` sudo systemctl restart docker

### 2. Sử dụng mạng Host để BuildĐôi khi bạn chỉ cần một giải pháp nhanh chóng mà không muốn chỉnh sửa tệp hệ thống. Bạn có thể bỏ qua hoàn toàn cầu nối mạng ảo của Docker bằng cách sử dụng cờ `--network=host`. Điều này giúp quá trình build sử dụng trực tiếp ngăn xếp mạng (network stack) của máy tính bạn.

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


Lưu ý rằng mặc dù cách này nhanh nhưng nó có thể kém an toàn hơn trong môi trường production. Tốt nhất nên sử dụng cho việc phát triển cục bộ hoặc gỡ lỗi các vấn đề kết nối khó nhằn.
### 3. Sửa Symlink của systemd-resolvedKiểm tra xem `/etc/resolv.conf` của bạn có đang trỏ đến bộ giải quyết (resolver) cục bộ hay không. Chạy lệnh này:

ls -l /etc/resolv.conf


Nếu kết quả hiển thị `/run/systemd/resolve/stub-resolv.conf`, Docker có khả năng bị nhầm lẫn bởi địa chỉ 127.0.0.53. Bạn có thể khắc phục điều này bằng cách liên kết `/etc/resolv.conf` trực tiếp với cài đặt DNS mạng thực tế:

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


## Kiểm tra kết quảĐừng đợi quá trình build kéo dài 10 phút rồi mới thất bại lần nữa. Hãy xác minh DNS của bạn có hoạt động hay không bằng cách chạy một image BusyBox siêu nhỏ (5MB) để thực hiện tra cứu:

docker run --rm busybox nslookup google.com


Nếu sửa lỗi thành công, nó sẽ trả về một địa chỉ IP thực, ví dụ như `142.250.190.46`. Nếu bạn vẫn thấy lỗi "không thể phân giải", có thể tường lửa của bạn đang chặn cổng 53.
## Mẹo nâng cao cho các mạng phức tạpMôi trường công ty thường sử dụng các subnet tùy chỉnh có thể xung đột với dải mặc định của Docker (thường là 172.17.0.0/16). Nếu DNS của bạn hoạt động trên Wi-Fi ở nhà nhưng lại lỗi ở văn phòng, có thể bạn đã gặp xung đột IP. Các công cụ như [Máy tính Subnet IP](https://toolcraft.app/en/tools/developer/ip-subnet-calculator) trên ToolCraft có thể giúp bạn hình dung các ranh giới này. Điều này đảm bảo cầu nối Docker của bạn không trùng lặp với các máy chủ DNS vật lý của công ty.
Cuối cùng, hãy kiểm tra cài đặt proxy của bạn. Nếu công ty yêu cầu proxy để truy cập internet, DNS không phải là trở ngại duy nhất. Bạn cũng phải truyền các biến proxy vào môi trường build của mình:

Thêm nội dung này vào Dockerfile nếu bạn đang ở sau một proxy

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

Related Error Notes