Saya sudah membuatnya berfungsi dengan baik tetapi sekarang berhenti. Saya mencoba perintah berikut tetapi tidak berhasil:
docker run -dns 8.8.8.8 base ping google.com
docker run base ping google.com
sysctl -w net.ipv4.ip_forward=1
- baik di inang maupun di wadah
Yang saya dapatkan hanyalah unknown host google.com
. Docker versi 0.7.0
Ada ide?
PS ufw
dinonaktifkan juga
sysctl -w net.ipv4.ip_forward=1
(di Centos 6)sysctl -w net.ipv4.ip_forward=1
/etc/resolv.conf
di tuan rumah mesinsysctl -w net.ipv4.ip_forward=1
aku harus larisudo service docker restart
.Jawaban:
Hal pertama yang harus diperiksa adalah dijalankan
cat /etc/resolv.conf
di kontainer buruh pelabuhan . Jika memiliki server DNS yang tidak valid, sepertinameserver 127.0.x.x
, penampung tidak akan dapat menyelesaikan nama domain menjadi alamat ip, sehinggaping google.com
akan gagal.Hal kedua yang harus diperiksa adalah dijalankan
cat /etc/resolv.conf
pada mesin host . Docker pada dasarnya menyalin host/etc/resolv.conf
ke container setiap kali container dimulai. Jadi jika host/etc/resolv.conf
salah, maka kontainer buruh pelabuhan juga.Jika Anda menemukan bahwa host
/etc/resolv.conf
salah, maka Anda memiliki 2 opsi:Buat kode keras 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 dibuat secara dinamis, dan Anda tidak melakukan hardcode server DNS.1. Hardcode DNS server 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 kontainer, buruh pelabuhan akan mengisi
/etc/resolv.conf
dengan nilai daridaemon.json
.2. Perbaiki host
/etc/resolv.conf
A. Ubuntu 16.04 dan sebelumnya
Untuk Ubuntu 16.04 dan sebelumnya,
/etc/resolv.conf
dibuat secara dinamis oleh NetworkManager.Komentari baris
dns=dnsmasq
(dengan#
) masuk/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 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.Ubah saja symlink untuk menunjuk
/run/systemd/resolve/resolv.conf
, yang mencantumkan server DNS yang sebenarnya:sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Verifikasi pada tuan rumah:
cat /etc/resolv.conf
Sekarang Anda harus memiliki valid
/etc/resolv.conf
pada host untuk buruh pelabuhan untuk disalin ke dalam wadah.sumber
systemctl
(Ubuntu 14.04) coba Bagaimana cara memulai ulang layanan jaringan? dan / atau restart komputer Anda./etc/resolv.conf
ke wadah pada konstruksi, saya harus menyalin file secara manual ke dalam wadah.Diperbaiki dengan mengikuti saran ini:
https://github.com/dotcloud/docker/issues/866#issuecomment-19218300
Tampaknya antarmuka 'digantung' entah bagaimana.
Pembaruan untuk versi buruh pelabuhan yang lebih baru:
Jawaban di atas mungkin masih menyelesaikan pekerjaan untuk Anda tetapi sudah cukup lama sejak jawaban ini diposting dan pekerja galangan lebih dipoles sekarang jadi pastikan Anda mencoba ini terlebih dahulu sebelum membahas
iptables
dan semua.sudo service docker restart
atau (jika Anda menggunakan distro linux yang tidak menggunakan pemula)sudo systemctl restart docker
sumber
docker -d
gagal. Tidak ada-d
bendera.ip link del docker0
docker -d
tidak ada di versi yang lebih baru. Sebaliknya:,service docker stop
laludockerd
,service docker start
Cara yang dimaksudkan untuk me-restart buruh pelabuhan tidak melakukannya secara manual tetapi menggunakan perintah
service
atau init:sumber
systemctl enable docker
)Memperbarui pertanyaan ini dengan jawaban untuk OSX (menggunakan Mesin Docker)
Jika Anda menjalankan Docker di OSX menggunakan Mesin Docker, maka yang berikut ini berhasil untuk saya:
Kemudian (setidaknya menurut pengalaman saya), jika Anda melakukan ping ke google.com dari penampung semuanya akan baik-baik saja.
sumber
Saya tidak tahu apa yang saya lakukan tetapi itu berhasil untuk saya:
sumber
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
. Anda dapat memeriksa apakah Anda memiliki aturan ini denganiptables -t nat -L POSTROUTING
Saya menggunakan
DOCKER_OPTS="--dns 8.8.8.8"
dan kemudian menemukan dan bahwa wadah saya tidak memiliki akses langsung ke internet tetapi dapat mengakses intranet perusahaan saya. Saya berubahDOCKER_OPTS
menjadi yang berikut:mengganti
internal_corporate_dns_address
dengan alamat IP atau FQDN dari DNS kami dan restart buruh pelabuhan menggunakandan kemudian menelurkan container saya dan memeriksa apakah ia memiliki akses ke internet.
sumber
Saya bingung ketika ini terjadi secara acak untuk salah satu wadah saya, sementara wadah lainnya baik-baik saja. Penampung dipasang ke setidaknya satu jaringan non-internal , jadi tidak ada yang salah dengan
Compose
definisinya. Memulai ulang daemon VM / buruh pelabuhan tidak membantu. Itu juga bukan masalah DNS karena penampung tidak bisa bahkanping
IP eksternal. Apa yang memecahkannya bagi saya adalah membuat ulang jaringan buruh pelabuhan. Dalam kasus saya,docker-compose down && docker-compose up
berhasil.Menyusun
Ini memaksa rekreasi semua jaringan semua kontainer:
docker-compose down
&&docker-compose up
Mode kawanan
Saya kira Anda baru saja menghapus dan membuat ulang layanan, yang membuat ulang jaringan layanan:
docker service rm some-service
docker service create ...
Jika jaringan penampung adalah eksternal
Cukup hapus dan buat ulang jaringan eksternal layanan itu:
docker network rm some-external-network
docker network create some-external-network
sumber
Bagi saya itu adalah firewall tuan rumah. Saya harus mengizinkan DNS di firewall host. Dan juga harus me-restart buruh pelabuhan setelah mengubah pengaturan firewall host.
sumber
sudo service iptables stop
dansudo chkconfig iptables off
(di CentOS / RHEL).Tidak ada akses internet juga dapat disebabkan oleh pengaturan proxy yang hilang . Dalam hal ini,
--network host
mungkin tidak berhasil. Proksi dapat dikonfigurasi dengan mengatur variabel lingkunganhttp_proxy
danhttps_proxy
:Jangan lupa untuk mengatur no_proxy juga, atau semua permintaan (termasuk yang ke localhost) akan melalui proxy.
Informasi lebih lanjut: Pengaturan Proxy di Archlinux Wiki.
sumber
bagi saya, masalah saya adalah karena iptables-services tidak diinstal, ini berfungsi untuk saya (CentOS):
sumber
Pada centos 8, Masalah saya adalah saya tidak menginstal & memulai iptables sebelum memulai layanan buruh pelabuhan. Pastikan layanan iptables sudah aktif dan berjalan sebelum Anda memulai layanan buruh pelabuhan.
sumber
Bagi saya itu adalah aturan penerusan iptables. Untuk beberapa alasan, aturan berikut, jika digabungkan dengan aturan iptables buruh pelabuhan, menyebabkan semua lalu lintas keluar dari kontainer terkena
localhost:8080
:sumber
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sebagai baris terakhir, setelah default (iptables -P INPUT DROP
dll). Tidak ada OUTPUT ... garis REDIRECT.Saya mengalami masalah di Ubuntu 18.04. Namun masalahnya ada pada DNS. Saya berada di jaringan perusahaan yang memiliki server DNS sendiri dan memblokir server DNS lain. Ini untuk memblokir beberapa situs web (porno, torrent, ... dll.)
Untuk mengatasi masalah Anda
gunakan --dns your_dns seperti yang disarankan oleh @jobin
docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash
sumber
Di windows (8.1) saya mematikan antarmuka kotak virtual (melalui taskmgr) dan itu menyelesaikan masalah.
sumber
Anda mungkin telah memulai buruh pelabuhan Anda dengan opsi dns
--dns 172.x.x.x
Saya mengalami kesalahan yang sama dan menghapus opsi dari
/etc/default/docker
Garis:
sumber
Awalnya kontainer buruh pelabuhan saya dapat menjangkau internet eksternal (Ini adalah layanan / kontainer buruh pelabuhan yang berjalan di Amazon EC2).
Karena aplikasi saya adalah API, saya menindaklanjuti pembuatan penampung saya (berhasil menarik semua paket yang diperlukan) dengan memperbarui Tabel IP saya untuk merutekan semua lalu lintas dari port 80 ke port yang API saya (berjalan di buruh pelabuhan) sebelumnya mendengarkan.
Kemudian, ketika saya mencoba membangun kembali kontainer itu gagal. Setelah banyak perjuangan, saya menemukan bahwa langkah saya sebelumnya (mengatur aturan penerusan port IPTable) mengacaukan kemampuan jaringan eksternal buruh pelabuhan.
Solusi: Hentikan layanan IPTable Anda:
sudo service iptables stop
Mulai ulang Daemon Docker:
sudo service docker restart
Kemudian, coba buat kembali wadah Anda. Semoga ini membantu.
Mengikuti
Saya benar-benar mengabaikan bahwa saya tidak perlu mengotak-atik Tabel IP untuk meneruskan lalu lintas masuk ke 80 ke port tempat API yang berjalan di buruh pelabuhan sedang berjalan. Sebagai gantinya, saya hanya menggunakan alias port 80 ke port yang API di docker sedang berjalan:
docker run -d -p 80:<api_port> <image>:<tag> <command to start api>
sumber
Untuk Ubuntu 19.04 yang menggunakan openconnect 8.3 untuk VPN, saya harus menghubungkan /etc/resolve.conf ke yang ada di systemd (kebalikan dari menjawaberby wisbucky)
sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf
Langkah-langkah untuk men-debug
Versi Docker: Versi Docker 19.03.0-rc2, build f97efcc
sumber
Jika Anda menggunakan OSX, Anda mungkin perlu memulai ulang mesin Anda setelah menginstal Docker. Ini terkadang menjadi masalah.
sumber
Cukup tambahkan ini di sini jika seseorang mengalami masalah ini dalam wadah virtualbox yang menjalankan buruh pelabuhan. Saya mengkonfigurasi ulang jaringan virtualbox untuk menjembatani bukan nat, dan masalahnya hilang.
sumber
Saya juga mengalami masalah seperti itu saat mencoba menyiapkan proyek menggunakan Docker-Compose di Ubuntu.
Docker tidak memiliki akses ke internet sama sekali, ketika saya mencoba untuk melakukan ping alamat IP atau nslookup beberapa URL - itu gagal sepanjang waktu.
Saya mencoba semua solusi yang mungkin dengan resolusi DNS yang dijelaskan di atas tetapi tidak berhasil.
Saya menghabiskan sepanjang hari mencoba mencari tahu apa yang sedang terjadi, dan akhirnya menemukan bahwa penyebab semua masalah adalah antivirus, khususnya firewall yang karena alasan tertentu memblokir Docker untuk mendapatkan alamat IP dan port.
Ketika saya menonaktifkannya - semuanya bekerja dengan baik.
Jadi, jika Anda memasang antivirus dan tidak ada yang membantu memperbaiki masalah - masalahnya mungkin firewall antivirus.
sumber
Saya mengalami masalah serupa selama beberapa hari terakhir. Bagi saya penyebabnya adalah kombinasi dari systemd, buruh pelabuhan dan penyedia hosting saya. Saya menjalankan CentOS terbaru (7.7.1908).
Penyedia hosting saya secara otomatis membuat file konfigurasi untuk systemd-networkd. Dimulai dengan systemd 219 yang merupakan versi saat ini untuk CentOS 7, systemd-networkd mengambil kendali parameter sysctl terkait jaringan. Docker tampaknya tidak kompatibel dengan versi ini dan akan menyetel ulang tanda Penerusan IP setiap kali container diluncurkan.
Solusi saya adalah untuk menambahkan
IPForward=true
dalam[Network]
-bagian dari penyedia dihasilkan file konfigurasi saya. File ini mungkin ada di beberapa tempat, kemungkinan besar di/etc/systemd/network
.Prosesnya juga dijelaskan dalam dokumen resmi buruh pelabuhan: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems
sumber
/usr/lib/sysctl.d/50-default.conf
tetapi sintaksnya berbeda./etc/systemd/network/10-mainif.network
untuk saya. Tempat lain yang mungkin Anda periksa adalah/usr/local/lib/systemd/
dan/usr/lib/systemd/
sesuai halaman manual systemd.bagi saya, menggunakan centos 7.4, itu bukan masalah /etc/resolve.conf, iptables, iptables nat rules atau docker itu sendiri. Masalahnya adalah host tidak memiliki paket bridge-utils yang dibutuhkan buruh pelabuhan untuk membangun jembatan menggunakan perintah brctl. yum install -y bridge-utils dan restart buruh pelabuhan, selesaikan masalah.
sumber