Akses database host dari wadah buruh pelabuhan

131

Jika saya memiliki database mysql yang berjalan di beberapa mesin host, dan host itu juga menjalankan wadah buruh pelabuhan: Bagaimana saya mengakses database mysql dari dalam wadah buruh pelabuhan yang berjalan di host ?.

Misalnya, apakah ada cara untuk mempublikasikan port host ke kontainer (kebalikan dari apa yang dilakukan docker run -p)?

Ryan Anderson
sumber
1
Jika server MySQL mendengarkan pada port, tidak bisakah kontainer hanya terhubung ke host di port itu seperti koneksi internet lainnya?
jwodder

Jawaban:

87

Ada beberapa diskusi lama tentang bagaimana melakukan ini secara konsisten, dipahami dengan baik dan portabel. Tidak ada resolusi lengkap tetapi saya akan menautkan Anda ke diskusi di bawah ini.

Bagaimanapun Anda ingin mencoba menggunakan opsi --add-host untuk menjalankan docker untuk menambahkan alamat ip host ke dalam file / etc / host yang mengandung. Dari sana mudah untuk terhubung ke host pada port yang diperlukan:

Menambahkan entri ke file host kontainer

Anda dapat menambahkan host lain ke file / etc / hosts pada kontener dengan menggunakan satu atau lebih flag --add-host. Contoh ini menambahkan alamat statis untuk host bernama buruh pelabuhan:

 $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

Catatan: Terkadang Anda perlu terhubung ke host Docker, yang berarti mendapatkan alamat IP host tersebut. Anda dapat menggunakan perintah shell berikut untuk menyederhanakan proses ini:

 $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

Dokumentasi:

https://docs.docker.com/engine/reference/commandline/run/

Diskusi tentang mengakses host dari wadah:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023

John Petrone
sumber
Apakah ini juga akan bekerja di belakang proxy terbalik NGINX ??
kta
89

Dari 18,03 dokumen:

Saya ingin terhubung dari sebuah wadah ke layanan di host

Tuan rumah memiliki alamat IP yang berubah (atau tidak ada jika Anda tidak memiliki akses jaringan). Dari 18,03 dan seterusnya, rekomendasi kami adalah untuk terhubung ke nama DNS khusushost.docker.internal , yang memutuskan ke alamat IP internal yang digunakan oleh tuan rumah.

Gerbang juga dapat dijangkau sebagai gateway.docker.internal.

CONTOH: Inilah yang saya gunakan untuk string koneksi MySQL saya di dalam wadah saya untuk mengakses instance MySQL di host saya:

mysql://host.docker.internal:3306/my_awesome_database
Kevin Chen
sumber
31
Sama seperti petunjuk: ini hanya berfungsi untuk Mac dan Win sejauh ini
flp
kamu menyelamatkan hariku :)
amjad
4
Suara positif. Bukan hanya karena jawabannya, tetapi karena Anda harus CARA menggunakannya dengan contoh.
granadaCoder
Saya hampir menghabiskan 2 jam untuk mencapai ini, terima kasih banyak.
Ashish Bainade
Masih tidak ada dukungan linux seperti yang ditulis @flp, untuk mereka yang penasaran. Inilah masalah github .
GAltelino
24

Gunakan host.docker.internal dari Docker 18.03 dan seterusnya.

Igor De Oliveira Sá
sumber
2
bagaimana dapatkah Anda memberikan contoh cara menggunakannya?
danfromisrael
Mengapa Anda tidak menjalankan mysql buruh pelabuhan?
Igor De Oliveira Sá
tidak bekerja untuk saya diDocker version 18.03.0-ce, build 0520e24
scythargon
@ IgorDeOliveiraSá bayangkan skenario berikut, pada lingkungan dev Anda memiliki beberapa database yang mendengarkan 127.0.0.1::3030 pada produksi dan Anda memiliki database mendengarkan 127.0.0.1:3306, secara lokal itu db lokal, produksi itu proxy ke cloud, Anda harus buruh pelabuhan mysql lokal dan dan untuk produksi menemukan solusi lain, atau Anda hanya dapat terhubung dari buruh pelabuhan ke pelabuhan, itu akan bekerja untuk kedua kasus
Drachenfels
1
docker.for.mac.localhost berfungsi untuk saya di18.03.1-ce-mac65
cdignam
21

Jawaban lain tidak berhasil untuk saya. Kontainer saya tidak dapat menyelesaikan ip host menggunakan host.docker.internal . Ada dua cara

  1. Berbagi jaringan host --net = host:

    docker run -it --net=host  myimage
    
  2. Menggunakan alamat ip docker, yang biasanya 172.17.0.1 . Anda dapat memeriksanya dengan memanggil perintah ifconfig dan mengambil antarmuka inet dari docker

    user@ubuntu:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:a4:a2:b2:f1  
      inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
    

Setelah Anda memiliki alamat ip ini, Anda dapat meneruskannya sebagai argumen untuk menjalankan docker dan kemudian ke aplikasi atau seperti yang saya lakukan, memetakan lokasi jdbc.properties melalui volume ke direktori pada mesin host, sehingga Anda dapat mengelola file secara eksternal .

  docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage

CATATAN: Basis data Anda mungkin tidak mengizinkan koneksi eksternal. Dalam hal postgresql, Anda perlu mengedit 2 file, seperti yang dijelaskan di sini dan di sini :

  1. Edit postgresql.conf untuk mendengarkan semua alamat. Secara default akan menunjuk ke localhost.

    listen_addresses = '*'
    
  2. Edit pg_hba.conf untuk mengizinkan koneksi dari semua alamat. Tambahkan pada baris terakhir:

    host     all             all             0.0.0.0/0               md5
    

PENTING: Langkah terakhir memperbarui akses basis data tidak disarankan untuk penggunaan produksi kecuali Anda benar-benar yakin dengan apa yang Anda lakukan.

gmode
sumber
--net = host bekerja untuk saya di lingkungan CI, terima kasih banyak!
Samy