Kontainer Docker tidak dapat menyelesaikan DNS di Ubuntu 14.04 Desktop Host

48

Saya mengalami masalah dengan kontainer Docker saya di Ubuntu 14.04 LTS. Docker bekerja dengan baik selama dua hari, dan kemudian tiba-tiba saya kehilangan semua konektivitas jaringan di dalam wadah saya. Keluaran kesalahan di bawah awalnya membuat saya percaya itu karena apt-get sedang mencoba untuk menyelesaikan DNS melalui IPv6.

Saya menonaktifkan IPv6 pada mesin host saya dan masih, menghapus semua gambar, menarik basis ubuntu, dan masih mengalami masalah.

Saya mengubah nameserver /etc/resolve.conf dari server DNS lokal saya ke server DNS publik Google (8.8.8.8 dan 8.8.4.4) dan masih belum berhasil. Saya juga mengatur DNS ke Google di DOCKER_OPTS dari / etc / default / docker dan restart docker.

Saya juga mencoba menarik coreo, dan yum juga tidak bisa menyelesaikan DNS.

Ini aneh karena sementara DNS tidak berfungsi, saya masih mendapatkan respons ketika saya melakukan ping ke server pembaruan yang sama yang apt-get tidak bisa atasi.

Saya tidak berada di belakang proxy, saya menggunakan jaringan lokal yang sangat standar, dan versi Ubuntu ini mutakhir dan segar (saya menginstal dua hari lalu agar lebih dekat dengan buruh pelabuhan).

Saya telah meneliti ini sepenuhnya melalui posting lain tentang masalah stackoverflow dan github, tetapi belum menemukan resolusi. Saya kehabisan ide bagaimana mengatasi masalah ini, adakah yang bisa membantu?

Pesan eror

➜  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.

Wadah 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

Selain itu, pembaruan apt-get gagal ketika saya memaksakan 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  
Thomas V.
sumber
Bagi saya, itu berhasil setelah restart.
ssi-anik

Jawaban:

64

Woo, saya menemukan posting di github yang menyelesaikan masalah saya.

Setelah Steve K. menunjukkan bahwa itu sebenarnya bukan masalah DNS dan masalah konektivitas, saya dapat menemukan posting di github yang menjelaskan cara memperbaiki masalah ini.

Rupanya jembatan jaringan docker0 ditutup. Menginstal bridge-utils dan menjalankan yang berikut ini membuat Docker saya berfungsi:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart
Thomas V.
sumber
1
Anda tidak perlu membatalkan gambar Anda. resolv.conf dihasilkan setiap kali Anda menjalankan kontainer baru. jadi Anda harus menghapus wadah lama dan mulai yang lain. Saya menemukan masalah ini kemarin. juga, jika Anda berada di intranet perusahaan, Anda dapat meneruskan --dns-search = your.company.domain ke daemon docker di / etc / default / docker di DOCKER_OPTS variabel env dekat flag --dns --dns.
Alexander.Iljushkin
Ini memperbaiki masalah buruh pelabuhan saya juga.
BobMcGee
3
Pada lengkungan linux saya membutuhkan ip link set down docker0bukan ifconfig docker0 downdan systemctl restart dockerbukannya service docker start. Untuk menghapus semua gambar, saya lakukandocker rmi $(docker images -q)
meshy
Itu berhasil pertama kali bagi saya. Lalu saya reboot, dan masalahnya muncul kembali: mereproduksi langkah-langkah itu tidak memperbaiki masalah lagi. Saya tidak tahu tentang apa ini.
user626921
1
Baru saja melihat bahwa antarmuka docker0 saya turun, saya dieksekusi /etc/init.d/docker restartdan itu kembali ke bisnis
lolesque
14

Jika ini masalah DNS resolver, berikut solusinya:

Hal pertama yang harus diperiksa adalah dijalankan cat /etc/resolv.confdalam wadah buruh pelabuhan . Jika memiliki server DNS yang tidak valid, seperti nameserver 127.0.x.x, maka wadah tidak akan dapat menyelesaikan nama domain menjadi alamat ip, sehingga ping google.comakan gagal.

Hal kedua yang perlu diperiksa dijalankan cat /etc/resolv.confpada mesin host . Docker pada dasarnya menyalin host /etc/resolv.confke wadah setiap kali wadah dimulai. Jadi, jika tuan rumah /etc/resolv.confsalah, maka wadah buruh pelabuhan juga akan demikian.

Jika Anda menemukan bahwa host /etc/resolv.confsalah, maka Anda memiliki 2 opsi:

  1. Hardcode server DNS di daemon.json. Ini mudah, tetapi tidak ideal jika Anda mengharapkan server DNS berubah.

  2. Perbaiki tuan rumah /etc/resolv.conf. Ini sedikit rumit, tetapi dihasilkan secara dinamis, dan Anda tidak melakukan hardcoding pada server DNS.


1. Server DNS hardcode di docker daemon.json

  • Sunting /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Mulai ulang daemon buruh pelabuhan agar perubahan tersebut diterapkan:
    sudo systemctl restart docker

  • Sekarang ketika Anda menjalankan / memulai sebuah wadah, buruh pelabuhan akan diisi /etc/resolv.confdengan nilai-nilai dari daemon.json.


2. Memperbaiki host /etc/resolv.conf

A. Ubuntu 16.04 dan sebelumnya

  • Untuk Ubuntu 16.04 dan sebelumnya, /etc/resolv.confsecara dinamis dihasilkan oleh NetworkManager.

  • Komentari baris dns=dnsmasq(dengan a #) di /etc/NetworkManager/NetworkManager.conf

  • Mulai kembali NetworkManager untuk membuat ulang /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Verifikasi pada tuan rumah: cat /etc/resolv.conf

B. Ubuntu 18.04 dan yang lebih baru

  • Ubuntu 18.04 diubah untuk digunakan systemd-resolveduntuk menghasilkan/etc/resolv.conf . Sekarang secara default menggunakan cache DNS lokal 127.0.0.53. Itu tidak akan berfungsi di dalam sebuah wadah, jadi Docker akan default ke server DNS 8.8.8.8 Google, yang mungkin rusak untuk orang-orang di belakang firewall.

  • /etc/resolv.confsebenarnya adalah symlink ( ls -l /etc/resolv.conf) yang menunjuk ke /run/systemd/resolve/stub-resolv.conf(127.0.0.53) secara default di Ubuntu 18.04.

  • Cukup ganti symlink ke point /run/systemd/resolve/resolv.conf, yang mencantumkan server DNS asli:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Verifikasi pada tuan rumah: cat /etc/resolv.conf

Sekarang Anda harus memiliki /etc/resolv.confhost pada docker yang sah untuk menyalin ke dalam wadah.

Wisbucky
sumber
Terima kasih untuk ini, benar-benar akan kehilangan akal saya mencoba memahami apa yang terjadi dengan kontainer buruh pelabuhan dan menyelesaikan 18,04 IP pada VPN. Memperbaiki /etc/resolv.conf untuk 18.04 bekerja untuk saya!
George Papas
opsi B bekerja untuk saya ..
codeSetter
Tentunya 2B tidak akan selamat dari pembaruan systemdpaket ...
Auspex
13

Dalam upaya menambahkan nilai tambahan ke masalah yang saya alami juga; dengan jawaban alternatif:

Jaringan saya terkait dengan kantor dan pengaturan Google DNS diblokir sehingga wadah dapat melakukan ping alamat IP tetapi bukan nama domain.

Tuan rumah saya /etc/resolv.confawalnya tampak seperti;

#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

Ini karena Network Manager melakukan semacam penyamaran dari detail server DNS.

Sayangnya menurut manual buruh pelabuhan buruh pelabuhan akan menyaring semua alamat IP host lokal ketika membangun resolv.conf wadah dan menggantinya dengan IP DNS Google. Yang dalam kasus saya menyebabkan nama domain menjadi terlarang.

Saya harus:

  • Setel ulang saya /etc/default/dockerke default sehingga wadah menggunakan konten resolv.conf host saya sebagai gantinya.
  • Edit /etc/NetworkManager/NetworManager.confdan komentari barisnya dns=dnsmasq. Ini agar NM dapat menentukan alamat IP DNS yang sebenarnya, bukan 127.0.0.1.
  • Mulai ulang NM dengan sudo service network-manager restart.
  • Mulai ulang layanan buruh pelabuhan dengan sudo service docker restart.

Menjalankan wadah akan memungkinkannya untuk dilakukan apt-get update/upgrade, misalnya.

David 'the botak jahe'
sumber
3
Ini sebenarnya bekerja untuk saya. Dan saya berada di belakang intranet perusahaan
Daniel Andrei Mincă
1
Solusi ini sangat bagus untuk Ubuntu 16.04 dan sebelumnya. Untuk Ubuntu 18.04 dan yang lebih baru, lihat serverfault.com/a/918568
wisbucky
Terima kasih! Ini berhasil, sedangkan jawaban yang diterima tidak. :)
Devolus
8

Kesalahan Anda ada di sini:

 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]

Ini bukan kesalahan dengan DNS, sebaliknya sistem Anda mencoba untuk terhubung ke host IPv6 dan gagal. Mungkin karena Anda tidak memiliki akses IPv6 di host Anda. Pencarian alamat IPv6 yang sebenarnya berhasil. (Cermin / arsip ubuntu tersedia untuk IPv6 dan IPv4. Anda cukup beruntung untuk mendapatkan IPv6 karena sistem Anda yakin itu harus berfungsi.)

Anda harus memperbaikinya, dengan menginstal miredo , atau coba lagi hingga mencapai mirror IPv4 Anda.

Sekali lagi hal penting untuk disadari di sini adalah bahwa DNS tidak dapat disalahkan, seperti yang Anda lihat dengan tes ping Anda sendiri.


sumber
1
Terima kasih atas balasan cepat dan menjelaskan bahwa ini sebenarnya bukan masalah DNS, saya menghargainya. Saya menginstal miredo - jangan pergi. Perlu juga dicatat bahwa ketika saya menjalankan pembaruan apt-get -o Acquire :: ForceIPv4 = true pembaruan apt-get masih gagal, saya telah memperbarui posting asli saya dengan balasan itu. Saya sudah mencoba menonaktifkan UFW dengan berpikir mungkin itu masalahnya, dan masih belum beruntung.
Thomas V.
Aneh - Anda dapat melihat Anda memiliki konektivitas IPv4 karena ping Anda berhasil. Tetapi Anda tidak dapat terhubung ke mirror terlepas dari saran Anda memiliki beberapa masalah routing / jaringan yang aneh (yang saya duga adalah alasan Anda memposting di sini!)
8

Dok resmi Docker memberikan instrumen untuk mengonfigurasi server DNS untuk digunakan oleh Docker

  1. Buka /etc/default/dockerfile untuk diedit:

    sudo nano /etc/default/docker
    
  2. Tambahkan pengaturan untuk Docker:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. Ganti 8.8.8.8dengan server DNS lokal seperti 192.168.1.1. Anda juga dapat menentukan beberapa server DNS. Pisahkan dengan spasi, misalnya:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    Peringatan: Jika Anda melakukan ini pada laptop yang terhubung ke berbagai jaringan, pastikan untuk memilih server DNS publik.

    PS: nm-tooldapat digunakan untuk memeriksa server DNS host lokal

  4. Simpan dan tutup file.

  5. Mulai kembali daemon Docker.

    sudo service docker restart
    
tryer3000
sumber
Perhatikan bahwa ini file konfigurasi lama untuk Docker Upstart dan SysVinit. Cara saat ini untuk systemd (sejak Ubuntu 16.04) adalah menggunakan /etc/docker/daemon.jsonuntuk pengaturan daemon buruh pelabuhan seperti dns.
wisbucky
0

Untuk pembaca lain yang datang ke sini saat menggunakan boot2docker, inilah cara saya memperbaikinya. Sebenarnya, jawaban di atas menunjuk saya ke arah yang benar.

Pada dasarnya, untuk beberapa alasan, wadah di dalam boot2docker tidak dapat menyelesaikan nama host.

Jadi saya baru saja me-restart boot2docker dan memulai wadah. Sekarang nama host dapat diselesaikan dengan benar lagi.

Saya kira masalahnya mulai boot2docker sementara jaringan pada host sedang terhubung yang menyebabkan boot2docker untuk memulai dan masuk ke keadaan tidak bekerja.

Mata
sumber
0

Saya memiliki masalah yang sama pada Windows. Perintah ini membuatnya bekerja untuk saya:docker-machine restart

speedplane
sumber
0

Mulai ulang daemon Docker di Debian9

service docker restart

dan koneksi dan jaringan berfungsi dengan baik

Nolwennig
sumber
-1

Punya masalah serupa, tetapi juga penyelesaian nama antara kontainer di dalam jaringan yang ditentukan Pengguna tampaknya agak serpihan. Beberapa tidak bisa menyelesaikan apa pun seperti Anda.

Masalahnya adalah pindah / var / lib / docker. Untuk alasan ruang itu dipasang melalui nfs. Menambahkan sistem file lokal dan memindahkan file di sana menyelesaikan masalah.

michi.0x5d
sumber
Jika menurut Anda pertanyaan dapat dijawab dengan jawaban untuk pertanyaan serupa, tandai sebagai duplikat dari pertanyaan itu. Jika Anda tidak bisa melakukan itu, Anda harus meninggalkan komentar daripada membuatnya menjadi jawaban yang terpisah.
Jenny D berkata Reinstate Monica