Rumah > Soal Jawab > teks badan
P粉5170907482023-08-24 11:07:24
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 perintah docker
anda untuk mendayakan ciri tersebut.
Untuk mendayakan ciri ini dalam Docker Compose di Linux, tambahkan baris berikut pada definisi bekas:
extra_hosts: - "host.docker.internal:host-gateway"
Menurut sesetengah pengguna, nama DNS khas hanya berfungsi dalam rangkaian bridge
bridge lalai Docker dan bukan dalam rangkaian tersuai.
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
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/24
Kemudian pastikan pelayan anda mendengar pada IP di atas atau 0.0.0.0
。如果它正在监听本地主机127.0.0.1
0.0.0.0. Jika ia mendengar pada localhost
Kemudian hanya halakan bekas docker anda ke IP ini untuk mengakses hos!
curl -X GET 123.123.123.123:3000
Untuk menguji, anda boleh menjalankan sesuatu seperti
Alias akan ditetapkan semula pada setiap but semula, jadi buat skrip permulaan jika perlu.
Penyelesaian dan lebih banyak dokumentasi di sini: https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
🎜P粉0193532472023-08-24 09:26:22
Editor:
Jika anda menggunakan Docker-for-mac atau Docker-for-Windows 18.03+, gunakan hos host.docker.internal
(bukannya 127.0.0.1< /code> dalam rentetan sambungan anda).
Jika anda menggunakan Docker-for-Linux 20.10.0+, anda juga boleh menggunakan hos host.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:extra_hosts:
- "host.docker.internal:host-gateway"
docker run
命令中使用 --network="host"
,然后 docker 容器中的 127.0.0.1
TLDR
Gunakan --network="host" dalam perintah docker run, kemudian p>127.0.0.1 dalam bekas docker akan menghala ke hos docker anda.
mod rangkaian yang berbezadocker0
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)sudo ip addr show docker0
docker0 secara lalai. Kedua-dua hos docker dan bekas docker mempunyai alamat IP pada jambatan. docker0
网络接口上的 IP 地址为 172.17.42.1
sudo ip addr show docker0 dan anda akan mendapat output seperti ini: docker run --rm -it ubuntu:trusty bash
并在容器中输入 ip addr show eth0
[vagrant@docker:~] $ sudo ip addr show docker0 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::5484:7aff:fefe:9799/64 scope link valid_lft forever preferred_lft foreverJadi, alamat IP hos docker saya pada antara muka rangkaian
docker0 ialah 172.17.1.192
172.17.42.1.
Sekarang mulakan bekas baharu dan dapatkan cangkerang padanya: 172.17.42.1
docker run --rm -it ubuntu:trusty bash dan dalam jenis bekas
root@e77f6a1b3740:/# ip addr show eth0 863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff inet 172.17.1.192/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::6432:13ff:fef0:f1e3/64 scope link valid_lft forever preferred_lft forever🎜Di sini alamat IP bekas saya ialah 🎜172.17.1.192. Sekarang lihat jadual penghalaan: 🎜
root@e77f6a1b3740:/# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 172.17.42.1 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 * 255.255.0.0 U 0 0 0 eth0🎜Oleh itu, alamat IP hos docker 🎜172.17.42.1 ditetapkan sebagai laluan lalai dan boleh diakses daripada bekas anda. 🎜
root@e77f6a1b3740:/# ping 172.17.42.1 PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data. 64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms 64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms 64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms
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
或 <代码>-P docker run
pilihan.
Konfigurasi IP pada hos docker saya:
[vagrant@docker:~] $ ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe98:dcaa/64 scope link valid_lft forever preferred_lft forever
Dan bekas docker dari mod host:
[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe98:dcaa/64 scope link valid_lft forever preferred_lft forever
Seperti yang anda lihat, hos docker dan bekas docker berkongsi antara muka rangkaian yang sama dan oleh itu mempunyai alamat IP yang sama.
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:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print }')
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 kepada 127.0.0.1
. Proses yang berjalan pada hos docker yang ingin menyambung ke MySQL mesti menggunakan alamat IP bind-address = 172.17.42.1
,您的MySQL服务器将不会侦听与127.0.0.1
建立的连接>。在 docker 主机上运行的想要连接到 MySQL 的进程必须使用 172.17.42.1
.
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:
[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 36 Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
Nota: Sila gunakan mysql -h 127.0.0.1
,而不是mysql -h localhost
; jika tidak, pelanggan MySQL akan cuba menyambung menggunakan soket unix.