Dari dalam bekas Docker, bagaimanakah saya boleh menyambung ke localhost mesin?
P粉787820396
2023-08-23 11:55:48
<p>Saya mempunyai Nginx berjalan di dalam bekas docker. Saya mempunyai MySql yang berjalan pada sistem hos. Saya mahu menyambung ke MySql dari dalam bekas saya. MySql hanya mengikat pada peranti localhost. </p>
<p>Adakah terdapat sebarang cara untuk menyambung ke MySql ini atau mana-mana program lain pada localhost dari dalam bekas docker ini? </p>
<p>Soalan ini berbeza daripada "Bagaimana untuk mendapatkan alamat IP hos docker dari dalam bekas docker" kerana alamat IP hos docker mungkin IP awam atau IP peribadi dalam rangkaian, yang mungkin atau mungkin tidak boleh diakses dari dalam bekas docker (saya maksudkan IP awam jika dihoskan pada AWS atau di tempat lain). Walaupun anda mempunyai alamat IP hos docker, ini tidak bermakna anda boleh menyambung ke hos docker dari dalam bekas, kerana rangkaian Docker anda mungkin rangkaian tindanan, rangkaian hos, rangkaian jambatan, rangkaian macvlan , rangkaian tiada, dsb., yang mengehadkan kebolehcapaian bekas ke alamat IP ini. </p>
Terdapat di semua platform
Docker v 20.10 dan ke atas (sehingga 14 Disember 2020)
Gunakan alamat IP dalaman anda atau sambungkan ke nama DNS khas
host.docker.internal
yang akan menyelesaikan kepada alamat IP dalaman yang digunakan oleh hos.Ini adalah untuk tujuan pembangunan dan tidak terpakai pada persekitaran pengeluaran di luar Desktop Docker.
Amaran Linux
Untuk mendayakan ciri ini dalam Docker di Linux, tambahkan
--add-host=host.docker.internal:host-gateway
pada perintahdocker
anda untuk mendayakan ciri tersebut.Untuk mendayakan ciri ini dalam Docker Compose di Linux, tambahkan baris berikut pada definisi bekas:
Menurut sesetengah pengguna, nama DNS khas hanya berfungsi dalam rangkaian
bridge
bridge lalai Docker dan bukan dalam rangkaian tersuai.Untuk versi macOS dan Windows lama Docker
Docker v 18.03 dan ke atas (sehingga 21 Mac 2018)
Gunakan alamat IP dalaman anda atau sambungkan ke nama DNS khas
host.docker.internal
yang akan menyelesaikan kepada alamat IP dalaman yang digunakan oleh hos.Sokongan Linux belum selesai https://github.com/docker/for-linux/issues/264
Untuk versi macOS lama Docker
Docker untuk Mac v 17.12 hingga v 18.02
Sama seperti di atas, tetapi menggunakan
docker.for.mac.host.internal
docker.for.mac.host.internal.Docker untuk Mac v 17.06 hingga v 17.11
Sama seperti di atas, tetapi gunakan
docker.for.mac.localhost
docker.for.mac.localhost sebaliknya.Docker untuk Mac 17.05 dan lebih rendah
Untuk mengakses mesin hos daripada bekas docker, anda mesti melampirkan alias IP pada antara muka rangkaian anda. Anda boleh mengikat mana-mana IP yang anda mahu, cuma pastikan anda tidak menggunakannya untuk perkara lain.
sudo ifconfig lo0 别名 123.123.123.123/24
sudo ifconfig lo0 alias 123.123.123.123/24Kemudian pastikan pelayan anda mendengar pada IP di atas atau
127.0.0.1, ia tidak akan menerima sambungan.0.0.0.0
。如果它正在监听本地主机127.0.0.1
0.0.0.0. Jika ia mendengar pada localhostcurl -X GET 123.123.123.123:3000
Untuk menguji, anda boleh menjalankan sesuatu sepertiPenyelesaian dan lebih banyak dokumentasi di sini: https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
🎜Editor:
Jika anda menggunakan Docker-for-mac atau Docker-for-Windows 18.03+, gunakan hos
host.docker.internal
(bukannya127.0.0.1 dalam rentetan sambungan anda).
Jika anda menggunakan Docker-for-Linux 20.10.0+, anda juga boleh menggunakan hos
jikahost.docker.internal
if您使用--add-host host.docker.internal:host-gateway
anda melancarkannya menggunakan
--add-host host.docker.internal:host-gateway pilihan bekas Docker, atau tambahkan coretan kod berikut dalam fail docker-compose.yml:Jika tidak, sila baca di bawah
docker run
命令中使用--network="host"
,然后 docker 容器中的127.0.0.1
TLDRGunakan --network="host" dalam perintah docker run, kemudian p>127.0.0.1 dalam bekas docker akan menghala ke hos docker anda.
Nota: Mod ini hanya tersedia untuk Docker di Linux,
mengikut dokumentasi.
Nota tentang mod rangkaian kontena buruh pelabuhanmod rangkaian yang berbeza
docker0
semasa menjalankan bekas. Bergantung pada mod yang anda pilih, anda akan menyambung ke pangkalan data MySQL yang dijalankan pada hos docker secara berbeza.larian buruh pelabuhan --network="bridge" (lalai)
Docker mencipta jambatan bernamasudo ip addr show docker0
docker0 secara lalai. Kedua-dua hos docker dan bekas docker mempunyai alamat IP pada jambatan.
Pada hos Docker, masukkandocker0
网络接口上的 IP 地址为172.17.42.1
sudo ip addr show docker0 dan anda akan mendapat output seperti ini:
Jadi, alamat IP hos docker saya pada antara muka rangkaiandocker run --rm -it ubuntu:trusty bash
并在容器中输入ip addr show eth0
docker0 ialah
172.17.1.192
172.17.42.1.Sekarang mulakan bekas baharu dan dapatkan cangkerang padanya:
ip addr show eth0 untuk mengetahui cara antara muka rangkaian utamanya adalah Set: 🎜 🎜Di sini alamat IP bekas saya ialah 🎜172.17.1.192. Sekarang lihat jadual penghalaan: 🎜 🎜Oleh itu, alamat IP hos docker 🎜172.17.42.1 ditetapkan sebagai laluan lalai dan boleh diakses daripada bekas anda. 🎜172.17.42.1
docker run --rm -it ubuntu:trusty bash dan dalam jenis bekasdocker run --network="host"
Sebagai alternatif, anda boleh menjalankan bekas Docker dan tetapkan tetapan rangkaian kepada
主机
。这样的容器将与 docker 主机共享网络堆栈,从容器的角度来看,localhost
(或127.0.0.1
)将引用 docker 主机。 p>Sila ambil perhatian bahawa mana-mana port yang dibuka dalam bekas docker akan dibuka pada hos docker. Ini tidak memerlukan
-p
或 -Pdocker run
pilihan.Konfigurasi IP pada hos docker saya:
Dan bekas docker dari mod host:
Seperti yang anda lihat, hos docker dan bekas docker berkongsi antara muka rangkaian yang sama dan oleh itu mempunyai alamat IP yang sama.
Sambung ke MySQL dari bekas
Mod Jambatan
Untuk mengakses MySQL yang berjalan pada hos docker daripada bekas dalam mod jambatan, anda perlu memastikan bahawa perkhidmatan MySQL sedang mendengar sambungan pada
172.17.42.1
alamat IP.Untuk melakukan ini, pastikan anda mempunyai
bind-address = 172.17.42.1
或bind-address = 0.0.0.0
) dalam fail konfigurasi MySQL anda (my.cnf).Jika anda perlu menetapkan pembolehubah persekitaran dengan alamat IP get laluan, anda boleh menjalankan kod berikut dalam bekas:
Kemudian dalam aplikasi anda, gunakan
DOCKER_HOST_IP
pembolehubah persekitaran untuk membuka sambungan ke MySQL.Nota: Jika anda menggunakan
bind-address = 0.0.0.0
, pelayan MySQL anda akan mendengar sambungan pada semua antara muka rangkaian. Ini bermakna pelayan MySQL anda boleh diakses dari Internet pastikan anda menetapkan peraturan firewall dengan sewajarnya.Nota 2: Jika anda menggunakan
bind-address=172.17.42.1
, pelayan MySQL anda tidak akan mendengar sambungan yang dibuat kepada127.0.0.1
. Proses yang berjalan pada hos docker yang ingin menyambung ke MySQL mesti menggunakan alamat IPbind-address = 172.17.42.1
,您的MySQL服务器将不会侦听与127.0.0.1
建立的连接>。在 docker 主机上运行的想要连接到 MySQL 的进程必须使用172.17.42.1
.Mod hos
Untuk mengakses MySQL yang berjalan pada hos docker daripada bekas dalam mod hos, anda boleh menyimpan
bind-address = 127.0.0.1
并连接到127.0.0.1
dalam konfigurasi MySQL daripada bekas anda:Nota: Sila gunakan
mysql -h 127.0.0.1
,而不是mysql -h localhost
; jika tidak, pelanggan MySQL akan cuba menyambung menggunakan soket unix.