Saat bekerja dengan Docker, Anda biasanya menyimpan layanan yang membentuk tumpukan Anda dan menggunakan jaringan antar-kontainer untuk berkomunikasi di antara mereka. Terkadang Anda mungkin memerlukan wadah untuk berbicara dengan layanan di host Anda yang belum dalam wadah. Berikut cara mengakses localhost
atau 127.0.0.1
dari dalam wadah Docker.
Opsi Mudah
Docker Desktop 18.03+ untuk Windows dan Mac mendukung host.docker.internal
sebagai alias yang berfungsi untuk localhost
. Gunakan string ini di dalam container Anda untuk mengakses mesin host Anda.
localhost
dan127.0.0.1
– Ini diselesaikan ke wadah .host.docker.internal
– Ini diselesaikan ke host luar.
Jika Anda menjalankan server MySQL di host Anda, container Docker dapat mengaksesnya dengan menghubungkan ke host.docker.internal:3306
. Ini adalah teknik paling sederhana saat Anda bekerja di mesin Windows atau Mac.
Pengguna Docker Engine di Linux dapat mengaktifkan host.docker.internal
juga melalui --add-host
tandai docker run
. Mulai container Anda dengan flag ini untuk mengekspos string host:
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
--add-host
flag menambahkan entri ke /etc/hosts
penampung mengajukan. Nilai yang ditampilkan di atas memetakan host.docker.internal
ke gateway host penampung, yang cocok dengan localhost
yang sebenarnya nilai. Anda dapat mengganti host.docker.internal
dengan string Anda sendiri jika Anda mau.
Menghubungkan ke Jaringan Host
Docker menyediakan host
jaringan yang memungkinkan wadah berbagi tumpukan jaringan host Anda. Pendekatan ini berarti localhost
di dalam wadah diselesaikan ke host fisik, bukan wadah itu sendiri.
Kontainer diluncurkan dengan jaringan host dengan menambahkan --network=host
bendera:
docker run -d --network=host my-container:latest
Sekarang wadah Anda dapat mereferensikan localhost
atau 127.0.0.1
secara langsung.
Jika Anda menggunakan Docker Compose, ubah definisi layanan penampung Anda untuk menyertakan network_mode
bidang:
services: my-service: network_mode: host
Ada beberapa peringatan untuk pendekatan ini. Penting untuk mempertimbangkan semua implikasinya sebelum Anda menggunakannya. Kontainer biasanya mendapatkan jaringan pribadi mereka sendiri yang terpisah dari tumpukan host. Saat Anda menentukan --network=host
, penampung secara default mewarisi setelan jaringan bersama dari host Anda.
Setiap port yang diekspos oleh container akan diekspos di host , meskipun tidak dideklarasikan secara eksplisit dengan -p
bendera. Hostname default container akan cocok dengan host, meskipun ini dapat diubah dengan --hostname
bendera.
Jaringan host dapat menjadi masalah keamanan yang merusak model isolasi wadah Docker. Ini masih dapat berguna dalam skenario di mana Anda yakin bahwa menjalankan container tidak akan saling bertentangan atau menyebabkan masalah di lingkungan host Anda. Mode jaringan host juga lebih cepat daripada mode jembatan default karena tidak ada lapisan virtualisasi untuk dilewati lalu lintas.
Mengakses Host Dengan Mode Jembatan Default
Host Anda masih dapat diakses dari wadah di bridge
default modus jaringan. Anda hanya perlu mereferensikannya dengan IP jaringan Docker-nya, bukan localhost
atau 127.0.0.1
.
Sebagian besar instalasi Docker Engine akan mewakili host sebagai 172.17.0.1
pada docker0
default jaringan jembatan. Anda dapat memeriksa IP Anda sendiri dengan menjalankan perintah ini di host Anda:
ip addr show docker0
IP Docker host Anda akan ditampilkan di inet
garis. Hubungkan ke alamat IP ini dari dalam wadah Anda untuk berhasil mengakses layanan yang berjalan di host Anda.
Salah satu perangkap dari pendekatan ini adalah Anda mungkin tidak dapat terhubung ke layanan yang mengikat langsung ke localhost
. Anda harus memastikan layanan Anda mendengarkan koneksi pada IP jembatan Docker Anda, serta localhost
dan 127.0.0.1
. Jika tidak, Anda akan melihat connection refused
atau kesalahan serupa dalam penampung Anda.
Ringkasan
Anda memiliki beberapa opsi saat Anda perlu menjangkau di luar wadah Docker ke localhost
mesin Anda . Jika Anda menggunakan Windows atau Mac, sebaiknya gunakan host.docker.internal
bawaan alias. Pengguna Linux dapat mengatur sesuatu yang mirip dengan --add-host
tandai saat memulai penampung.
Mode jaringan host adalah alternatif universal yang memungkinkan container berbagi tumpukan jaringan host Anda. Anda dapat mereferensikan localhost
langsung tetapi perlu tetap waspada terhadap risiko dan batasannya. Ini bukan pilihan yang cocok ketika isolasi jaringan yang kuat diperlukan.
Tetap menggunakan mode bridge bisa menjadi pilihan terbaik untuk beban kerja yang mendukungnya. Ikat layanan host Anda ke IP Docker-nya, lalu gunakan alamat itu untuk terhubung dari dalam wadah Anda. Ini memungkinkan Anda menggunakan jaringan virtual per-kontainer Docker sambil memberikan rute ke host Anda saat diperlukan.