Rumah  >  Soal Jawab  >  teks badan

Dari dalam bekas Docker, bagaimanakah saya boleh menyambung ke localhost mesin?

<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>
P粉787820396P粉787820396423 hari yang lalu546

membalas semua(2)saya akan balas

  • P粉517090748

    P粉5170907482023-08-24 11:07:24

    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 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 bridgebridge 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.internaldocker.for.mac.host.internal.

    Docker untuk Mac v 17.06 hingga v 17.11

    Sama seperti di atas, tetapi gunakan docker.for.mac.localhostdocker.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/24sudo 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.10.0.0.0. Jika ia mendengar pada localhost

    127.0.0.1, ia tidak akan menerima sambungan.

    Kemudian hanya halakan bekas docker anda ke IP ini untuk mengakses hos!

    curl -X GET 123.123.123.123:3000Untuk menguji, anda boleh menjalankan sesuatu seperti

    curl -X GET 123.123.123.123:3000 di dalam bekas.

    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

    🎜

    balas
    0
  • P粉019353247

    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

    jika

    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"
    

    Jika tidak, sila baca di bawah

    docker run 命令中使用 --network="host",然后 docker 容器中的 127.0.0.1TLDR

    Gunakan --network="host" dalam perintah docker run, kemudian 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 pelabuhan

    Docker menyediakan

    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

    Docker mencipta jambatan bernama

    docker0 secara lalai. Kedua-dua hos docker dan bekas docker mempunyai alamat IP pada jambatan. docker0 网络接口上的 IP 地址为 172.17.42.1

    Pada hos Docker, masukkan

    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 forever

    Jadi, alamat IP hos docker saya pada antara muka rangkaian

    docker0 ialah 172.17.1.192172.17.42.1.

    Sekarang mulakan bekas baharu dan dapatkan cangkerang padanya: 172.17.42.1docker run --rm -it ubuntu:trusty bash dan dalam jenis bekas

    ip addr show eth0 untuk mengetahui cara antara muka rangkaian utamanya adalah Set: 🎜
    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

    docker 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 或 <代码>-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.


    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.1bind-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.

    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:

    [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.

    balas
    0
  • Batalbalas