Docker container không thể giải quyết DNS trên Ubuntu 14.04 Máy chủ để bàn


48

Tôi đang gặp vấn đề với các container Docker của mình trên Ubuntu 14.04 LTS. Docker hoạt động tốt trong hai ngày, và rồi đột nhiên tôi mất tất cả kết nối mạng bên trong các container của mình. Đầu ra lỗi bên dưới ban đầu khiến tôi tin rằng đó là do apt-get đang cố gắng giải quyết DNS thông qua IPv6.

Tôi đã vô hiệu hóa IPv6 trên máy chủ của mình và vẫn, xóa tất cả hình ảnh, kéo cơ sở Ubuntu và vẫn gặp sự cố.

Tôi đã thay đổi máy chủ tên /etc/resolve.conf từ máy chủ DNS cục bộ của mình thành máy chủ DNS công cộng của Google (8.8.8.8 và 8.8.4.4) và vẫn không gặp may. Tôi cũng đã đặt DNS cho Google trong DOCKER_OPTS của / etc / default / docker và khởi động lại docker.

Tôi cũng đã thử kéo coreos và yum cũng không thể giải quyết DNS.

Thật kỳ lạ vì trong khi DNS không hoạt động, tôi vẫn nhận được phản hồi khi tôi ping các máy chủ cập nhật tương tự mà apt-get không thể giải quyết.

Tôi không đứng sau proxy, tôi đang sử dụng mạng cục bộ rất chuẩn và phiên bản Ubuntu này đã được cập nhật và mới (tôi đã cài đặt hai ngày trước để gần hơn với docker).

Tôi đã nghiên cứu kỹ lưỡng điều này thông qua các bài đăng khác về các vấn đề stackoverflow và github, nhưng không tìm thấy bất kỳ giải pháp nào. Tôi không biết làm thế nào để giải quyết vấn đề này, bất cứ ai cũng có thể giúp đỡ?

Thông báo lỗi

➜  arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> 5506de2b643b
Step 1 : RUN apt-get update
 ---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease   
Err http://archive.ubuntu.com trusty-proposed InRelease  
Err http://archive.ubuntu.com trusty Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.

Container IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04  
          inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:738 (738.0 B)  TX bytes:648 (648.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

Ngoài ra, cập nhật apt-get không thành công khi tôi buộc IPv4:

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease

Err http://archive.ubuntu.com trusty-updates InRelease

Err http://archive.ubuntu.com trusty-security InRelease

Err http://archive.ubuntu.com trusty-proposed InRelease

Err http://archive.ubuntu.com trusty Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  

Đối với tôi, nó hoạt động sau khi khởi động lại.
ssi-anik

Câu trả lời:


63

Woo, tôi tìm thấy một bài đăng trên github đã giải quyết vấn đề của tôi.

Sau khi Steve K. chỉ ra rằng đó thực sự không phải là sự cố DNS và là sự cố kết nối, tôi đã có thể tìm thấy một bài đăng trên github mô tả cách khắc phục sự cố này.

Rõ ràng cây cầu mạng docker0 đã bị treo lên. Cài đặt các tiện ích cầu nối và chạy các công cụ sau đây giúp Docker của tôi hoạt động tốt:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

1
bạn không cần phải đánh giá lại hình ảnh của mình. độ phân giải được tạo ra mỗi khi bạn chạy container mới. Vì vậy, bạn cần phải loại bỏ container cũ và bắt đầu một container khác. tôi đã đánh bại vấn đề này ngày hôm qua. đồng thời, nếu bạn đang ở trong mạng nội bộ của công ty, bạn có thể chuyển --dns-search = your.company.domain cho trình nền của docker trong / etc / default / docker trong biến DOCKER_OPTS env gần các cờ --dns --dns.
Alexander.Iljushkin

Điều này đã khắc phục vấn đề docker của tôi là tốt.
BobMcGee

3
Trên arch linux tôi cần ip link set down docker0thay vì ifconfig docker0 downsystemctl restart dockerthay vì service docker start. Để xóa tất cả các hình ảnh, tôi đã làmdocker rmi $(docker images -q)
lưới

Điều đó đã làm việc lần đầu tiên đối với tôi. Sau đó, tôi khởi động lại và vấn đề xuất hiện trở lại: tái tạo các bước đó đã không khắc phục vấn đề một lần nữa. Tao không biết cái quái gì về chuyện này.
dùng626921

1
Chỉ cần thấy rằng giao diện docker0 của tôi bị hỏng, tôi đã thực hiện /etc/init.d/docker restartvà nó quay trở lại hoạt động
lolesque

14

Nếu đó là sự cố trình phân giải DNS, đây là giải pháp:

Điều đầu tiên để kiểm tra là chạy cat /etc/resolv.conftrong container docker . Nếu nó có một máy chủ DNS không hợp lệ, chẳng hạn như nameserver 127.0.x.x, thì container sẽ không thể phân giải tên miền thành địa chỉ IP, do đó ping google.comsẽ thất bại.

Điều thứ hai cần kiểm tra là chạy cat /etc/resolv.conftrên máy chủ . Docker về cơ bản sao chép máy chủ /etc/resolv.confvào container mỗi khi container được khởi động. Vì vậy, nếu máy chủ /etc/resolv.confbị sai, thì container docker cũng vậy.

Nếu bạn thấy rằng máy chủ lưu trữ /etc/resolv.confsai, thì bạn có 2 tùy chọn:

  1. Mã hóa máy chủ DNS trong daemon.json. Điều này là dễ dàng, nhưng không lý tưởng nếu bạn mong muốn máy chủ DNS thay đổi.

  2. Sửa máy chủ /etc/resolv.conf. Đây là một mẹo nhỏ hơn, nhưng nó được tạo ra một cách linh hoạt và bạn không mã hóa máy chủ DNS.


1. Máy chủ DNS mã hóa cứng trong docker daemon.json

  • Biên tập /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Khởi động lại trình nền docker để những thay đổi đó có hiệu lực:
    sudo systemctl restart docker

  • Bây giờ khi bạn chạy / khởi động một container, docker sẽ điền /etc/resolv.confvào các giá trị từ đó daemon.json.


2. Sửa lỗi máy chủ /etc/resolv.conf

A. Ubuntu 16.04 trở về trước

  • Đối với Ubuntu 16.04 trở về trước, /etc/resolv.confđã được NetworkManager tạo động.

  • Nhận xét dòng dns=dnsmasq(có a #) trong /etc/NetworkManager/NetworkManager.conf

  • Khởi động lại Trình quản lý mạng để tạo lại /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Xác minh trên máy chủ: cat /etc/resolv.conf

B. Ubuntu 18.04 trở lên

  • Ubuntu 18.04 đã thay đổi để sử dụng systemd-resolvedđể tạo/etc/resolv.conf . Bây giờ theo mặc định, nó sử dụng bộ đệm DNS cục bộ 127.0.0.53. Điều đó sẽ không hoạt động bên trong một container, vì vậy Docker sẽ mặc định là máy chủ DNS 8.8.8.8 của Google, có thể bị hỏng đối với những người đứng sau tường lửa.

  • /etc/resolv.confthực sự là một symlink ( ls -l /etc/resolv.conf) trỏ đến /run/systemd/resolve/stub-resolv.conf(127.0.0.53) theo mặc định trong Ubuntu 18.04.

  • Chỉ cần thay đổi liên kết tượng trưng để trỏ đến /run/systemd/resolve/resolv.conf, trong đó liệt kê các máy chủ DNS thực:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Xác minh trên máy chủ: cat /etc/resolv.conf

Bây giờ bạn nên có một hợp lệ /etc/resolv.conftrên máy chủ lưu trữ để sao chép vào các thùng chứa.


Cảm ơn vì điều này, tôi thực sự đã mất trí khi cố gắng hiểu những gì đang xảy ra với các container docker và 18.04 phân giải IP trên VPN. Sửa /etc/resolv.conf cho 18.04 làm việc cho tôi!
George Papas

tùy chọn B làm việc cho tôi ..
codeSetter

Chắc chắn 2B sẽ không tồn tại trong bản cập nhật của systemdgói ...
Auspex

13

Trong một nỗ lực để thêm giá trị bổ sung cho một vấn đề tôi cũng gặp phải; với một câu trả lời thay thế:

Mạng của tôi liên quan đến văn phòng và cài đặt DNS của Google đã bị chặn để bộ chứa có thể ping địa chỉ IP nhưng không phải tên miền.

Máy chủ của tôi /etc/resolv.confban đầu trông giống như;

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

Điều này là do Trình quản lý mạng thực hiện một số loại che giấu các chi tiết máy chủ DNS.

Thật không may, theo hướng dẫn sử dụng docker, docker sẽ lọc bất kỳ địa chỉ IP localhost nào khi xây dựng độ phân giải của bộ chứa và thay thế chúng bằng IP DNS của Google. Mà trong trường hợp của tôi khiến tên miền bị giới hạn.

Tôi phải:

  • Đặt lại của tôi /etc/default/dockervề mặc định để các container sử dụng nội dung decv.conf của máy chủ của tôi thay thế.
  • Chỉnh sửa /etc/NetworkManager/NetworManager.confvà nhận xét ra dòng dns=dnsmasq. Điều này là để NM có thể chỉ định các địa chỉ IP DNS thực tế thay vì 127.0.0.1.
  • Khởi động lại NM với sudo service network-manager restart.
  • Khởi động lại dịch vụ docker với sudo service docker restart.

Chạy một container sau đó sẽ cho phép nó làm apt-get update/upgrade, ví dụ.


3
Điều này thực sự làm việc cho tôi. Và tôi đứng sau mạng nội bộ của công ty
Daniel Andrei Mincă

1
Giải pháp này hoạt động rất tốt cho Ubuntu 16.04 trở về trước. Đối với Ubuntu 18.04 trở lên, hãy xem serverfault.com/a/918568
wvducky

Cảm ơn! Điều này làm việc, trong khi câu trả lời được chấp nhận thì không. :)
Devolus

8

Lỗi của bạn là ở đây:

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19).
 connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

Đây không phải là lỗi với DNS, thay vào đó hệ thống của bạn đang cố gắng kết nối với máy chủ IPv6 và không thành công. Có lẽ vì bạn không có quyền truy cập IPv6 trên máy chủ của mình. Việc tra cứu thực tế địa chỉ IPv6 thành công. (Bản sao / lưu trữ ubfox có sẵn trên cả IPv6 và IPv4. Bạn không đủ may mắn để truy cập IPv6 vì hệ thống của bạn tin rằng nó sẽ hoạt động.)

Bạn nên khắc phục điều đó, bằng cách cài đặt miredo hoặc thử lại cho đến khi bạn chạm vào gương IPv4.

Một lần nữa, điều quan trọng cần nhận ra ở đây là DNS không đáng trách, như bạn có thể thấy bằng các bài kiểm tra ping của riêng mình.


1
Cảm ơn bạn đã trả lời nhanh và làm rõ rằng đây không thực sự là vấn đề DNS, tôi đánh giá cao nó. Tôi đã cài đặt miredo - không đi. Cũng đáng lưu ý rằng khi tôi chạy apt-get update -o Acquire :: ForceIPv4 = true apt-get update vẫn không thành công, tôi đã cập nhật bài viết gốc của mình với câu trả lời đó. Tôi đã thử vô hiệu hóa UFW vì nghĩ có lẽ đó là trường hợp và vẫn không gặp may.
Thomas V.

Thật kỳ lạ - bạn có thể thấy bạn có kết nối IPv4 vì ping của bạn thành công. Nhưng bạn không thể kết nối với máy nhân bản bất kể đề nghị bạn có một số vấn đề về định tuyến / kết nối mạng kỳ lạ (mà tôi đoán là tại sao bạn đăng bài ở đây!)

8

Docker doc chính thức cung cấp cho các công cụ cấu hình máy chủ DNS để Docker sử dụng

  1. Mở /etc/default/dockertệp để chỉnh sửa:

    sudo nano /etc/default/docker
    
  2. Thêm cài đặt cho Docker:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. Thay thế 8.8.8.8bằng một máy chủ DNS cục bộ như 192.168.1.1. Bạn cũng có thể chỉ định nhiều máy chủ DNS. Tách chúng bằng dấu cách, ví dụ:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    Cảnh báo: Nếu bạn đang thực hiện việc này trên máy tính xách tay kết nối với nhiều mạng khác nhau, hãy đảm bảo chọn máy chủ DNS công cộng.

    PS: nm-toolcó thể được sử dụng để kiểm tra máy chủ DNS cục bộ

  4. Lưu và đóng tập tin.

  5. Khởi động lại daemon Docker.

    sudo service docker restart
    

Lưu ý rằng đây là tệp cấu hình cũ cho Docker Upstart và SysVinit. Cách hiện tại cho systemd (kể từ Ubuntu 16.04) là sử dụng /etc/docker/daemon.jsoncho các cài đặt trình nền của docker như dns.
wvducky

0

Đối với những độc giả khác đến đây khi sử dụng boot2docker, đây là cách tôi sửa. Trong thực tế, câu trả lời ở trên chỉ cho tôi đi đúng hướng.

Về cơ bản, vì một số lý do, các bộ chứa bên trong boot2docker không thể giải quyết tên máy chủ.

Vì vậy, tôi chỉ cần khởi động lại boot2docker và bắt đầu các container. Bây giờ tên máy chủ có thể giải quyết đúng một lần nữa.

Tôi cho rằng sự cố đã bắt đầu boot2docker trong khi mạng trên máy chủ đang được kết nối khiến boot2docker khởi động và chuyển sang trạng thái không hoạt động.


0

Tôi đã có vấn đề tương tự trên Windows. Lệnh này đã làm cho nó làm việc cho tôi:docker-machine restart


0

Khởi động lại trình nền Docker trên Debian9

service docker restart

và các kết nối và mạng hoạt động tốt


-1

Có một vấn đề tương tự, nhưng cũng giải quyết tên giữa các vùng chứa trong mạng do Người dùng xác định có vẻ hơi khó hiểu. Một số không thể giải quyết bất cứ điều gì như bạn.

Vấn đề là di chuyển / var / lib / docker. Vì lý do không gian, nó được gắn thông qua nfs. Thêm một hệ thống tệp cục bộ và di chuyển các tệp ở đó giải quyết vấn đề.


Nếu bạn nghĩ rằng một câu hỏi có thể được trả lời bằng một câu trả lời cho một câu hỏi tương tự, vui lòng đánh dấu nó là một bản sao của câu hỏi đó. Nếu bạn không thể làm điều đó, bạn nên để lại nhận xét thay vì trả lời riêng.
Jenny D nói Phục hồi lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.