Bir docker kapsayıcısından ana bilgisayar veritabanına erişin


132

Bazı ana makinelerde çalışan bir mysql veritabanım varsa ve bu ana bilgisayar aynı zamanda bir docker container çalıştırıyorsa: Ana bilgisayarda çalışan docker kapsayıcısından mysql veritabanına nasıl erişebilirim?

Örneğin, konteynere bir ana bilgisayar portu yayınlamanın bir yolu var mı (docker run -p'nin yaptığı şeyin tersi)?


1
MySQL sunucusu bir bağlantı noktasında dinliyorsa, kapsayıcı diğer herhangi bir internet bağlantısı gibi bu bağlantı noktasındaki ana bilgisayara bağlanamaz mı?
jwodder

Yanıtlar:


87

Bunun tutarlı, iyi anlaşılmış ve taşınabilir bir şekilde nasıl yapılacağına dair uzun süredir devam eden birkaç tartışma var. Tam bir çözüm yok, ancak sizi aşağıdaki tartışmalara bağlayacağım.

Her halükarda, birçoğunuz --add-host seçeneğini kullanarak docker çalıştırıp sunucunun ip adresini konteynerin / etc / host dosyasına eklemeyi denemek isteyebilirsiniz. Oradan, gerekli herhangi bir bağlantı noktasındaki ana bilgisayara bağlanmak önemsizdir:

Bir konteyner ana bilgisayar dosyasına girişler ekleme

Bir veya daha fazla --add-host bayrağı kullanarak diğer ana bilgisayarları bir kapsayıcının / etc / hosts dosyasına ekleyebilirsiniz. Bu örnek, docker adlı bir ana bilgisayar için statik bir adres ekler:

 $ 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

Not: Bazen Docker ana bilgisayarına bağlanmanız gerekir, bu da ana bilgisayarın IP adresini almanız anlamına gelir. Bu işlemi basitleştirmek için aşağıdaki kabuk komutlarını kullanabilirsiniz:

 $ 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

Belgeler:

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

Kapsayıcıdan ana bilgisayara erişmeye ilişkin tartışmalar:

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

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


Aynı zamanda bir NGINX ters proxy arkasında mı çalışacak?
kta

89

18.03 dokümanlarından:

Bir kapsayıcıdan ana bilgisayardaki bir hizmete bağlanmak istiyorum

Ana bilgisayarın değişen bir IP adresi vardır (veya ağ erişiminiz yoksa hiçbiri yoktur). 18.03'ten itibaren önerimiz özel DNS adına bağlanmaktır.host.docker.internal , ana bilgisayar tarafından kullanılan dahili IP adresine çözümlenen .

Ağ geçidi olarak da ulaşılabilir gateway.docker.internal.

ÖRNEK: Ana makinemdeki MySQL örneğine erişmek için kapsayıcımdaki MySQL bağlantı dizem için kullandığım şey:

mysql://host.docker.internal:3306/my_awesome_database

31
İpucu olarak: bu şimdiye kadar yalnızca Mac ve Win için çalışıyor
flp

günümü kurtardın :)
amjad

4
Oyla. Sadece cevap yüzünden değil, onu bir örnekle NASIL kullanmanız gerektiği için.
granadaCoder

1
Bunu başarmak için neredeyse 2 saat harcadım, çok teşekkürler.
Ashish Bainade

@Flp'nin yazdığı gibi merak edenler için hala linux desteği yok. İşte github sorunu .
GAltelino


24

Docker 18.03'ten itibaren host.docker.internal'ı kullanın .


2
Nasıl ? nasıl kullanılacağına dair bir örnek verebilir misiniz?
danfromisrael

Neden dockerize bir mysql çalıştırmıyorsunuz?
Igor De Oliveira Sá

benim için çalışmıyorDocker version 18.03.0-ce, build 0520e24
scythargon

@ IgorDeOliveiraSá aşağıdaki senaryoyu hayal edin, dev ortamında üretim ortamında 127.0.0.1:3306 dinleyen bir veritabanınız var, 127.0.0.1:3306 dinleyen veritabanınız var, yerel olarak yerel db, üretim, bulut için proxy, ya da dockerise mysql yerel olarak ve üretim için başka bir çözüm bulun veya docker'dan bağlantı noktasına bağlanabilirsiniz, her iki durumda da çalışacaktır
Drachenfels

1
docker.for.mac.localhost benim için çalışıyor18.03.1-ce-mac65
cdignam

21

Diğer cevaplar benim için pek işe yaramadı. Konteynırım host.docker.internal'ı kullanarak ana bilgisayar ipini çözemedi . İki yol var

  1. Ana bilgisayar ağını paylaşma --net = host:

    docker run -it --net=host  myimage
    
  2. Docker'ın genellikle 172.17.0.1 olan ip adresini kullanarak . Bunu, ifconfig komutunu çağırarak ve docker arayüzünün inet adresini alarak kontrol edebilirsiniz.

    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
    

Bu ip adresini aldıktan sonra, onu docker çalıştırmak ve ardından uygulamaya argüman olarak iletebilir veya ben yaptığım sırada jdbc.properties dosyasının konumunu hacim yoluyla ana makinedeki dizine eşleyebilirsiniz, böylece dosyayı harici olarak yönetebilirsiniz. .

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

NOT: Veritabanınız harici bağlantılara izin vermeyebilir. Postgresql durumunda, burada ve burada açıklandığı gibi 2 dosyayı düzenlemeniz gerekir :

  1. Tüm adresleri dinlemek için postgresql.conf dosyasını düzenleyin. Varsayılan olarak localhost'u gösterecektir.

    listen_addresses = '*'
    
  2. Tüm adreslerden bağlantılara izin vermek için pg_hba.conf dosyasını düzenleyin. Son satıra ekleyin:

    host     all             all             0.0.0.0/0               md5
    

ÖNEMLİ: Son adım güncelleme veritabanı erişimi, ne yaptığınızdan gerçekten emin değilseniz üretimde kullanım için önerilmez.


--net = host benim için bir CI ortamında çalıştı, çok teşekkürler!
Samy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.