Docker.io DNS không hoạt động, nó đang cố sử dụng 8.8.8.8


33

Tôi có bản cài đặt Ubuntu 14.04 mới và muốn sử dụng Docker để chạy công cụ cũ cần 12.04. DNS bên trong Docker không hoạt động.

Độ phân giải của máy tính xách tay của tôi trông giống như:

nameserver 127.0.0.1

Mà không hoạt động với Docker, rõ ràng. Do đó, nó cố gắng đặt các máy chủ tên thành 8.8.8.8 và 8.8.4.4; khi tôi làm

$ sudo docker run -i -t ubuntu /bin/bash

Nó nói rằng:

WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]

Và chắc chắn, bên trong ví dụ Docker, độ phân giải trông giống như:

nameserver 8.8.8.8
nameserver 8.8.4.4

Tôi có thể ping cả hai thứ đó thành công từ trong ví dụ Docker. Tuy nhiên, không có DNS (ví dụ: ping google.comthất bại).

đầu ra ifconfig bên trong Docker:

eth0      Link encap:Ethernet  HWaddr aa:e9:9f:83:9d:92  
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:648 (648.0 B)  TX bytes:738 (738.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:1500  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)

Giờ thì sao?

Câu trả lời:


23

Khi gói Ubuntu Docker được cập nhật để sử dụng systemd, nó đã bỏ hỗ trợ cho /etc/default/dockertệp cấu hình, do đó, giải pháp ban đầu được đề xuất bởi rocketman10404 sẽ không còn hoạt động (vô hiệu hóa dnsmasqvẫn hoạt động, nhưng nó có nhược điểm là ngăn Ubuntu tự động cập nhật máy chủ DNS) .

Sửa trong daemon.jsontập tin cấu hình mới

Tìm máy chủ DNS của mạng của bạn:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Mở hoặc tạo, nếu nó không tồn tại /etc/docker/daemon.jsonvà thêm cài đặt DNS vào ExecStartdòng:

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Khởi động lại daemon docker:

$ sudo service docker restart

Tôi đã viết một bài đăng trên blog chuyên sâu và cũng đã gửi một lỗi về vấn đề này nếu bạn muốn biết thêm chi tiết.

(Ban đầu tôi đã giải quyết nó bằng cách mở /lib/systemd/system/docker.service và thêm cài đặt DNS vào dòng ExecStart , nhưng điều đó thật tệ - chúng tôi không nên chỉnh sửa trực tiếp các tệp systemd .)


Cảm ơn giải pháp của bạn - thật hữu ích trên con đường tôi đã thực hiện giải pháp của mình - điều mà tôi nghĩ là phù hợp hơn một chút với hoàn cảnh của riêng tôi và đặc thù của việc chạy Docker trên Ubuntu (hoặc các bản phân phối máy tính để bàn khác sử dụng NetworkManager + dnsmasq).
Adrian

16

Tôi không sử dụng docker cho mình, vì vậy tôi thường không tham gia vào câu hỏi về docker, nhưng tôi tình cờ đọc về nó và tình cờ thấy một số tài liệu về docker xuất hiện để giải quyết vấn đề chính xác này . Tóm lại...

Các tài liệu cho thấy một vài cách giải quyết. Đầu tiên là chỉ định máy chủ DNS được sử dụng bởi trình nền của docker cho các container bằng cách thêm dòng sau vào /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

trong đó DNS được cung cấp có thể là máy chủ DNS cục bộ, chẳng hạn như 192.168.1.1 (cổng). Sau đó, khởi động lại với

sudo restart docker

Một giải pháp thay thế liên quan đến việc vô hiệu hóa dnsmasq trong NetworkManager bằng cách nhận xét cấu hình /etc/NetworkManager/NetworkManager.confnhư sau:

#dns=dnsmasq

sau đó, khởi động lại cả hai

sudo restart network-manager
sudo restart docker

3
vô hiệu hóa dnsmasq làm việc cho tôi.
bennyl

2
Cách tiếp cận sau này tất nhiên có nghĩa là người quản lý mạng không thể kiểm soát dnsmasq, nghĩa là nó không thể thay đổi máy chủ dns của bạn khi bạn thay đổi mạng, bao gồm cả việc chuyển sang VPN. Cách tiếp cận trước đây có vẻ tốt hơn đối với tôi, nhưng tôi muốn có thể có dnsmasq cũng nghe trên docker IP (172.17.0.1) để tôi có thể trỏ máy chủ docker vào đó.
mc0e

1
Kể từ khi Ubuntu chuyển sang thiết lập Docker với sytemd, /etc/default/dockerkhông còn có tác dụng. Xem giải pháp của tôi để biết cách giải quyết vấn đề này trong thế giới hậu khởi động / khởi động.
Robin Winslow

/etc/NetworkManager/NetworkManager.confkhông tồn tại trên Ubuntu 18.04 LTS. : /
XtraSimplility

Lưu ý rằng với một số thiết lập Ubuntu 18.04 (ví dụ: hình ảnh tối thiểu trên Amazon) systemd-resolvedđang hoạt động như một máy chủ DNS lưu trữ theo mặc định và sẽ gây ra sự WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.cố (thiết lập Ubuntu 16.04 không xuất hiện để bật mặc định). Cách giải quyết là vô hiệu hóa systemd-resolvedhoặc sử dụng --dnstùy chọn khi khởi động container như được đề cập trong câu trả lời chính.
Anon

9

Tôi gặp phải vấn đề này trong tình huống cụ thể của tôi

  • Chạy container Docker trên máy phát triển cục bộ của tôi
  • Được kết nối với VPN
  • Một số tập lệnh xây dựng vùng chứa của chúng tôi thực hiện những việc như chạy npm installtừ kho lưu trữ tùy chỉnh trên VPN , bên trong vùng chứa.
    • Điều này hoạt động từ một đường ống CI nhưng không phải từ các máy phát triển của chúng tôi, vì npmkhông thể thực hiện tra cứu DNS thành công
    • Chúng tôi cũng gặp vấn đề với các container cần thực hiện tra cứu để gọi API REST bên ngoài

Ubuntu theo mặc định sử dụng được dnsmasqkhởi động bởi NetworkManager để lưu trữ các yêu cầu DNS và định cấu hình /etc/resolv.confđể trỏ đến trường hợp này trên127.0.1.1

  • Máy khách VPN mà chúng tôi đang sử dụng không tương thích với NetworkManager và buộc nó sở hữu /etc/resolv.confnó ghi đè lên cấu hình NetworkManager
  • Điều này cấu hình các máy chủ DNS cho VPN
  • Docker đổ bóng của bạn /etc/resolv.confvào container theo mặc định
    • Thông thường trên Ubuntu, nó chuyển các máy chủ DNS của Google đến vùng chứa (vì nó biết về dnsmasqtình huống này.
    • Nhưng thật vui khi chuyển cấu hình máy chủ VPN DNS sang vùng chứa
    • Không có tuyến đường nào từ container trên docker0cầu mạng, đến các máy chủ DNS qua tap0bộ điều hợp VPN .
  • Ergo, tất cả các tra cứu DNS trong vùng chứa đều thất bại vì nó không thể truy cập vào các máy chủ DNS duy nhất được cung cấp cùng với
  • Ngoài ra, một số mạng chặn yêu cầu đến máy chủ DNS của Google vì họ muốn có thể theo dõi tất cả các tra cứu DNS của bạn

Giải pháp :

Nó có vẻ thanh lịch hơn khi sử dụng NetworkManager và đó là dnsmasqví dụ bị giam cầm theo cách nó được thiết kế.

  1. Yêu cầu Docker sử dụng dnsmasqví dụ của bạn cho DNS

    • Thêm hoặc chỉnh sửa tệp /etc/docker/daemon.jsonđể báo cho docker sử dụng docker0bộ điều hợp cầu cho DNS

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Định cấu hình phiên bản NM dnsmasqđể nghe các cầu nối Docker, bởi vì theo mặc định, nó chỉ lắng nghe 127.0.1.1 - tạo tệp/etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Tôi không thích hành vi thô lỗ của máy khách VPN đó và tôi chỉ muốn sử dụng DNS ở cuối VPN để tra cứu VPN (nếu bạn có máy khách VPN lịch sự sử dụng NetworkManager được định cấu hình chính xác, bạn sẽ không phải làm điều này )

    • Tắt tính năng DNS trong máy khách VPN (nó dừng ghi đè resolv.confkhi kết nối và bây giờ tất cả DNS lại đi qua dnsmasq)
    • Thêm một tệp cấu hình để nói dnsmasqvới các yêu cầu DNS trực tiếp cho miền của bạn một cách thích hợp - thêm tệp `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Tùy chọn, thêm tên miền tìm kiếm cho tên miền của bạn để bạn có thể sử dụng tên ngắn

      • Tôi vừa thêm tên miền cục bộ của chúng tôi vào danh sách tìm kiếm trong kết nối mạng mặc định của mình
  4. Khởi động lại Trình quản lý mạng và Docker

    sudo service network-manager restart
    sudo service docker restart
    

Tại thời điểm này, các bộ chứa Docker của bạn sẽ có thể thực hiện nslookupmà không gặp sự cố khi bạn sử dụng VPN, cho các miền cả bên trong và bên ngoài VPN của bạn.


1
Một tinh chỉnh nhỏ không liên quan đến mã hóa IP cầu nối docker0 là sử dụng giao diện thay vì chỉ thị địa chỉ nghe: interface = docker0
siwyd 4/12/2016

Giải thích và hướng dẫn tuyệt vời. Một +1 xứng đáng.
vào

Chúc mừng @simonwydooghe - Tôi đã kết hợp đề xuất của mình - bạn cũng có thể sử dụng các ký tự đại diện trong trường đó vì vậy tôi đã thêm một mẫu cho tất cả các tên cầu được sử dụng bởi các mạng không mặc định (ít nhất, như được sử dụng bởi docker-compose).
Adrian

1
Có vẻ như giá trị dns trong daemon.json phải là một mảng, nếu không tôi gặp lỗi: cannot unmarshal string into Go value of type []stringkhi khởi động lại dịch vụ docker.
Slaven Rezic

Cập nhật cho Bionic: 18.04 không còn sử dụng phiên bản bắt giữ của dnsmasq được quản lý bởi NetworkManager cho DNS và thay vào đó sử dụng phân giải systemd; điều này mang đến những vấn đề của riêng nó, bởi vì điều đó không thể được cấu hình để lắng nghe cầu docker0. Tôi đã dùng đến việc vô hiệu hóa nó và cài đặt lại dnsmasq NetworkManager và định cấu hình chính xác.
Adrian

2

Đây là cách tôi thiết lập docker trên máy chủ Ubuntu 14.04 của mình chạy không đầu.

Tôi đang chạy máy chủ Ubuntu 14.04 với phiên bản docker sau được cài đặt.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

Tệp /etc/init/docker.io.conf và tập lệnh chứa dòng sau:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

Câu trả lời ở trên đã giúp tôi tìm thấy các tập tin ở trên.

Tôi đã bỏ ghi chú sau trong /etc/default/docker.io và thêm máy chủ DNS cục bộ của mình:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

Khởi động lại dịch vụ với:

sudo service docker.io restart

Chạy docker run <image> /bin/bash

Không có tin nhắn dns khi bắt đầu container.

Bắt đầu một container mới, cài đặt dnsutils.

Ran đào và thông báo máy chủ là máy chủ DNS cục bộ chính xác.


0

Tôi đã có một vấn đề tương tự, báo cáo nó với StackOverflow . Dường như tôi không thể truy vấn 8.8.8.8máy chủ tên được chỉ định trong cài đặt Docker mặc định của Ubuntu; tuy nhiên, tôi có thể ping nó Trong trường hợp này, sử dụng máy chủ DNS mà bạn thực sự có thể truy vấn. Kiểm tra với

nslookup - dns.server.name

và khởi động container thông qua

docker run --dns=ip.addr.of.dns

Tôi vẫn chưa tìm được cách để https://askubfox.com/q/607172/30266 để tìm ra giải pháp tự động.


Câu trả lời của tôi có thể đủ tự động cho bạn ...
Adrian

0

Bạn có thể sử dụng trình phân giải DNS cục bộ của máy chủ (ví dụ dnsmasq) từ các thùng chứa Docker của bạn nếu chúng nằm trên mạng do người dùng xác định . Trong trường hợp đó, một bộ chứa /etc/resolv.confsẽ có máy chủ tên 127.0.0.11(hay còn gọi là máy chủ DNS nhúng của Docker ), có thể chuyển tiếp các yêu cầu DNS đến địa chỉ loopback của máy chủ một cách chính xác.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

Nếu bạn sử dụng docker-compose, nó sẽ tự động thiết lập một mạng tùy chỉnh cho các thùng chứa của bạn (với định dạng tệp v2 + ). Tuy nhiên, lưu ý rằng trong khi docker-composechạy các container trong mạng do người dùng xác định, nó vẫn xây dựng chúng trong mạng mặc định . Để sử dụng mạng tùy chỉnh cho các bản dựng, bạn có thể chỉ định networktham số trong cấu hình bản dựng (yêu cầu định dạng tệp v3.4 + ).

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.