Docker-compose portları ile expose arasındaki fark nedir


Yanıtlar:


527

Göre docker-oluşturma referans ,

Bağlantı noktaları şu şekilde tanımlanır:

Bağlantı noktalarını açığa çıkarın . Her iki bağlantı noktasını (HOST: CONTAINER) veya yalnızca kapsayıcı bağlantı noktasını belirtin (rasgele bir ana makine bağlantı noktası seçilir).

  • Docker-compose.yml içinde bahsedilen bağlantı noktaları, docker-compose tarafından başlatılan farklı hizmetler arasında paylaşılacaktır.
  • Bağlantı noktaları, ana makineye rastgele bir bağlantı noktasına veya belirli bir bağlantı noktasına maruz bırakılır.

Benim docker-compose.ymlgibi görünüyor:

mysql:
  image: mysql:5.7
  ports:
    - "3306"

Eğer yaparsam docker-compose ps, şöyle görünecektir:

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

Maruz kalma şu şekilde tanımlanır:

Bağlantı noktalarını ana makinede yayınlamadan açığa çıkarın; yalnızca bağlantılı hizmetlere erişilebilir. Yalnızca dahili bağlantı noktası belirtilebilir.

Bağlantı noktaları ana bilgisayarlara değil, yalnızca diğer hizmetlere maruz kalır.

mysql:
  image: mysql:5.7
  expose:
    - "3306"

Eğer yaparsam docker-compose ps, şöyle görünecektir:

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

24
o belirtmeye vardır ne gibi avantajlar açıklamak eto mümkün olacağını exposebir yer docker-compose? Anlayabildiğim kadarıyla, bağlantı noktalarının bağlantılı hizmetler için erişilebilir olmasını sağlamak için maruz kalma belirtmeniz gerekmez.
Sulu

3
Açıkta kalan bağlantı noktalarının yalnızca aynı docker ağındaki servislerde kullanılabileceğini söylememeli mi (bağlantı çoğu parça için değiştiriliyor)?
Miyav

8
@Juicy Sanırım Dockerfiles benzer expose: "EXPOSE talimatı aslında bağlantı noktası yayınlamıyor. Bir tür belge işlevi görür ..." docs.docker.com/engine/reference/builder/#expose
tsauerwein

1
Bağlantı noktaları güvenlik duvarı düzeyindeki ayarları geçersiz kılar mı? Sadece güvenlik duvarında mysql için bağlantı noktaları açmadım, ancak uzaktan erişilebilir olduklarını fark ettim. Limanlar ifşa yerine "3306: 3306" olarak ayarlanmıştı.
TekiusFanatikus

3
Ve kullanırsanız docker-compose run, içindeki bağlantı noktası tanımının varsayılan docker-compose.ymlolarak yoksayıldığını unutmayın. docker-compose upParametreyi kullanın veya sağlayın--service-ports
Juha Untinen

180

limanlar :

  1. Bağlantı birimini docker'ın dışındaki dünyadan (aynı ana makine veya farklı bir makine olabilir) VE ayrıca docker içindeki erişilebilir dünyayı dinlemek için konteyneri etkinleştirir.
  2. Birden fazla port belirtilebilir (bu yüzden portlar port değildir)

resim açıklamasını buraya girin

ortaya çıkarmak :

  1. Yalnızca docker'ın içindeki dünyadan VE docker'ın dışındaki erişilebilir bir dünyadan belirli bir bağlantı noktasını dinlemek için konteyneri etkinleştirir.
  2. Birden fazla port belirtilebilir

resim açıklamasını buraya girin


3
Maruz kalmanın birden fazla bağlantı noktasına izin verdiğini unutmayın - docs.docker.com/compose/compose-file/#expose - ancak dahili + harici yerine yalnızca dahili bağlantı noktasını sağlıyorsunuz
Stuart Moore

Ama konteynırdan dünya dışına çıkmak istersem ne yapmalıyım? stackoverflow.com/questions/61322256/…
gstackoverflow

26

Bağlantı Noktaları Bu bölüm, ana sunucu ile Docker kapsayıcısı arasındaki eşlemeyi tanımlamak için kullanılır.

ports:
   - 10005:80

Kapsayıcı içinde çalışan uygulamanın 80 numaralı bağlantı noktasında açığa çıktığı anlamına gelir. Ancak harici sistem / varlık ona erişemez, bu nedenle ana sunucu bağlantı noktasıyla eşlenmesi gerekir.

Not: 10005 ana bilgisayar bağlantı noktasını açmanız ve harici varlıkların uygulamaya erişmesine izin vermek için güvenlik duvarı kurallarını değiştirmeniz gerekir.

Kullanabilirler

http: // {ana bilgisayar IP}: 10005

böyle bir şey

EXPOSE Bu, yalnızca uygulamanın docker konteynerinin içinde çalıştığı bağlantı noktasını tanımlamak için kullanılır.

Dockerfile dosyasında da tanımlayabilirsiniz. Genellikle, dockerfile içindeki EXPOSE'u tanımlamak iyi ve yaygın olarak kullanılan bir uygulamadır, çünkü çok nadiren herkes bunları varsayılan 80 bağlantı noktasından başka bir bağlantı noktasında çalıştırır.


19

Limanlar

portsBölüm ana bilgisayarda bağlantı noktalarını yayınlayacaktır. Docker, ana bilgisayar ağından konteynere belirli bir bağlantı noktası için bir yönlendirme ayarlayacaktır. Varsayılan olarak bu, docker-proxyilk bağlantı noktasını dinleyen ve ikinci noktada dinlenmesi gereken kapsayıcıya ileten bir kullanıcı alanı proxy işlemi ( ) ile uygulanır . Kapsayıcı hedef bağlantı noktasını dinlemiyorsa, ana makinede dinleyen bir şey görmeye devam edersiniz, ancak o ana makine bağlantı noktasına bağlanmayı denerseniz, başarısız iletme kabınızdaki bağlantıyı reddedersiniz.

Bu proxy, kabın ağ ad alanında çalışmadığından ve kabın içinde 127.0.0.1'e erişemediğinden, kapsayıcı tüm ağ arabirimlerini dinliyor olmalıdır. Bunun için IPv4 yöntemi uygulamanızı dinleyecek şekilde yapılandırmaktır 0.0.0.0.

Ayrıca yayınlanan bağlantı noktalarının ters yönde çalışmadığını da unutmayın. Bir bağlantı noktası yayınlayarak, ana bilgisayardaki bir hizmete kapsayıcıdan bağlanamazsınız. Bunun yerine, kullanımda olan ana makine bağlantı noktasını dinlemeye çalışırken docker hatalarını bulacaksınız.

Maruz bırakmak

Maruziyet belgelerdir. Görüntüde ve çalışırken kapsayıcıda da meta veriler ayarlar. Genellikle bunu Dockerfile içinde EXPOSEtalimatla yapılandırırsınız ve uygulamanızın varsayılan olarak hangi bağlantı noktalarını dinleyeceğini bilmesi için resminizi çalıştıran kullanıcılar için belge görevi görür. Bir oluşturma dosyasıyla yapılandırıldığında, bu meta veriler yalnızca kapsayıcıda ayarlanır. docker inspectGörüntü veya kapsayıcı üzerinde bir çalıştırdığınızda açıktaki bağlantı noktalarını görebilirsiniz .

Açıktaki bağlantı noktalarına dayanan birkaç araç vardır. Docker'da, -Pbayrak açıkta kalan tüm bağlantı noktalarını ana bilgisayardaki geçici bağlantı noktalarına yayınlayacaktır. Ayrıca, kapsayıcı bağlantı noktasını açıkça ayarlamazsanız, uygulamanıza trafik gönderirken açıkta kalan bir bağlantı noktasını kullanmayı varsayılan olarak değiştirecek çeşitli ters proxy'ler de vardır.

Bu harici araçlar haricinde, maruz kalmanın kaplar arasındaki ağ üzerinde hiçbir etkisi yoktur. Bir kaba diğerine erişmek için yalnızca ortak bir liman işçisi ağına ve konteyner bağlantı noktasına bağlanmaya ihtiyacınız vardır. Bu ağ kullanıcı tarafından oluşturulmuşsa (örneğin, varsayılan köprü ağı değil bridge), diğer kapsayıcılara bağlanmak için DNS'yi kullanabilirsiniz.


3

Daha önce cevaplara tamamen katılıyorum. Sadece maruz kalma ve bağlantı noktaları arasındaki farkın liman işçisindeki güvenlik kavramının bir parçası olduğunu belirtmek isterim. Liman işçisinin ağ iletişimi ile el ele gider . Örneğin:

Web ön ucu ve veritabanı arka ucu olan bir uygulama düşünün. Dış dünyanın web ön ucuna (belki de bağlantı noktası 80'de) erişmesi gerekir, ancak yalnızca arka ucun kendisinin veritabanı ana bilgisayarına ve bağlantı noktasına erişmesi gerekir. Kullanıcı tanımlı bir köprü kullanarak, yalnızca web bağlantı noktasının açılması gerekir ve web ön ucunun kullanıcı tanımlı köprü üzerinden erişebilmesi nedeniyle veritabanı uygulamasının açık herhangi bir bağlantı noktasına ihtiyacı yoktur.

Bu, docker'da bir ağ mimarisi kurarken yaygın bir kullanım durumudur. Örneğin, varsayılan bir köprü ağında bağlantı noktalarına dış dünyadan erişilemez. Bunun için "portlar" ile bir giriş noktası açabilirsiniz. "Expose" kullanarak ağ içindeki iletişimi tanımlarsınız. Varsayılan bağlantı noktalarını göstermek istiyorsanız, docker-compose dosyanızda "expose" tanımlamanız gerekmez.

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.