VPN menyala, peramban mencapai situs internal, tetapi kontainer masih tidak bisa menyelesaikan nama yang sama. Pemasangan paket mati dengan galat penyelesaian nama seperti EAI_AGAIN, atau aplikasi tidak menemukan host basis data yang diselesaikan mesin host tanpa keluhan apa pun. Kontainer tidak memakai resolver yang dipasang VPN. Docker menyalin konfigurasi resolver host saat kontainer dibuat, dan tidak ada yang menyalinnya lagi sesudahnya.

Dua tampilan resolver pada satu mesin

Di Linux, Docker memberi setiap kontainer salinan konfigurasi resolver host pada saat pembuatan, menyaring alamat loopback, dan menjalankan server DNS tertanam di 127.0.0.11 yang meneruskan kueri ke luar. Klien VPN yang menulis ulang /etc/resolv.conf setelah kontainer berjalan tidak mengubah apa pun di dalamnya. Menjalankan ulang kontainer hanya membantu jika resolver host kebetulan benar pada saat itu.

Docker Desktop di macOS atau Windows menambah lapisan, karena daemon hidup di mesin virtual. Resolver VPN host mungkin tidak pernah terlihat oleh VM itu, jadi menjalankan ulang tidak mengubah apa pun sama sekali. Bandingkan kedua tampilan sebelum memilih perbaikan: docker exec mycontainer cat /etc/resolv.conf di samping daftar resolver host.

Kontainer yang mencantumkan resolver publik sementara host mencantumkan resolver internal akan menyelesaikan nama publik dan gagal pada nama internal. Pemisahan itulah tanda khas masalah ini.

Opsi A: berikan resolver terowongan per kontainer

Docker menerima pengaturan DNS per kontainer, dan itu perubahan terkecil yang berhasil. Baca dulu alamat resolver VPN: scutil --dns di macOS, resolvectl status atau keluaran status klien itu sendiri di Linux. Lalu jalankan kontainer dengan alamat itu, misalnya docker run --dns 192.168.2.1 --dns 192.168.123.1 myimage. Di Compose pengaturan yang sama adalah daftar di bawah layanan, tempat ia hidup dalam kontrol versi alih-alih riwayat shell seseorang.

Array dns di /etc/docker/daemon.json berlaku untuk setiap kontainer baru, yang terdengar lebih rapi tetapi tidak. Pengaturan itu juga berlaku saat terowongan mati, dan resolver yang hanya bisa dijangkau lewat VPN lalu merusak penarikan image biasa. Pengaturan per kontainer lebih mudah dipertanggungjawabkan dan lebih mudah dibatalkan.

Opsi B: biarkan kontainer berbagi jaringan host

Jaringan host melewati salinan sepenuhnya, karena kontainer memakai resolver host dan terowongan host. Opsi ini juga menghapus isolasi jaringan yang mungkin Anda inginkan, dan perilakunya tidak sama di Docker Desktop. Di Linux inilah pilihan pragmatis untuk alat sekali pakai yang harus menyelesaikan nama internal.

Untuk build, tidak ada satu pun opsi yang berlaku, karena langkah build tidak mewarisi flag waktu jalan. Build dengan jaringan host di tempat platform mengizinkannya, atau simpan pemasangan dependensi di tahap yang tidak memerlukan terowongan.

Apa yang tidak diperbaiki oleh kedua opsi

Alamat DNS tidak berguna jika kontainer tidak punya rute ke sana. Resolver VPN biasanya berada di dalam ruang alamat terowongan, jadi kontainer memerlukan jalur ke prefiks itu. Jembatan bawaan Docker biasanya merutekan keluar lewat host, dan itu cukup bila host memiliki rute terowongan serta penerusan aktif. Jaringan jembatan khusus dengan kumpulan alamatnya sendiri bisa bertabrakan dengan subnet VPN, dan kueri pun pergi ke tempat yang sama sekali lain.

Periksa subnet jaringan Docker terhadap subnet VPN sebelum Anda menelusuri resolver itu sendiri. Tumpang tindih menghasilkan kegagalan yang tampak persis seperti server DNS rusak.

Verifikasi di dalam kontainer

Uji dengan getent hosts db.internal di dalam kontainer alih-alih dengan peramban atau runtime bahasa, karena keduanya menerapkan kebijakan DNS dan cache mereka sendiri. Jika getent menyelesaikan nama itu dan aplikasi masih gagal, resolver kini benar dan masalah yang tersisa ada di tingkat aplikasi. Jika tidak menyelesaikannya, langkah DNS belum selesai.

Buat ulang kontainer setelah mengubah pengaturan DNS-nya. Menyunting /etc/resolv.conf di dalam kontainer yang berjalan hilang bersamanya dan menyembunyikan masalah konfigurasi tepat selama waktu yang dibutuhkan seseorang untuk menjalankannya ulang.

Artikel terkait