Berbagi jaringan kontainer VPN: apa yang terjadi pada DNS
Ruang nama bersama memberi aplikasi Anda antarmuka terowongan, bukan resolver gabungan. Uji dari dalam aplikasi dan gunakan tataan DNS yang didukung runtime.
Berbagi ruang nama jaringan kontainer VPN memberi aplikasi Anda antarmuka dan rute terowongan. Ini tidak memberinya resolver terowongan, atau salinan gabungan dari apa pun di host. Celah itu menghasilkan kegagalan yang sangat spesifik: nama publik terurai, nama internal tidak, dan aplikasi yang gagal tampak menggunakan server DNS yang salah, karena memang begitu. Perbaikannya biasanya lebih kecil daripada yang disiratkan diagnosis.
Langkah 1: Uji dari aplikasi, bukan dari host
Jalankan pencarian di dalam kontainer yang bermasalah, bukan di host dan bukan di peramban. docker exec app-container getent hosts db.internal menjawab satu-satunya pertanyaan yang penting: apa yang dikembalikan resolver proses ini.
Jika host mengurai nama dan kontainer tidak, Anda telah menemukan kesalahannya. Semua setelah ini adalah memilih cara yang didukung untuk memperbaikinya.
Langkah 2: Baca model yang didukung runtime
Dokumentasi jaringan Docker mencatat pembatasan pada flag DNS untuk kontainer yang berbagi mode jaringan kontainer lain. Di Compose, network_mode: service:vpn mengikat aplikasi ke ruang nama kontainer VPN, dan per layanan dns pengaturannya tidak berperilaku seperti pada layanan biasa. Resolusi yang Anda dapatkan adalah yang dimiliki ruang nama bersama.
Jaringan jembatan yang ditentukan pengguna juga memakai DNS bawaan Docker secara berbeda dari jembatan default. Itulah sebabnya dns klausa yang disalin dari contoh jembatan yang berfungsi bisa tidak melakukan apa pun di tumpukan bersama. Periksa tataannya sebelum menyalin klausa.
Alamat loopback selalu merujuk pada konteks jaringan yang bersangkutan. Di dalam ruang nama bersama, 127.0.0.1 bukan resolver host.
Langkah 3: Ikuti kueri hingga penerimanya
Baca konfigurasi resolver aplikasi, lalu DNS terenkripsi khusus aplikasi yang dibawanya, karena aplikasi yang menjalankan resolver sendiri mengabaikan berkas yang Anda sunting. Lalu periksa apakah resolver yang dipilih dapat dijangkau di bawah rute dan kebijakan firewall VPN. Alamat resolver di seberang terowongan tidak berguna jika ruang nama tidak memiliki rute ke sana. Pastikan penerimanya sebelum menyunting berkas apa pun.
Halaman pemeriksa IP di peramban tidak dapat memberi tahu ke mana kueri nama pergi. Halaman itu memberi tahu ke mana satu koneksi HTTP pergi.
Langkah 4: Perbaiki dua kelas kegagalan secara berbeda
Jika nama layanan gagal sementara nama publik berfungsi, masalahnya adalah penemuan layanan di dalam jaringan kontainer, bukan daftar resolver publik. Mengubah setiap alamat DNS publik tidak akan membuat catatan yang tidak pernah diminta oleh mekanisme penemuan jaringan.
Jika kedua kelas gagal, mulailah dari keterjangkauan resolver. Jika hanya satu yang gagal, mulailah dari mekanisme penemuan. Keduanya punya pemilik berbeda, itulah sebabnya satu perbaikan tidak pernah mencakup keduanya.
Langkah 5: Uji ulang setelah pembuatan ulang
Ubah konfigurasi melalui mekanisme yang didukung runtime, lalu buat ulang kontainer alih-alih menyunting berkas di dalam kontainer yang berjalan. Uji nama privat baru, nama publik baru, dan permintaan aplikasi yang menyusul pencarian. Suntingan pada /etc/resolv.conf di dalam kontainer hilang saat pembuatan ulang dan akan meyakinkan Anda bahwa perbaikan berhasil padahal tidak.
Catat pemilik resolver dan ruang nama yang diharapkan di samping definisi jaringan bersama. Orang berikutnya akan membutuhkan keduanya.