Tidak ada koneksi internet di dalam wadah Docker

24

Saya tidak dapat menjalankan perintah apa pun yang membutuhkan koneksi internet di dalam wadah Docker.

Bekerja:

docker run ubuntu /bin/echo 'Hello world'

Tidak bekerja:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

Mirip dengan pipdan ping.

Saya di Ubuntu 16.04 dan tidak menggunakan firewall atau server proxy perusahaan dan telah mencoba untuk me-restart Docker.

Pembaruan:

Pembaruan dalam mode interaktif gagal dengan cara yang sama.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update berjalan dengan sukses di host, yaitu di komputer saya di luar buruh pelabuhan.

Upd Docker versi 1.12.1, bangun 23cf638

Sashko Lykhenko
sumber
Bisakah Anda melakukan ping domain dari host? Bisakah Anda menjalankannya apt-get updatedalam mode interaktif dengan buruh pelabuhan?
adampski
output menunjukkan kesalahan: Kegagalan sementara menyelesaikan 'archive.ubuntu.com' ... coba .. ping www.google.com .. lihat apakah Anda mendapatkan respons yang sama .. maka coba ... ping 8.8.8.8 .. jika IP bekerja, dan nama host tidak maka DNS Anda rusak (lebih /etc/resolv.conf untuk melihat server DNS apa yang sedang digunakan)
TG2
@adampski, saya memperbarui pertanyaan berdasarkan saran Anda.
Sashko Lykhenko
@ TG2, saya memperbarui pertanyaan berdasarkan saran Anda juga.
Sashko Lykhenko
Apa versi mesin docker yang Anda jalankan?
adampski

Jawaban:

13

Seperti yang disarankan oleh creack pada masalah GitHub # 866 untuk Docker :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Ini akan memaksa buruh pelabuhan untuk membuat ulang jembatan dan menginstal ulang semua aturan jaringan"

adampski
sumber
1
Saya mencobanya, dan ini membunuh jaringan di seluruh komputer saya.
petersohn
Ini membantu dan menyelesaikan masalah bagi saya. Terima kasih.
Rao
10
The -dBendera tidak keluar.
Luís de Sousa
2
Hai @ LuísdeSousa sayang sekali Anda memilih ini, tetapi pertimbangkan kemungkinan bahwa beberapa sakelar dihapus atau diubah dalam rilis yang lebih baru. Terutama karena ini lebih dari setahun yang lalu.
adampski
3
alih-alih hanya menyalin / melewati perintah Anda bisa menjelaskan apa artinya ini :)
Adelin
12

Ada masalah serupa di StackOverflow di mana solusi yang berbeda menyelesaikan masalah ini dengan Docker 17.09 di Ubuntu 16.04:

Periksa isi resolv.conf:

$ cat /etc/resolv.conf

Jika itu termasuk garis seperti nameserver 127.0.1.1itu berarti kontainer mendapatkan server nama yang salah. Untuk memperbaiki ini edit NetworkManager.conffile:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

Dan mengomentari baris dengan dns=dnsmasq; file akan terlihat seperti ini:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Terakhir, restart manajer jaringan:

$ sudo systemctl restart network-manager

Tes lagi wadahnya:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Luís de Sousa
sumber
Instalasi saya cocok dengan deskripsi dan pendekatan di atas menyelesaikan masalah untuk saya.
krcools
jawaban yang diperbarui untuk Ubuntu 18.04: superuser.com/a/1335054
wisbucky
7

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, jadi 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

  • Edit /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 ulang 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