Computer >> Máy Tính >  >> Phần mềm >> Máy ảo

Sự cố mạng giải quyết tên docker - Hướng dẫn

Hy vọng rằng bạn sẽ không bao giờ thực sự cần phải đọc bài viết này và bạn chỉ tình cờ ở đây vì bạn cảm thấy buồn chán hoặc tìm kiếm sai cách. Hoặc bạn thực sự có thể đang gặp phải sự cố trong đó bộ chứa Docker của bạn không truy cập được Internet nữa, mặc dù chúng đã từng hoạt động tốt, chỉ mới gần đây thôi và bạn không thực hiện thay đổi nào đối với môi trường của mình.

Điều này nghe có vẻ giống như một tuyên bố vấn đề rất mơ hồ, nhưng đây là điều mà tôi bất ngờ phải đối mặt. Vùng chứa của tôi không có quyền truy cập mạng, với lỗi như URL giải quyết lỗi tạm thời. Nó giống như một vấn đề với việc phân giải tên, và nó làm tôi khó chịu hơn, bởi vì nó không nên xảy ra. Nhưng chúng ta đang đi trước chính mình. Máy chủ thử nghiệm:Ubuntu với systemd - quan trọng sau này. Hãy tiến hành từ từ.

Vấn đề chi tiết hơn

Bạn đã cấu hình Docker trên hệ thống của mình. Nó hoạt động tốt. Bạn có nhiều hình ảnh, nhiều vùng chứa và thậm chí bạn đã sử dụng các quy tắc mạng nâng cao và mọi thứ dường như đều theo thứ tự hoàn hảo. Sau đó, bạn nhận thấy rằng bạn không còn có thể thực hiện một số hoạt động nhất định trong vùng chứa của mình, chẳng hạn như cập nhật hoặc cài đặt gói. Cách tốt nhất để gỡ lỗi này là đính kèm trình bao vào phiên bản bộ chứa đang chạy, như tôi đã giải thích trong hướng dẫn giới thiệu. Thật vậy, bên trong một thùng chứa đang chạy, bạn sẽ thấy nội dung như:

# apt-get update
Err:1 https://archive.ubuntu.com/ubuntu bionic InRelease
Lỗi tạm thời khi giải quyết 'archive.ubuntu.com'
0% [Kết nối với bảo mật. ubuntu.com]

Đây có vẻ là sự cố DNS (độ phân giải tên). Vùng chứa không thể tìm ra cách phân giải tên miền thành địa chỉ IP và do đó, vùng chứa không thể kết nối với máy chủ để lấy dữ liệu, chẳng hạn như các bản cập nhật. Có hai vấn đề ở đây. Một, tại sao vấn đề lại đột ngột xuất hiện? Hai, chúng ta cần thực sự sửa mạng. Bây giờ, tôi muốn chỉ cho bạn cách khắc phục sự cố này một cách tinh tế.

Giải pháp

Trước tiên, hãy hiểu tại sao sự cố xảy ra. Không có câu trả lời ngay lập tức ở đây, nhưng một số điều cần xem xét có thể bao gồm nhiều thứ hơn là môi trường trực tiếp của bạn. Ví dụ:máy chủ của bạn có thể không thay đổi, nhưng mạng có thể có - chính bộ định tuyến, chính sách mạng, máy chủ DNS. Vì thông thường bạn không thể kiểm soát những gì đang xảy ra bên ngoài quá trình thiết lập ngay lập tức của mình, nên cách tốt nhất để tìm ra nguyên nhân của vấn đề là thực hiện tách biệt vấn đề theo từng bước.

  • Nếu hệ thống máy chủ của bạn có mạng và không thể giải quyết các URL, thì trước tiên bạn cần phải giải quyết vấn đề đó. Rất có thể đã xảy ra sự cố giữa máy chủ của bạn và đích đến cũng như bất kỳ cơ sở hạ tầng mạng nào tồn tại ở giữa.
  • Nếu hệ thống máy chủ của bạn có mạng và có thể phân giải URL chính xác, thì vấn đề cụ thể là cách bộ chứa Docker phân giải URL. Đây là nơi chúng ta cần tập trung tiếp theo.
  • Kiểm tra xem giao diện mạng Docker có hoạt động hay không (bằng một lệnh như ip hoặc ifconfig). Nếu không, tiếp theo bạn sẽ khắc phục sự cố đó trước khi chuyển sang bước tiếp theo.

ifconfig docker0

  • Kiểm tra xem phiên bản vùng chứa có địa chỉ IP hay không. Nếu không, bạn sẽ cần phải sửa lỗi đó.

docker kiểm tra | grep -i "ipaddr"

  • Kiểm tra xem bạn có nhận được kết quả tương tự bên trong vùng chứa hay không nếu có thể (ip hoặc ifconfig). Nếu kết quả không khớp với những gì bạn đã thấy trong lệnh trước đó, bạn sẽ cần sửa lỗi đó.
  • Kiểm tra xem bạn có thể ping vùng chứa từ bên ngoài không (và ngược lại, nếu có lệnh ping). Nếu ping hoạt động, đây có thể là dấu hiệu tốt cho thấy mạng được định cấu hình chính xác và không có quy tắc tường lửa nào chặn lưu lượng truy cập (rất có thể).

Giải quyết tên

Nếu tất cả các kiểm tra này không trả về vấn đề hoặc lỗi lạ nào, thì bước tiếp theo là tập trung vào giải pháp DNS. Cấu hình cho điều đó sẽ có sẵn trong tệp cấu hình /etc/resolv.conf. Điều này đúng cho cả các phiên bản vật lý của Linux cũng như các máy ảo và bộ chứa. Bạn có thể sẽ nhận thấy rằng vùng chứa sử dụng nội dung như:

...
# Xem man:systemd-resolved.service(8) để biết chi tiết về các chế độ được hỗ trợ
# hoạt động cho /etc/resolv.conf.

tìm kiếm xyz

máy chủ định danh X.Y.Z.W
...

Địa chỉ IP máy chủ tên rất có thể sẽ là địa chỉ IP bên ngoài (giống như ISP của bạn) hoặc máy chủ cục bộ (127.0.0.X). Câu hỏi đặt ra là:Những tệp này có khớp với tệp /etc/resolv.conf của máy chủ lưu trữ của bạn không?

Câu trả lời là, rất có thể bạn đã xác định localhost trong tệp /etc/resolv.conf của máy chủ. Bây giờ, hãy thử điều đó trong thùng chứa của bạn. Chỉnh sửa tệp resolv.conf và thay thế địa chỉ IP trong dòng máy chủ tên bằng địa chỉ khớp với giá trị của máy chủ =localhost. Nếu điều đó giải quyết được vấn đề của bạn, thật tuyệt. Nhưng rất có thể là không.

Nhưng sau đó, tại thời điểm này, bạn không gặp vấn đề gì với kết nối mạng trên máy chủ của mình. Vì vậy, chúng tôi cần tìm ra địa chỉ THỰC SỰ của máy chủ DNS trong môi trường của bạn. Và điều này còn phức tạp hơn bởi thực tế là hầu hết các bản phân phối Linux hiện đại đều sử dụng systemd. Cốt truyện dày lên.

Tìm hiểu DNS với systemd

Vì vậy, có. Chúng ta cần tìm ra máy chủ tên là gì và chúng ta sẽ cần sử dụng lệnh systemd cho điều đó. Rất có thể, nếu bạn có systemd trong hệ thống của mình, thì bạn cũng đang sử dụng systemd-resolve, dịch vụ và trình quản lý phân giải tên mạng. Cấu hình được lưu trữ trong /etc/systemd/resolved.conf. Nhưng bạn cũng có thể lấy kết quả trên dòng lệnh bằng lệnh systemd-resolve:

systemd-resolve --status

Link 3 (wlp59s0)
Phạm vi hiện tại:Cài đặt DNS
LLMNR:có
Cài đặt MulticastDNS:không
Cài đặt DNSSEC:không
DNSSEC được hỗ trợ:không
Máy chủ DNS:10.50.34.1
2001:64c:1462:b023::1
Miền DNS:dedoimedo

Chúng ta có gì ở đây? Rất nhiều thứ thú vị. Nhưng điều thực sự quan trọng là dòng đọc Máy chủ DNS. Đây là những gì chúng ta muốn. Đặt địa chỉ IP này vào tệp chứa /etc/resolv.conf và thử lại. Mạng của bạn sẽ hoạt động trở lại.

Tại sao lại xảy ra vấn đề này?

Bây giờ, chúng ta có thể thảo luận về lý do tại sao một lần nữa. Nếu bạn xem tài liệu systemd-resolve, có thể đã có một số thay đổi trong hệ thống của bạn (thậm chí có thể do cập nhật thường xuyên), theo đó chế độ hoạt động đã chọn gây ra một số xung đột với tên độ phân giải. Đặc biệt, nếu chúng ta nhìn vào cách /etc/resolv.conf được xử lý, thì chế độ đầu tiên cho biết:

systemd-resolved duy trì tệp /run/systemd/resolve/stub-resolv.conf để tương thích với các chương trình Linux truyền thống. Tệp này có thể được liên kết tượng trưng từ /etc/resolv.conf. Tệp này liệt kê sơ khai DNS 127.0.0.53 (xem bên trên) là máy chủ DNS duy nhất. Nó cũng chứa danh sách các miền tìm kiếm đang được systemd-resolved sử dụng. Danh sách các miền tìm kiếm luôn được cập nhật. Lưu ý rằng /run/systemd/resolve/stub-resolv.conf không nên được sử dụng trực tiếp bởi các ứng dụng mà chỉ thông qua một liên kết tượng trưng từ /etc/resolv.conf. Tệp này có thể được liên kết tượng trưng từ /etc/resolv.conf để kết nối tất cả các máy khách cục bộ bỏ qua API DNS cục bộ với hệ thống phân giải bằng cài đặt miền tìm kiếm chính xác. Phương thức hoạt động này được khuyến nghị.

Nếu một trong các liên kết trong phương trình này bị hỏng hoặc có điều gì đó thay đổi, thì có thể dịch vụ Docker không thể thực sự xác định được điều gì mang lại và cuối cùng bạn không giải quyết được tên. Vì vậy, giải pháp [sic] là cung cấp địa chỉ DNS mạng thực tế mà các vùng chứa có thể hiểu và sử dụng. Đây là một chút suy đoán về phía tôi, nhưng tôi nghĩ nó khá chính xác.

Kết luận

Chúng ta bắt đầu, một bí ẩn khác đã được làm sáng tỏ, một kính chắn gió khác đã được làm sáng tỏ. Hoặc một cái gì đó. Tôi không thích các giải pháp nửa vời, nhưng khi bạn có một cơ sở hạ tầng hệ thống nhiều lớp, siêu phức tạp, đôi khi các giải pháp cũng tệ như vấn đề. Không phải là họ không khắc phục vấn đề - mà là bạn có ít khả năng hiển thị và kiểm soát hơn mức bạn nên làm một cách tôn trọng. Nhưng đó là tương lai của Linux - và mọi thứ CNTT - sự trừu tượng vô tận.

Về chủ đề, hy vọng rằng hướng dẫn nhỏ này sẽ cung cấp cho bạn cách khắc phục tương đối nhanh chóng và không gây đau đớn cho cuộc phiêu lưu trên container của bạn. Nếu bạn đang sử dụng Docker và độ phân giải tên không còn hoạt động bên trong các phiên bản vùng chứa, có lẽ bạn nên kiểm tra các mẹo và thủ thuật được viết ở trên - sau đó tạo hình ảnh của riêng bạn với bản sửa lỗi phù hợp, vì vậy bạn không cần phải chiến đấu với điều này một lần nữa. Và thế là xong.

Chúc mừng.