Khắc phục lỗi DNS Docker: Tại sao Container không thể tìm thấy google.com

beginner🐳 Docker2026-04-06| Linux (Ubuntu/Debian/RHEL), Docker Engine 20.10+, Docker Desktop, WSL2

Error Message

curl: (6) Could not resolve host: google.com (Temporary failure in name resolution)
#docker#dns#quan-tri-linux#mang-may-tinh

Tóm tắt: Cách khắc phục nhanh

Bạn đang gặp rắc rối và cần sửa lỗi ngay lập tức? Hãy bắt đầu bằng cách kiểm tra nhanh bằng cách khởi động lại dịch vụ Docker. Bước đơn giản này thường giúp xóa bỏ các giao diện mạng bị treo hoặc các bảng định tuyến cũ:

sudo systemctl restart docker

Nếu cách đó không hiệu quả, bạn có thể buộc một container sử dụng một máy chủ DNS cụ thể. Việc này sẽ bỏ qua hoàn toàn cấu hình của máy chủ (host) và giúp bạn xác định xem vấn đề nằm ở phạm vi toàn hệ thống hay cục bộ:

docker run --dns 8.8.8.8 alpine ping -c 4 google.com

Điều gì thực sự đang xảy ra?

Việc gặp lỗi curl: (6) Could not resolve host có nghĩa là container của bạn đang "gào thét" vào hư vô. Nó có kết nối mạng, nhưng không thể tìm thấy danh bạ (DNS) để chuyển đổi "google.com" thành một địa chỉ IP như 142.250.190.46. Sự cố này thường bắt nguồn từ ba nguyên nhân cụ thể:

  • Chặn chuyển tiếp IP (IP Forwarding): Nhân Linux của bạn đang từ chối chuyển lưu lượng truy cập từ bridge ảo của Docker sang card mạng vật lý của bạn.
  • Vấn đề DNS Loopback: Docker đang cố gắng sử dụng 127.0.0.53 (một địa chỉ Ubuntu nội bộ) bên trong một container, nơi mà địa chỉ đó không tồn tại.
  • Xung đột Subnet: Dải IP mặc định của Docker đang xung đột với Wi-Fi văn phòng hoặc VPN của bạn.

Các bước khắc phục chi tiết

1. Bật chuyển tiếp IPv4 (IPv4 Forwarding)

Hãy coi chuyển tiếp IP giống như một cây cầu nối giữa "hòn đảo riêng" của container với mạng internet bên ngoài. Nếu tính năng này bị tắt, các container có thể giao tiếp với nhau nhưng không thể truy cập mạng bên ngoài. Nhiều bản phân phối Linux được tăng cường bảo mật thường vô hiệu hóa tính năng này theo mặc định.

Trước tiên, hãy kiểm tra trạng thái hiện tại của bạn:

sysctl net.ipv4.ip_forward

Nếu kết quả trả về là 0, tính năng chuyển tiếp đã bị tắt. Để khắc phục, hãy mở tệp /etc/sysctl.conf với quyền root:

sudo nano /etc/sysctl.conf

Tìm dòng net.ipv4.ip_forward=1. Xóa dấu # ở đầu dòng để bỏ chú thích. Nếu dòng này không tồn tại, chỉ cần thêm nó vào cuối tệp. Lưu và áp dụng các thay đổi ngay lập tức:

sudo sysctl -p

Đừng quên khởi động lại Docker sau khi thực hiện thay đổi này.

2. Cấu hình DNS cố định trong Docker

Docker thường sao chép tệp /etc/resolv.conf từ máy chủ của bạn. Tuy nhiên, các bản phân phối hiện đại như Ubuntu sử dụng systemd-resolved, trỏ đến một địa chỉ IP loopback nội bộ (127.0.0.53). Các container không thể truy cập địa chỉ này. Khi Docker phát hiện ra điều này, nó sẽ mặc định sử dụng 8.8.8.8 của Google. Nếu tường lửa của công ty bạn chặn DNS bên ngoài, container của bạn sẽ không thể phân giải tên miền.

Bạn có thể thiết lập DNS chung cho tất cả các container bằng cách chỉnh sửa cấu hình daemon:

sudo nano /etc/docker/daemon.json

Chèn các dòng sau. Tôi khuyên bạn nên kết hợp giữa Cloudflare và Google để dự phòng:

{
    "dns": ["1.1.1.1", "8.8.8.8"]
}

Khởi động lại daemon để áp dụng các cài đặt mới:

sudo systemctl restart docker

3. Giải quyết xung đột Subnet mạng

Docker thường chiếm dụng subnet 172.17.0.0/16 cho bridge mặc định của nó. Nếu mạng văn phòng hoặc VPN của bạn cũng sử dụng 172.17.x.x, các gói tin sẽ bị thất lạc. Máy tính của bạn sẽ không biết nên gửi lưu lượng truy cập đến container hay đến máy chủ mail của công ty.

Kiểm tra dải IP của máy chủ bằng lệnh ip addr show. Nếu thấy có sự trùng lặp, hãy sử dụng IP Subnet Calculator trên ToolCraft để tìm một dải an toàn, không gây xung đột như 10.50.0.1/24. Sau đó, bạn có thể thiết lập dải này trong daemon.json bằng khóa "bip": "10.50.0.1/24".

4. Sửa các quy tắc UFW (Uncomplicated Firewall)

Nếu bạn đang chạy Ubuntu, UFW có thể đang âm thầm chặn lưu lượng truy cập mà Docker đang cố gắng chuyển tiếp. Theo mặc định, UFW thường đặt chính sách chuyển tiếp thành DROP, điều này làm mất kết nối internet của container ngay lập tức.

Mở tệp cấu hình UFW:

sudo nano /etc/default/ufw

Thay đổi DEFAULT_FORWARD_POLICY="DROP" thành ACCEPT. Tải lại tường lửa để áp dụng quy tắc:

sudo ufw reload

Xác minh: Lỗi đã được sửa chưa?

Chạy hai bài kiểm tra sau để xác định chính xác nơi xảy ra lỗi. Việc này giúp phân biệt các vấn đề về DNS với các vấn đề về định tuyến chung.

Kiểm tra 1: Phân giải DNS

docker run --rm alpine nslookup google.com

Nếu bạn thấy một địa chỉ IP trong kết quả trả về, DNS của bạn đang hoạt động hoàn hảo.

Kiểm tra 2: Kết nối thô (Raw Connectivity)

docker run --rm alpine ping -c 4 1.1.1.1

Nếu bạn có thể ping 1.1.1.1 nhưng lệnh nslookup ở trên thất bại, vấn đề của bạn chắc chắn 100% liên quan đến DNS. Nếu cả hai đều thất bại, hãy quay lại và kiểm tra kỹ cài đặt chuyển tiếp IP và tường lửa của bạn ở Bước 1 và Bước 4.

Tài liệu tham khảo thêm

Related Error Notes