GNU/Linux >> Belajar Linux >  >> Linux

Kontainer Docker tidak dapat terhubung ke internet di Fedora 32?

Meskipun OP menemukan solusi untuk masalahnya dan menutup masalah ini, dia tidak menemukan akar masalahnya. Fakta bahwa jaringan penghubung default Docker bridge terhubung ke internet dan airflowsetup_default tidak menunjukkan bahwa ada yang salah dengan pengaturan jaringan Docker.

Saya melakukan riset dan ternyata Fedora 32 memutuskan tidak terlalu peduli apakah Docker berfungsi atau tidak.

Bahkan tidak mungkin menginstal Docker dengan cara yang dijelaskan dalam dokumentasi dan jika Anda menginstal paket yang disediakan oleh Fedora, paket tersebut tetap tidak berfungsi dengan benar - informasi selengkapnya tentang masalah tersebut dapat ditemukan di sini, di sini, dan di sini.

Masalah utama adalah bahwa tidak ada konektivitas internet di dalam wadah jika mereka terhubung ke jaringan yang dijembatani khusus - apakah itu dibuat menggunakan docker network create atau dengan komposisi buruh pelabuhan.

Alasannya sederhana - Docker berasumsi bahwa firewall yang digunakan oleh OS adalah iptables, tetapi Fedora 32 menggunakan firewalld secara default. Artinya, Docker tidak dapat mengonfigurasi firewall secara manual - harus dikonfigurasi secara manual.

Untuk tujuan referensi, pertama-tama saya akan menjelaskan cara menyiapkan Docker pada instalasi Fedora 32 yang bersih.

Pertama jalankan perintah berikut:

sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER

Ini akan mengonfigurasi cgroup agar kompatibel dengan daemon Docker dan memungkinkan pengguna Anda menggunakan Docker CLI tanpa sudo.

Selanjutnya restart sistem Anda untuk menerapkan perubahan dan jalankan:

sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker

untuk menginstal dan mengaktifkan Docker.

Sekarang buka direktori yang berisi docker-compose.yml Anda dan jalankan docker-compose up -d . Yuo harus melihat docker-compose membuat jaringan untuk Anda dan kemudian membuat wadah. Jika penampung Anda memerlukan koneksi internet saat memulai (seperti OP), penampung tersebut akan gagal dimulai.

Sekarang jalankan sudo iptables-save | grep DOCKER dan Anda akan melihat sesuatu seperti:

:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o br-b56fa303f315 -j DOCKER
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-b56fa303f315 ! -o br-b56fa303f315 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-b56fa303f315 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-b56fa303f315 -j RETURN

docker0 adalah jaringan terjembatani default Docker, sedangkan br-b56fa303f315 adalah jaringan baru yang dibuat oleh docker-compose (milik Anda mungkin memiliki nama yang berbeda). Jika OS Anda menggunakan iptables semuanya akan berfungsi seperti yang diharapkan, tetapi ternyata tidak, jadi kita perlu memeriksa konfigurasi docker0 di firewalld .

Jalankan firewall-cmd --get-active-zones dan Anda akan mendapatkan sesuatu yang mirip dengan:

docker
  interfaces: docker0
public
  interfaces: eth0 eth1

Anda dapat melihat bahwa bridge jaringan ada di docker zona, tapi jaringan baru tidak. Sebenarnya itu tidak tercantum sama sekali, yang artinya ada di zona default. Anda dapat memeriksa apa itu dengan menjalankan firewall-cmd --get-default-zone . Pada pemasangan Fedora 32 yang bersih, ini adalah public .

Jadi jalankan (ingat untuk mengganti br-b56fa303f315 dengan nama antarmuka Anda):

sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315

jalankan docker-compose up -d jika layanan Anda gagal dimulai sebelumnya dan voila - penampung Anda memiliki konektivitas jaringan.

Sayangnya jika Anda memulai ulang sistem, konektivitas itu akan hilang lagi.

Anda dapat mencegahnya dengan menggunakan:

sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload

Namun jika Anda membuat jaringan baru atau membuat ulang yang sudah ada (misalnya dengan menjalankan docker-compose down lalu docker-compose up -d lagi) Anda harus mengulangi prosesnya.

Jadi apa solusi untuk masalah ini?

Pertama, catat semua antarmuka jaringan yang saat ini terpasang ke zona default - dalam contoh ini eth0 dan eth1 .

Kemudian jalankan perintah berikut (ganti public dengan nama zona default Anda)

sudo firewall-cmd --set-default-zone=docker
sudo firewall-cmd --permanent --zone=public --add-interface=eth0
sudo firewall-cmd --permanent --zone=public --add-interface=eth1
sudo firewall-cmd --reload

Sekarang antarmuka yang sebelumnya berada di zona default Anda harus ada lagi, tetapi semua antarmuka baru (dan karena itu semua jaringan Docker baru) akan ditambahkan secara otomatis ke docker zona, yang akan memberi mereka konektivitas jaringan penuh.


Linux
  1. Cara Menggunakan Tulis Docker

  2. Bagaimana Menghubungkan Kontainer Docker

  3. Cara menghapus semua wadah Docker

  1. Apa itu Docker (dan wadah Linux?)

  2. Cara Mendaftar Kontainer Docker

  3. Docker:Apakah tautan Docker tidak digunakan lagi?

  1. Pengantar Kontainer Docker

  2. Mengapa Semua Orang Menggunakan Docker?

  3. Jconsole tidak dapat terhubung