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.