2015-04-30 14 views
15

liman işçisi konteynerlerin rastgele dış portuna sahip benim makinem, ama sunucu sunumunda hizmet için docker kullanmak istiyorum, ancak şu anda mümkün görünmüyor.Kullanım Eureka rağmen Üzerinde hizmetlerini başlatmak zaman çalışır ön-</p> <p>ters vekil dayalı bir Zuul ile birkaç yay çizme bazlı microservices oluşan bir uygulama yazıyorum

Normalde kabın dış kısmında sabit bir "dahili" bağlantı noktası ve rastgele ayrılmış bağlantı noktalarına sahip olursunuz. Ancak kapsayıcıdaki uygulama, dış bağlantı noktasını (ve IP'yi) bilmemektedir.

Netflix araçları, verimli bir mikro sistem mimarisi yazmak istediğimle eşleşiyor ve kavramsal olarak docker'ı gerçekten seviyorum. Görebildiğim kadarıyla, kapsayıcıyı başlatmak, ana portta dış bağlantı noktasını toplamak ve uygulamaya aktarmak çok zahmetli olur çünkü uygulama başlatıldıktan sonra bağlantı noktasını değiştiremezsiniz.

Docker tabanlı istemcilerle eureka'yı kullanmanın bir yolu var mı?

[Güncelleme] Sorunu açıklayan kötü bir iş yaptım sanırım. Bu belki biraz daha açıklığa kavuşabilir:

Sadece bir tane ve dış bağlantı noktası önemli olmadığı için eureka sunucusunun kendisi docker ile çalışabilir. Bağlantı özelliğini istemcilerden erişmek için kullanabilirim.

Sorun, istemcilerin kendilerini kaydettirdikleri URL'dir. Bu, örneğin https://localhost:8080/ Fakat halkın eureka hizmetler için yanlış URL'yi dönecektir Yani aslında yalnızca erişilebilir https://localhost:54321/

yoluyladır dinamik bağlantı noktası atama etmektir.

UPDATE Aşağıdaki cevabımı güncelledim, o yüzden buraya bakın.

Belki en iyi çözüm değildir bir çözüm kendim buldum, ama benim için uygun
+0

https://registry.hub.docker.com/search?q=eureka&searchfield= ve 3 zuul https://registry.hub.docker.com/search?q=zuul&searchfield= adresinde Eureka ile 14 tane docker görüntünüz var. Belki de ilişkili Dockerfiles – user2915097

+0

'a bir göz atmalısınız. Sorun eureka ile bir docker görüntüye sahip değil. Sorun, uygulamanın kendi iç limanı bildiği için müşterilerin eureka'ya kendi dış dünya portlarıyla rastlayamadıklarıdır. –

+0

>>> uygulamanın kendisi sadece iç portu biliyor -> iç limanı yazmak ve okumak için bir hacim kullanabilirsiniz, bkz. Https://docs.docker.com/userguide/dockervolumes/ see docker run --volumes - – user2915097

cevap

5

...

siz "--net = konak" (ana bilgisayar ağ) ile liman işçisi başlamak, o zaman ana bilgisayar ağını doğrudan kullanın. Daha sonra ilkbahar-önyükleme için bağlantı noktası olarak 0 kullanıyorum ve yay benim için bağlantı noktasını rasgele hale getiriyor ve ana bilgisayar ağ kümesini kullandığı için farklı bir bağlantı noktasına (ve IP'ye) çeviri yok.

olsa bazı dezavantajları vardır:

  • Eğer bağlantı kaynağı veya hedef olarak bu konteynerler için bağlantı özelliğini kullanamaz ağ ana bilgisayarı kullanan

    .
  • Ana makine ağ yığınını kullanarak, örneğin projenize bağlı olarak sorunun daha az kapsüllenmesini sağlar.

    1. Eğer bahar uygulamasını barındırmak için liman işçisi kullanıyorsanız:

Ben bir sürü zaman geçti ve ben daha fazla bu biraz ayrıntılı gerektiğini düşünüyorum o

yardımcı olur umarım sadece rastgele bir port kullanmayın! Sabit bir port kullanın, çünkü her konteyner kendi IP'sini alır, böylece her servis aynı portu kullanabilir.Bu hayatı çok daha kolay hale getirir.

  • Herkese açık bir hizmetiniz varsa, yine de sabit bir bağlantı noktası kullanırsınız.

  • Yerel yollarla maven üzerinden veya örneğin komut satırında rastgeleleştirilmiş bağlantı noktaları kullanan özel bir profil bulunur, böylece çakışmalarınız olmaz (ancak rastgele bağlantı noktaları ve hizmet kaydıyla ilgili birkaç hata bulunduğunu veya bulunmadığını unutmayın)

  • Eğer herhangi bir nedenden dolayı ister istemez ya da ana bilgisayar ağını kullanmanız gerekiyorsa, elbette ki rastgeleleştirilmiş portları kullanabilirsiniz, ama çoğu zaman yapmamalısınız!

  • +0

    Bu maalesef AWS Elastic Beanstalk ortamlarında çalışmadı ... –

    +0

    AWS'de her servis kendi ana bilgisayarında olacak, değil mi? Sonra "normal" (Netflix) yolunu kullanabilir ve sabit bir port kullanabilirsin, değil mi? –

    +0

    bağlantı noktasında sorun yok, sorun ana bilgisayarla ilgili. İç kapsayıcıda barındırıcının IP adresini belirleyemiyorum. Ancak AWS SDK bunu yapabilir ve problemimi programlı olarak çözerim. –

    4

    Her liman işçisi örneği için bir dizin kurmak ve ev sahibi ve örnek arasındaki paylaşmak ve daha sonra bu dizinde bir dosyaya bağlantı noktası ve IP adresini yazabilir.

    $ instanceName=$(generate random instance name) 
    $ dirName=/var/lib/docker/metadata/$instanceName 
    $ mkdir -p $dirName 
    $ docker run -name $instanceName -v ${dirName}:/mnt/metadata ... 
    $ echo $(get port number and host IP) > ${dirName}/external-address 
    

    Sonra sadece uygulamadan /mnt/meta/harici adresi okuyup Eureka ile bu bilgileri kullanırlar.

    +0

    Bu yaklaşım için teşekkürler! Bunun gibi bir şey düşündüm. Bu, uygulamaya başlamadan önce Port ve IP verilerinin ayarlanmasını bekleyen özel bir başlangıç ​​betiğine sahip olmayı gerektirir. Kubernetes gibi bir şeyi daha sonra ölçeklendirme ve yönetim için kullanmayı planlarken, mümkün olduğunca özel komut dosyalarına ihtiyaç duymak istiyorum. –

    +0

    Sadece uygulamada dosya için anket yapabilir ve doldurulduktan sonra Eureka'ya kaydolabilirsiniz. Konteynırları başlatırken özel işlem gerektiriyor olmasına rağmen. – Raniz

    +0

    Doğru, ana bilgisayar ağ modu sorun olmadığı sürece bunu kullanacağım. Standart ağa gitmem gerektiğinde önerinizi deneyeceğim. Teşekkürler! –

    İlgili konular