Kontainer Docker tidak dapat menyelesaikan DNS pada Host Desktop Ubuntu 14.04

Saya mengalami masalah dengan wadah buruh pelabuhan 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. Output kesalahan di bawah ini awalnya membuat saya percaya itu karena apt-get mencoba menyelesaikan DNS melalui IPv6.

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

Saya mengubah/etc / resolve saya.server nama conf dari server DNS lokal saya ke server DNS Publik Google (8.8.8.8 dan 8.8.4.4) dan masih tidak beruntung. Saya juga mengatur DNS ke Google di DOCKER_OPTS dari /etc/default/docker dan memulai ulang docker.

Saya juga mencoba menarik coreos, dan yum juga tidak dapat menyelesaikan DNS.

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

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

Saya telah meneliti ini secara menyeluruh melalui posting lain tentang masalah stackoverflow dan github, tetapi belum menemukan resolusi apa pun. Aku kehabisan ide tentang bagaimana untuk memecahkan masalah ini, ada yang bisa membantu?

Pesan Kesalahan

➜  arthouse git:(docker) ✗ docker build --no-cache .Sending build context to Docker daemon 51.03 MBSending build context to Docker daemon Step 0 : FROM ubuntu:14.04 ---> 5506de2b643bStep 1 : RUN apt-get update ---> Running in 845ae6abd1e0Err http://archive.ubuntu.com trusty InReleaseErr http://archive.ubuntu.com trusty-updates InReleaseErr 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.

Kontainer IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bashroot@7bc182bf87bb:/# ifconfigeth0      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.comPING 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 0msrtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 msroot@7bc182bf87bb:/# ping 8.8.8.8PING 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 ms64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

Juga, pembaruan apt-get gagal ketika saya memaksa IPv4:

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=trueErr http://archive.ubuntu.com trusty InReleaseErr http://archive.ubuntu.com trusty-updates InReleaseErr http://archive.ubuntu.com trusty-security InReleaseErr http://archive.ubuntu.com trusty-proposed InReleaseErr 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... DoneW: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  

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

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

Rupanya jembatan jaringan docker0 digantung. Menginstal bridge-utils dan menjalankan yang berikut membuat buruh pelabuhan saya berfungsi dengan baik:

apt-get install bridge-utilspkill dockeriptables -t nat -Fifconfig docker0 downbrctl delbr docker0service docker restart

Jika ini adalah masalah DNS resolver, inilah solusinya:

Hal pertama untuk memeriksa dijalankan cat /etc/resolv.conf dalam docker container. Jika memiliki server DNS yang tidak valid, seperti nameserver 127.0.x.x, maka wadah tidak akan dapat menyelesaikan nama domain menjadi alamat ip, jadi ping google.com akan gagal.

Hal kedua untuk memeriksa dijalankan cat /etc/resolv.conf pada mesin host. Docker pada dasarnya menyalin host /etc/resolv.conf ke wadah setiap kali wadah dimulai. Jadi jika tuan rumah /etc/resolv.conf salah, maka begitu juga wadah buruh pelabuhan.

Jika Anda telah menemukan bahwa host /etc/resolv.conf salah, maka Anda memiliki 2 pilihan:

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

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


1. Server DNS Hardcode di Daemon docker.json

  • Edit /etc/docker/daemon.json

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

  • Sekarang ketika Anda menjalankan / memulai wadah, docker akan mengisi /etc/resolv.conf dengan nilai-nilai dari daemon.json.


2. Perbaiki host /etc/resolv.conf

A. Ubuntu 16.04 dan sebelumnya

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

  • Komentar keluar baris dns=dnsmasq (dengan a #) dalam /etc/NetworkManager/NetworkManager.conf

  • Restart NetworkManager untuk regenerasi /etc/resolv.conf :
    sudo systemctl restart network-manager

  • Verifikasi pada host: cat /etc/resolv.conf

B. Ubuntu 18.04 dan yang lebih baru

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

  • /etc/resolv.conf sebenarnya 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.

  • Hanya mengubah symlink untuk menunjuk ke /run/systemd/resolve/resolv.conf, yang mencantumkan server DNS asli:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Verifikasi pada host: cat /etc/resolv.conf

Sekarang Anda harus memiliki valid /etc/resolv.conf pada host untuk docker untuk menyalin ke dalam wadah.

Dalam upaya untuk menambah nilai tambah pada masalah yang juga saya alami; dengan jawaban alternatif:

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

Tuan rumah saya /etc/resolv.conf awalnya 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 OVERWRITTENnameserver 127.0.1.1search companyDomain.co.za

Hal ini disebabkan Network Manager melakukan semacam masking rincian server DNS.

Sayangnya menurut docker manual docker akan memfilter alamat IP localhost apa pun saat membuat resolv penampung.conf dan menggantinya dengan IP DNS Google. Yang dalam kasus saya menyebabkan nama domain menjadi terlarang.

Saya harus:

  • Reset saya /etc/default/docker untuk default jadi kontainer menggunakan resolv host saya.konten conf sebagai gantinya.
  • Edit /etc/NetworkManager/NetworManager.conf dan komentar keluar baris dns=dnsmasq. Ini agar NM dapat menentukan alamat IP DNS yang sebenarnya, bukan 127.0.0.1.
  • Restart NM dengan sudo service network-manager restart.
  • Mulai ulang layanan docker dengan sudo service docker restart.

Menjalankan wadah kemudian akan memungkinkan untuk melakukan apt-get update/upgrade, misalnya.

Docker resmi doc memberikan instrumen untuk mengkonfigurasi server DNS untuk digunakan oleh Docker

  1. Buka /etc/default/docker file untuk diedit:

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

    DOCKER_OPTS="--dns 8.8.8.8"
  3. Ganti 8.8.8.8 dengan server DNS lokal seperti 192.168.1.1. Anda bisajuga menentukan beberapa server DNS. Memisahkannya 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-tool dapat digunakan untuk memeriksa server DNS host lokal

  4. Simpan dan tutup file.

  5. Mulai ulang Daemon buruh pelabuhan.

    sudo service docker restart

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, melainkan sistem Anda mencoba terhubung ke host IPv6 dan gagal . Mungkin karena Anda tidak memiliki akses IPv6 di host Anda. Pencarian sebenarnya dari alamat IPv6 berhasil. (Cermin/arsip ubuntu tersedia melalui IPv6 dan IPv4. Anda hanya cukup beruntung untuk memukul satu IPv6 karena sistem Anda percaya itu harus bekerja.)

Anda harus memperbaikinya, dengan instalasi miredo, atau coba lagi sampai Anda mencapai cermin IPv4.

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

Untuk pembaca lain yang datang ke sini saat menggunakan boot2docker, di sini adalah bagaimana saya tetap. Sebenarnya, jawaban di atas mengarahkan saya ke arah yang benar.

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

Jadi saya baru saja memulai ulang boot2docker dan memulai wadah. Sekarang nama host dapat menyelesaikan dengan benar lagi.

Saya kira masalahnya adalah memulai boot2docker saat jaringan pada host sedang terhubung yang menyebabkan boot2docker untuk memulai dan masuk ke dalam keadaan tidak berfungsi.

Saya mengalami masalah ini ketika saya mengizinkan penginstal Ubuntu untuk menginstal paket Snap Docker. Ketika saya membuangnya dan beralih ke paket buruh pelabuhan resmi, masalahnya teratasi dengan sendirinya.

sudo snap remove dockercurl -fsSL https://get.docker.com -o get-docker.shsh get-docker.sh

Buka berkas /lib/systemd/system/docker.service

Di ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.socktambah
--dns 8.8.8.8

Seperti ini:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --dns 8.8.8.8

Mulai ulang layanan docker

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

Memiliki masalah serupa, tetapi juga penyelesaian Nama antara wadah di dalam jaringan yang ditentukan pengguna tampaknya agak serpihan. Beberapa tidak bisa menyelesaikan sesuatu seperti Anda.

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

Bagi saya, itu berhasil setelah restart.