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 pip
dan 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
networking
ubuntu
docker
Sashko Lykhenko
sumber
sumber
apt-get update
dalam mode interaktif dengan buruh pelabuhan?Jawaban:
Seperti yang disarankan oleh creack pada masalah GitHub # 866 untuk Docker :
"Ini akan memaksa buruh pelabuhan untuk membuat ulang jembatan dan menginstal ulang semua aturan jaringan"
sumber
-d
Bendera tidak keluar.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
:Jika itu termasuk garis seperti
nameserver 127.0.1.1
itu berarti kontainer mendapatkan server nama yang salah. Untuk memperbaiki ini editNetworkManager.conf
file:Dan mengomentari baris dengan
dns=dnsmasq
; file akan terlihat seperti ini:Terakhir, restart manajer jaringan:
Tes lagi wadahnya:
sumber
Hal pertama yang harus diperiksa adalah dijalankan
cat /etc/resolv.conf
dalam wadah buruh pelabuhan . Jika memiliki server DNS yang tidak valid, sepertinameserver 127.0.x.x
, maka wadah tidak akan dapat menyelesaikan nama domain menjadi alamat ip, jadiping google.com
akan gagal.Hal kedua yang perlu diperiksa 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 wadah buruh pelabuhan juga akan demikian.Jika Anda menemukan bahwa host
/etc/resolv.conf
salah, maka Anda memiliki 2 opsi:Hardcode server DNS di daemon.json. Ini mudah, tetapi tidak ideal jika Anda mengharapkan server DNS berubah.
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
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.conf
dengan nilai-nilai daridaemon.json
.2. Memperbaiki host
/etc/resolv.conf
A. Ubuntu 16.04 dan sebelumnya
Untuk Ubuntu 16.04 dan sebelumnya,
/etc/resolv.conf
secara 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-resolved
untuk 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.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.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.conf
host pada docker yang sah untuk menyalin ke dalam wadah.sumber