DNS docker.io tidak berfungsi, mencoba menggunakan 8.8.8.8

33

Saya telah menginstal Ubuntu 14.04 baru, dan ingin menggunakan Docker untuk menjalankan barang lama saya yang membutuhkan 12,04. DNS di dalam Docker tidak berfungsi.

Resolv.conf laptop saya terlihat seperti:

nameserver 127.0.0.1

Yang tidak bekerja dengan Docker, rupanya. Karena itu ia mencoba untuk mengatur nameserver ke 8.8.8.8 dan 8.8.4.4; ketika saya melakukannya

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

Ia mengatakan:

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]

Dan tentu saja, di dalam instance Docker, resolv.conf terlihat seperti:

nameserver 8.8.8.8
nameserver 8.8.4.4

Saya dapat melakukan ping ke keduanya dengan sukses dari dalam instance Docker. Namun, tidak ada DNS (mis. ping google.comGagal).

keluaran ifconfig di dalam 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)

Sekarang apa?

RemcoGerlich
sumber

Jawaban:

23

Ketika paket Docker Ubuntu diperbarui untuk menggunakan systemd, itu menjatuhkan dukungan untuk /etc/default/dockerfile konfigurasi, sehingga solusi awal yang disarankan oleh rocketman10404 tidak akan berfungsi lagi (menonaktifkan dnsmasqmasih akan berfungsi, tetapi memiliki kelemahan mencegah Ubuntu dari memperbarui server DNS secara otomatis) .

Memperbaiki di daemon.jsonfile konfigurasi baru

Temukan server DNS jaringan Anda:

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

Buka atau buat, jika tidak ada, /etc/docker/daemon.jsondan tambahkan pengaturan DNS ke ExecStartbaris:

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

Mulai ulang daemon buruh pelabuhan:

$ sudo service docker restart

Saya menulis posting blog yang mendalam dan juga mengajukan bug tentang masalah ini jika Anda ingin detail lebih lanjut.

(Awalnya saya menyelesaikannya dengan membuka /lib/systemd/system/docker.service dan menambahkan pengaturan DNS ke baris ExecStart , tapi itu buruk - kita tidak boleh mengedit file systemd secara langsung .)

Robin Winslow
sumber
Terima kasih atas solusi Anda - ini sangat membantu pada jalan yang saya ambil untuk solusi saya - yang saya pikir merupakan pertandingan yang sedikit lebih elegan untuk keadaan saya sendiri dan kekhasan menjalankan Docker di Ubuntu (atau distro desktop lain yang menggunakan NetworkManager + dnsmasq).
Adrian
16

Saya tidak menggunakan buruh pelabuhan sendiri, jadi saya biasanya tidak akan bertanya-tanya di sini, tapi saya kebetulan membaca tentang hal itu dan menemukan beberapa dokumentasi buruh pelabuhan yang tampaknya menangani masalah persis ini . Untuk menyimpulkan...

Dokumentasi menyarankan beberapa solusi. Yang pertama adalah menentukan server DNS yang akan digunakan oleh docker daemon untuk kontainer dengan menambahkan baris berikut ke /etc/default/docker:

docker_OPTS="--dns 8.8.8.8"

di mana DNS yang disediakan bisa menjadi server DNS lokal, seperti 192.168.1.1 (gateway). Kemudian, mulai kembali dengan

sudo restart docker

Solusi alternatif melibatkan menonaktifkan dnsmasq di NetworkManager dengan mengomentari konfigurasi /etc/NetworkManager/NetworkManager.confseperti ini:

#dns=dnsmasq

lalu, restart keduanya

sudo restart network-manager
sudo restart docker
rocketman10404
sumber
3
menonaktifkan dnsmasq bekerja untuk saya.
bennyl
2
Pendekatan terakhir ini tentu saja berarti manajer jaringan tidak dapat mengendalikan dnsmasq, artinya misalnya tidak dapat mengubah server dns Anda saat Anda mengubah jaringan, termasuk beralih ke VPN. Pendekatan yang pertama nampaknya lebih baik bagi saya, tetapi saya ingin dapat memiliki dnsmasq juga mendengarkan pada docker IP (172.17.0.1) sehingga saya dapat mengarahkan host docker pada saat itu.
mc0e
1
Karena Ubuntu beralih ke pengaturan Docker dengan sytemd, /etc/default/dockertidak ada lagi efeknya. Lihat solusi saya untuk bagaimana menyelesaikannya di dunia post-init.d / pemula.
Robin Winslow
/etc/NetworkManager/NetworkManager.conftidak ada di Ubuntu 18.04 LTS. : /
XtraSimplicity
Perhatikan bahwa dengan beberapa pengaturan Ubuntu 18.04 (mis. Gambar minimal di Amazon) systemd-resolvedbertindak sebagai server DNS caching secara default dan akan memancing WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.masalah (pengaturan Ubuntu 16.04 tampaknya tidak mengaktifkannya secara default). Solusinya adalah untuk menonaktifkan systemd-resolvedatau menggunakan --dnsopsi ketika memulai wadah seperti yang disebutkan dalam jawaban utama.
Anon
9

Saya mengalami ini dalam situasi saya yang khusus

  • Menjalankan kontainer Docker di mesin pengembangan lokal saya
  • Yang terhubung ke VPN
  • Beberapa skrip pembuatan wadah kami melakukan hal-hal seperti lari npm installdari repositori khusus pada VPN , di dalam wadah.
    • Ini berfungsi dari pipa CI tetapi tidak dari mesin pengembang kami, karena npmtidak dapat melakukan pencarian DNS yang berhasil
    • Kami juga memiliki masalah dengan kontainer yang perlu dilakukan pencarian untuk memanggil API REST eksternal

Ubuntu secara default menggunakan dnsmasqdimulai oleh NetworkManager untuk cache permintaan DNS, dan mengkonfigurasi /etc/resolv.confuntuk menunjuk ke instance ini pada127.0.1.1

  • Klien VPN yang kami gunakan tidak kompatibel dengan NetworkManager dan memaksa sendiri /etc/resolv.confyang menimpa konfigurasi NetworkManager
  • Ini mengkonfigurasi server DNS untuk VPN
  • Docker /etc/resolv.confsecara default mengarahkan Anda ke kontainer
    • Biasanya di Ubuntu, ia melewati server DNS Google ke wadah (karena ia tahu tentang dnsmasqsituasinya.
    • Tapi senang untuk lulus konfigurasi server DNS VPN ke wadah
    • Tidak ada rute dari wadah di docker0jembatan jaringan, ke server DNS melalui tap0adaptor VPN .
  • Ergo, semua pencarian DNS dalam wadah gagal karena tidak dapat mencapai satu-satunya server DNS yang disertakan
  • Selain itu, beberapa jaringan memblokir permintaan ke server DNS Google karena mereka ingin dapat mengintip semua pencarian DNS Anda

Solusinya :

Tampaknya akan lebih elegan untuk menggunakan NetworkManager dan ini adalah dnsmasqcontoh captive dalam cara itu dirancang.

  1. Beri tahu Docker untuk menggunakan dnsmasqinstance Anda untuk DNS

    • Tambah atau edit file /etc/docker/daemon.jsonuntuk memberi tahu buruh pelabuhan untuk menggunakan docker0adaptor jembatan untuk DNS

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Konfigurasikan dnsmasqinstance NM untuk mendengarkan jembatan Docker juga, karena secara default hanya mendengarkan 127.0.1.1 - buat file/etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Saya tidak suka perilaku kasar klien VPN itu dan saya lebih suka hanya menggunakan DNS di akhir VPN untuk pencarian VPN (jika Anda memiliki klien VPN yang sopan yang menggunakan NetworkManager yang dikonfigurasi dengan benar, Anda tidak perlu melakukan ini )

    • Matikan fitur DNS di klien VPN (itu berhenti menimpa resolv.confsaat terhubung dan sekarang semua DNS melewati dnsmasqlagi)
    • Tambahkan file konfigurasi untuk memberi tahu dnsmasqpermintaan DNS langsung untuk domain Anda dengan tepat - tambahkan file `/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Secara opsional, tambahkan domain pencarian untuk domain Anda sehingga Anda dapat menggunakan nama pendek

      • Saya baru saja menambahkan domain lokal kami ke daftar pencarian di koneksi jaringan default saya
  4. Mulai kembali NetworkManager dan Docker

    sudo service network-manager restart
    sudo service docker restart
    

Pada titik ini, wadah Docker Anda seharusnya dapat melakukan nslookuptanpa masalah saat Anda menggunakan VPN, untuk domain baik di dalam maupun di luar VPN Anda.

Adrian
sumber
1
Tweak kecil yang tidak melibatkan pengodean keras docker0 bridge IP adalah dengan menggunakan antarmuka alih-alih directive address-address: interface = docker0
siwyd
Penjelasan dan instruksi yang luar biasa. A +1 memang layak.
sebelum
Cheers @simonwydooghe - Saya telah memasukkan saran Anda - Anda juga dapat menggunakan wildcard di bidang itu jadi saya telah menambahkan pola untuk semua nama jembatan yang digunakan oleh jaringan non-default (setidaknya, seperti yang digunakan oleh docker-compose).
Adrian
1
Tampaknya nilai dns di daemon.json harus berupa array, jika tidak saya akan mendapatkan kesalahan: cannot unmarshal string into Go value of type []stringketika me-restart layanan buruh pelabuhan.
Slaven Rezic
Pembaruan untuk Bionic: 18.04 tidak lagi menggunakan contoh captive dari dnsmasq yang dikelola oleh NetworkManager untuk DNS dan sebagai gantinya menggunakan systemd-resolved; yang membawa masalah sendiri, karena itu tidak dapat dikonfigurasi untuk mendengarkan jembatan docker0. Saya terpaksa menonaktifkannya, dan menginstal ulang NetworkManager dnsmasq dan mengonfigurasinya dengan benar.
Adrian
2

Inilah cara saya mengatur buruh pelabuhan di server Ubuntu 14.04 saya yang berjalan tanpa kepala.

Saya menjalankan server Ubuntu 14.04 dengan versi buruh pelabuhan berikut diinstal.

#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

File /etc/init/docker.io.conf dan skrip berisi baris berikut:

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

Jawaban di atas membantu saya menemukan file di atas.

Saya membatalkan komentar berikut ini di /etc/default/docker.io dan menambahkan server DNS lokal saya:

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

Mulai ulang layanan dengan:

sudo service docker.io restart

Ran docker run <image> /bin/bash

Tidak ada pesan dns saat memulai wadah.

Memulai wadah baru, menginstal dnsutils.

Jalankan penggalian dan pesan server adalah server DNS lokal yang benar.

Gulungan
sumber
0

Saya memiliki masalah serupa, melaporkannya ke StackOverflow . Tampaknya saya tidak dapat meminta 8.8.8.8server nama yang ditentukan dalam instalasi Docker default Ubuntu; Namun, saya bisa melakukan ping. Dalam hal ini, gunakan server DNS yang sebenarnya bisa Anda tanyakan. Tes dengan

nslookup - dns.server.name

dan mulai wadah melalui

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

Saya belum menemukan cara untuk https://askubuntu.com/q/607172/30266 untuk mendapatkan solusi automagic.

krlmlr
sumber
Jawaban saya mungkin cukup otomatis untuk Anda ...
Adrian
0

Anda dapat menggunakan resolver DNS lokal host (mis. dnsmasq) Dari wadah Docker Anda jika mereka berada di jaringan yang ditentukan pengguna . Dalam hal ini seorang penampung /etc/resolv.confakan memiliki nameserver 127.0.0.11(alias server DNS tertanam Docker ), yang dapat meneruskan permintaan DNS ke alamat loopback host dengan benar.

$ 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    

Jika Anda menggunakan docker-compose, itu akan mengatur jaringan khusus untuk wadah Anda secara otomatis (dengan format file v2 + ). Namun, perlu diketahui bahwa saat docker-composemenjalankan kontainer di jaringan yang ditentukan pengguna, wadah itu tetap membangunnya di jaringan default . Untuk menggunakan jaringan khusus untuk build, Anda dapat menentukan networkparameter dalam konfigurasi build (memerlukan format file v3.4 + ).

Eugene Yarmash
sumber