Kontainer buruh pelabuhan saya tidak memiliki internet

153

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 ufwdinonaktifkan juga

Romeo Mihalcea
sumber
9
Pertanyaan Anda memperbaiki masalah saya: harus berjalan sysctl -w net.ipv4.ip_forward=1(di Centos 6)
qwertzguy
Karena Anda mungkin memiliki masalah dengan perutean docker dns, periksa solusi serupa stackoverflow.com/questions/35515203/…
Aditya Kresna Permana
Sama di sini, setelah saya memperbaiki /etc/resolv.conf di kotak host, itu tidak akan berfungsi tanpanyasysctl -w net.ipv4.ip_forward=1
Reeebuuk
Juga memeriksa bahwa Anda memiliki nilai yang benar untuk /etc/resolv.confdi tuan rumah mesin
Hanxue
untukku setelah sysctl -w net.ipv4.ip_forward=1aku harus lari sudo service docker restart.
Asif Ali

Jawaban:

117

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

Hal kedua yang harus diperiksa adalah dijalankan cat /etc/resolv.confpada mesin host . Docker pada dasarnya menyalin host /etc/resolv.confke container setiap kali container dimulai. Jadi jika host /etc/resolv.confsalah, maka kontainer buruh pelabuhan juga.

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

  1. Buat kode keras 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 dibuat secara dinamis, dan Anda tidak melakukan hardcode server DNS.


1. Hardcode DNS server 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 kontainer, buruh pelabuhan akan mengisi /etc/resolv.confdengan nilai dari daemon.json.


2. Perbaiki host /etc/resolv.conf

A. Ubuntu 16.04 dan sebelumnya

  • Untuk Ubuntu 16.04 dan sebelumnya, /etc/resolv.confdibuat 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-resolveduntuk 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.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.

  • 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.confpada host untuk buruh pelabuhan untuk disalin ke dalam wadah.

bijak
sumber
1
Ini memecahkan masalah di Ubuntu 16.04 dengan Docker 17.09.
Luís de Sousa
2
Ini menyelesaikan masalah saya (sama seperti OP, Ubuntu 14.04 / Docker 18.01.0-ce). Link ini dapat berguna untuk menguji koneksi internet tanpa ping jika Anda tidak memiliki perintah ping pada image buruh pelabuhan Anda. Jika host Anda tidak memiliki systemctl(Ubuntu 14.04) coba Bagaimana cara memulai ulang layanan jaringan? dan / atau restart komputer Anda.
Benjamin
Bekerja seperti pesona!
Homewrecker
1
Ini berfungsi di Ubuntu 18.04 (opsi B). Namun buruh pelabuhan tidak mentransfer sekarang benar /etc/resolv.confke wadah pada konstruksi, saya harus menyalin file secara manual ke dalam wadah.
glaux
1
Di komputer saya (RedHat 7.4) file konfigurasi host sudah benar, tetapi file kontainer masih mengarah ke 172.0.0.11. Jadi apa yang harus dilakukan sekarang?
Martin Majewski
96

Diperbaiki dengan mengikuti saran ini:

[...] dapatkah Anda mencoba mengatur ulang semuanya?

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

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

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 iptablesdan semua.

sudo service docker restart atau (jika Anda menggunakan distro linux yang tidak menggunakan pemula) sudo systemctl restart docker

Romeo Mihalcea
sumber
34
docker -dgagal. Tidak ada -dbendera.
Luís de Sousa
1
Bagi mereka yang masih mengalami masalah, ada masalah terbuka di github Moby yang telah dibuka selama lebih dari setahun sekarang: github.com/moby/moby/issues/26567
Nepoxx
1
@Pawan:ip link del docker0
dr.drawrockshard
1
atau pasang bridge-utils
cjdcordeiro
9
docker -dtidak ada di versi yang lebih baru. Sebaliknya:, service docker stoplalu dockerd,service docker start
Telmo Marques
66

Cara yang dimaksudkan untuk me-restart buruh pelabuhan tidak melakukannya secara manual tetapi menggunakan perintah serviceatau init:

service docker restart
bitmask
sumber
5
jika Anda berada di distro linux yang tidak menggunakan pemula, sudo systemctl restart docker berfungsi untuk saya
jeffrey
memulai ulang bekerja dengan baik. Saya tidak tahu apakah ini ada hubungannya dengan fakta bahwa saya mengaktifkannya untuk "mulai otomatis" ( systemctl enable docker)
Lucas Pottersky
Sepertinya tidak relevan dengan pertanyaan OP.
Kevin Buchs
Agak demikian, karena dalam situasi yang dijelaskan OP, mengatur ulang buruh pelabuhan akan mengaktifkan kembali antarmuka jaringan, sehingga mengaktifkan kembali akses internet. Memang benar bahwa ini tidak membahas MENGAPA kadang rusak, tetapi memberikan solusi untuk masalah tersebut.
bitmask
Tetapi dalam lingkungan produksi, restart buruh pelabuhan tidak mungkin. Bagaimana cara mengatasi masalah pada kasus ini?
Suyanhanx
22

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:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

Kemudian (setidaknya menurut pengalaman saya), jika Anda melakukan ping ke google.com dari penampung semuanya akan baik-baik saja.

kiri
sumber
Juga bekerja di windows untuk mendapatkan akses jaringan berfungsi kembali.
Mikael Lepistö
1
Itu berhasil untuk saya. Saya memiliki ikon buruh pelabuhan di bilah menu atas, di menu saya memiliki opsi "mulai ulang". Setelah itu, jaringan kembali baik-baik saja
olidem
8

Saya tidak tahu apa yang saya lakukan tetapi itu berhasil untuk saya:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start
dctremblay.dll
sumber
2
lakban yang bagus!
dctremblay
1
Jawaban Anda membantu memecahkan masalah serupa. Saya menghabiskan waktu berjam-jam untuk itu! Setelah instalasi Kubespray yang tidak lengkap, kontainer Docker kehilangan internet dengan pesan "Pemecahan kegagalan sementara" saat mencoba melakukan ping ke host publik atau IP manapun. Jadi saya tidak memiliki aturan ini yang wajib - 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
laimison
6

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 berubah DOCKER_OPTSmenjadi yang berikut:

DOCKER_OPTS="--dns <internal_corporate_dns_address"

mengganti internal_corporate_dns_addressdengan alamat IP atau FQDN dari DNS kami dan restart buruh pelabuhan menggunakan

sudo service docker restart

dan kemudian menelurkan container saya dan memeriksa apakah ia memiliki akses ke internet.

jobin
sumber
5

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 Composedefinisinya. Memulai ulang daemon VM / buruh pelabuhan tidak membantu. Itu juga bukan masalah DNS karena penampung tidak bisa bahkan pingIP 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

LJ
sumber
4

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.

Adrian Gunawan
sumber
Atau Anda dapat menonaktifkan iptables dengan sudo service iptables stopdan sudo chkconfig iptables off(di CentOS / RHEL).
MichaelZ
4

Tidak ada akses internet juga dapat disebabkan oleh pengaturan proxy yang hilang . Dalam hal ini, --network hostmungkin tidak berhasil. Proksi dapat dikonfigurasi dengan mengatur variabel lingkungan http_proxydan https_proxy:

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

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.

Simon A. Eugster
sumber
1
Ini adalah solusi bagi saya. Berhati-hatilah: Saya menggunakan alpine, yang memiliki implementasi busybox dari wget yang tampaknya mengabaikan pengaturan proxy, jadi saya tidak melihat manfaat dari pengaturan variabel lingkungan.
pelson
Terima kasih atas petunjuk tentang busybox; Saya belum tahu tentang itu!
Simon A. Eugster
1
Ketahuilah bahwa beberapa os membutuhkan huruf besar seperti di tautan dokumentasi .
Flo
4

bagi saya, masalah saya adalah karena iptables-services tidak diinstal, ini berfungsi untuk saya (CentOS):

sudo yum install iptables-services
sudo service docker restart
Viet Hoang
sumber
ingat mulai dan aktifkan layanan iptable juga
Jay
4

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.

Rajesh Guptan
sumber
Saya memiliki masalah yang sama di centos8
Martin Barth
3

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:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
brandones
sumber
3
Jadi ... apa solusinya? :) Saya memiliki aturan pertama dan memerlukannya untuk mengarahkan lalu lintas masuk di 80 ke 8080. Bagaimana cara mengubahnya agar tidak memengaruhi lalu lintas keluar?
mrooney
Maaf, memori iptables saya memudar, tetapi dalam skrip pengaturan saya, saya melihat iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080sebagai baris terakhir, setelah default ( iptables -P INPUT DROPdll). Tidak ada OUTPUT ... garis REDIRECT.
brandones
3

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

  1. temukan DNS Anda di mesin host
  2. gunakan --dns your_dns seperti yang disarankan oleh @jobin

    docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash

Adelin
sumber
2

Di windows (8.1) saya mematikan antarmuka kotak virtual (melalui taskmgr) dan itu menyelesaikan masalah.

Eli
sumber
2

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:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"
Thami Bouchnafa
sumber
2

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>

Achintya Ashok
sumber
Dalam kasus saya, saya hanya perlu me-restart buruh pelabuhan Daemon, dan berhasil
okante
2

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

  1. Hubungkan ke VPN Perusahaan
  2. Cari pengaturan VPN yang benar di /etc/resolv.conf atau /run/systemd/resolve/resolv.conf
  3. Mana pun yang memiliki pengaturan DNS yang benar, kami akan menghubungkannya ke file lain (Petunjuk: Tempatkan satu dengan pengaturan yang benar di sebelah kiri tugas)

Versi Docker: Versi Docker 19.03.0-rc2, build f97efcc

Jeff Beagley
sumber
2
Terima kasih. Dengan Ubuntu 18.04, setelah terhubung ke VPN perusahaan, hanya /etc/resolve.conf yang diperbarui oleh DHCP dan / run / systemd / resolusim / conf tetap konstan / statis. Solusi ini membantu. Sekarang, kontainer di mesin lokal terhubung ke server di VPN (yang tidak terjadi lebih awal bagi saya)
dexter2305
1

Jika Anda menggunakan OSX, Anda mungkin perlu memulai ulang mesin Anda setelah menginstal Docker. Ini terkadang menjadi masalah.

Will Stern
sumber
1

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.

thorie
sumber
0

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.

Rocckk
sumber
0

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=truedalam [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

BlackCetha
sumber
Bisakah Anda menentukan dengan tepat lokasi yang telah Anda setel parameter ini? Saya memiliki lokasi yang sama persis dengan Anda, menjalankan VM di Google Cloud Platform dan tidak dapat menemukan file * .network apa pun di server. Hanya aktif /usr/lib/sysctl.d/50-default.conftetapi sintaksnya berbeda.
el.severo
Kluster saya dikelola sendiri dan penyedia saya hanya melakukan bootstrap dasar saat penyiapan. Konfigurasi jaringan adalah /etc/systemd/network/10-mainif.networkuntuk saya. Tempat lain yang mungkin Anda periksa adalah /usr/local/lib/systemd/dan /usr/lib/systemd/sesuai halaman manual systemd.
BlackCetha
0

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.

Jasonw
sumber