2015-01-19 14 views
15

Nginx'li iki tane docker konteyneri var. container1, container2'ye bağlanır. Ben container2 den container1 ping olabilirBağlantılı bir docker kabına nginx proxy_pass

server { 
    location ~ ^/some_url/(.*)$ { 
     proxy_pass http://container1/$1; 
    } 
} 

ancak nginx bunu çözemezse: Docker sonra ben şöyle nginx yapılandırma giren /etc/hosts bir giriş ekler

* 1 tanımlı hiçbir çözümleyici nasıl anothe bir istek proxy_pass olabilir container1

çözmek için r docker kabı?

Sen Resolverde olarak kullanarak/etc/hosts ile ilgili bu cevabı bir göz atmalısınız
+0

Can hosts dosyanızı paylaşıyor musunuz? İki konteynırı nasıl bağladın? (Linkin adı ne?) Ayrıca gotcha: Eğer kaplardan birini rm '' ve daha sonra yeniden başlatırsanız, IP değişmiş olacaktır (ana bilgisayarlar güncellenmez) – wpp

+0

Ben sadece sizinki gibi yapılandırmayı denedim ve çalıştı nginx: 1.7.9' ile benim için iyi. * Container2 * 'da bas başlatabilir ve * container1 * curl yapabilir misiniz? Aynı konfigürasyonları hem konteyner1 hem de 2 kullanmıyorsunuz, değil mi? –

+0

@MykolaGurov Konteyner2'den ping ve curl ile kapsayıcı1 yapamıyorum. Benim problemim, bu nginx'in çözebileceği görünmüyor. Aynı konfigürasyonları kullanmıyorum, hayır (eğer nginx yapılandırmasına atıfta bulunuyorsanız). –

cevap

5

: Using /etc/hosts as resolver for url rewriting

Esas olarak, dns veya çözümleyici bir arama sırasında isimlerini çözümlemek için/etc/hosts kullanmak değil, olabildiğince dnsmasq'u yükleyerek ve çözümleyiciniz olarak 127.0.0.1'u kullanarak çalışın. Eğer nginx config doğrudan Resolverde olarak 127.0.0.1 ekleyebilirsiniz:

server { 
    location ~ ^/some_url/(.*)$ { 
     resolver 127.0.0.1; 
     proxy_pass http://container1/$1; 
    } 
} 
+0

Bu gerçekten denediğim bir şeydi, ama dnsmasq hata vermeden başladığım için pes ettim. Belki de çok hızlı. Tekrar deneyecek ve bilmeni sağlayacağım. –

+0

Tekrar denedim, giriş noktama dnsmasq ekledim. Kapsayıcınızı bir VM'de çalıştırıyorsanız dnsmasq'ı root olarak çalıştırdığınızdan emin olun, aksi halde çalışmaz. –

25

yerine konteyner adının bir memba bloğunu kullanın doğrudan

upstream backend { 
    server container1; 
} 
server { 
    location ~ ^/some_url/(.*)$ { 
     proxy_pass http://backend/$1; 
    } 
} 

Bu normaldir ad çözümlemesi bir yol sağlayarak meydana izin vermelidir nginx ile docker bağlantılarını kolayca kullanmak.

+0

Dış bağımlılıklar ile uğraşmak istemediğinizde en iyi yanıt. –

+3

Bu çözümle yaşadığım sorun, 'container1' nginx konteynerinizi başlatabilmeniz için önce çalıştırılması ve çalıştırılması gerektiğidir, aksi halde –

+1

başlamaz. Arka uç kalkana kadar bekleyen bir komut dosyası yazın. Bunun gibi bir şey çalışmalıdır: bash -c “curl -s container1: 8080>/dev/null; container1 için bekleyen eko yapın; uyku 3; bitti; start_nginx.sh” '' başlangıç ​​'start_nginx.sh' aslında nginx servisi. – threejeez

14

Gömülü Docker DNS hizmetini kullanmak, etkinleştirildiğinde, kapsayıcı çözümleyicinizi kontrol edebilir:

cat /etc/resolv.conf 

olmalı:

nameserver 127.0.0.11 

kullanın Resolver olarak bu IP:

server { 
    location ~ ^/some_url/(.*)$ { 
     resolver 127.0.0.11; 
     proxy_pass http://container1/$1; 
    } } 
+1

Kimsenin bunu neden bulamadığını merak ediyorum. Bazı uyarılar var mı? – activatedgeek

+1

Hmm, belki de IP 127.0.0.11 kodlu kodlanmış bazı sorunlar –

+0

Bence düşünüyorum. İdeal yol, nameserver IP'si için 'etc/resolv.conf' işlevini ayrıştırmak olacaktır. – activatedgeek