Topik ini membahas jaringan bridge default, yaitu jembatan jaringan bawaan yang otomatis digunakan setiap container sebelum jaringan lain dibuat. Pembahasan mencakup cara container memperoleh alamat IP privat dari Docker, perjalanan lalu lintasnya menuju internet, serta batasan utama jaringan ini berupa ketiadaan resolusi nama antar container. Setelah membacanya, perilaku jaringan bawaan dapat dijelaskan, dan keputusan tentang kapan jaringan kustom perlu dibuat dapat diambil.
Jembatan docker0 dan alamat container#
Setiap container membawa tumpukan jaringannya sendiri. Kernel mengisolasi tumpukan tersebut dengan network namespace, yaitu lapisan isolasi yang memberi setiap container antarmuka jaringan, tabel rute, dan ruang port tersendiri. Ketiganya terpisah dari host, komputer tempat Docker berjalan. Driver bridge pada Docker kemudian menyatukan antarmuka-antarmuka tersebut sebagaimana sakelar jaringan menyatukan kabel-kabel pada satu jaringan lokal. Pada jaringan default, hasilnya berupa jembatan bernama docker0 yang dibuat daemon, proses layanan yang mengerjakan seluruh pekerjaan Docker.
Jembatan docker0 menempati satu subnet, yaitu rentang alamat IP privat yang dialokasikan untuk satu jaringan lokal. Rentangnya berbeda antar lingkungan, misalnya 172.17.0.0/16 pada pemasangan yang umum dijumpai. Setiap container yang berjalan tanpa opsi jaringan tambahan memperoleh satu alamat dari rentang tersebut, misalnya 172.17.0.2 untuk container pertama dan 172.17.0.3 untuk container berikutnya. Alamat itu hanya berlaku di dalam host dan tidak dapat dijangkau dari jaringan luar.
Keberadaan jembatan tersebut dapat dilihat dari sisi host. Antarmuka jaringan adalah titik koneksi, baik fisik maupun virtual, yang menghubungkan sebuah mesin ke jaringan. Perintah berikut menampilkan antarmuka pada mesin lingkungan uji modul ini. Pada pemasangan Docker yang lengkap, satu antarmuka bernama docker0 ikut muncul pada daftar tersebut, bersama antarmuka virtual milik setiap container.
# antarmuka jaringan yang dimiliki mesin lingkungan uji
ip -brief link showlo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
dummy0 DOWN 36:4c:04:57:0d:46 <BROADCAST,NOARP>
eth0 UP 6a:25:a0:44:ba:d3 <BROADCAST,MULTICAST,UP,LOWER_UP>Rincian jaringan default dapat dibaca tanpa perangkat tambahan. Perintah docker network ls menampilkan daftar jaringan yang dikenal Docker, sedangkan docker network inspect pada jaringan bridge memperlihatkan subnet, alamat gateway sebagai pintu keluar container menuju jaringan lain, dan daftar container yang sedang terpasang. Rentang subnet pada contoh sebelumnya dapat diverifikasi melalui keluaran perintah docker network inspect bridge.
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# daftar jaringan yang dikenal Docker
docker network ls
# subnet dan container terpasang pada jaringan default
docker network inspect bridgePerjalanan lalu lintas menuju internet#
Container yang mengunduh paket atau memanggil layanan luar tetap dapat mencapai internet melalui NAT, singkatan dari Network Address Translation, yaitu penulisan ulang alamat pada paket jaringan. Ketika container mengirim paket ke tujuan luar, kernel pada host mengganti alamat sumber paket itu dengan alamat host sebelum paket keluar. Server tujuan membalas ke alamat host, dan kernel meneruskan balasan tersebut kembali ke container yang bersangkutan. Dari sudut pandang server luar, permintaan itu seolah berasal dari host, bukan dari container di dalamnya.
Gambar berikut merangkum susunan tersebut, dari dua container di atas jembatan docker0, sambungan jembatan ke host, hingga penulisan ulang alamat menuju internet.
Arah keluarnya tidak sama dengan arah masuknya. Paket dari container dapat keluar menuju internet tanpa pengaturan tambahan, sedangkan koneksi dari luar tidak dapat masuk ke container sebelum portnya dipublikasikan dengan opsi -p. Asimetri ini disengaja, karena container mengambil inisiatif koneksi keluar, sedangkan koneksi masuk memerlukan alamat yang tetap dan diketahui klien. Dengan perilaku tersebut, aplikasi di dalam container tidak menerima koneksi yang tidak dikehendaki.
Batasan tanpa DNS antar container#
Jaringan default tidak menyediakan DNS antar container. DNS adalah sistem yang menerjemahkan nama menjadi alamat IP. Nama container tidak dapat digunakan sebagai alamat pada jaringan ini, sehingga dua container hanya dapat saling dihubungi melalui alamat IP privatnya. Alamat semacam itu bersifat sementara karena ditetapkan ulang setiap kali container dibuat, sehingga aplikasi yang menyimpannya kehilangan koneksi setelah container dibuat ulang.
Opsi waris --link dapat menyambungkan container pada jaringan default, tetapi opsi ini sudah dianggap usang dan tidak dikembangkan lagi. Publikasi port dengan -p juga tetap diperlukan apabila salah satu container perlu dilayani dari luar host, karena menjadi anggota satu jaringan tidak otomatis membuka port apa pun bagi host. Kekurangan-kekurangan inilah yang menjadikan jaringan kustom dengan DNS bawaan sebagai pilihan yang lazim untuk aplikasi yang terdiri atas lebih dari satu container.
Kesalahan umum#
Menghubungkan container melalui nama pada jaringan default. Aplikasi klien menampilkan error penyelesaian nama karena bridge default tidak menyediakan DNS antar container. Perbaikannya dengan memindahkan kedua container ke jaringan kustom yang sama atau, pada kasus yang tidak dapat dihindari, mengandalkan alamat IP yang selalu diperbarui.
Menyimpan alamat IP container sebagai konfigurasi tetap. Koneksi yang semula berhasil gagal setelah container dibuat ulang, karena alamat barunya tidak sama dengan alamat lama. Perbaikannya dengan beralih ke jaringan kustom dan menghubungi container melalui namanya.
Ringkasan#
- Driver bridge default menyatukan seluruh container di atas jembatan
docker0pada host dan memberi masing-masing alamat IP privat dari subnet bawaan, misalnya 172.17.0.0/16. - Lalu lintas keluar mencapai internet melalui NAT pada host, sedangkan koneksi masuk memerlukan publikasi port dengan
-p. - Jaringan default tidak menyediakan DNS antar container, sehingga koneksi antar container hanya dapat mengandalkan alamat IP yang berubah-ubah atau opsi waris
--link. - Ketiadaan DNS inilah yang menjadikan jaringan kustom sebagai pilihan baku bagi aplikasi multi-container.
Referensi#
- Bridge network driver — Docker Docs
— Menjelaskan driver bridge, jembatan
docker0, dan perbedaannya dengan jaringan buatan pengguna. - Networking overview — Docker Docs — Gambaran mekanisme jaringan Docker, termasuk daftar driver dan cara NAT bekerja.