Yanıtlar:
Göre docker-oluşturma referans ,
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).
Benim docker-compose.yml
gibi 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
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
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
docker-compose run
, içindeki bağlantı noktası tanımının varsayılan docker-compose.yml
olarak yoksayıldığını unutmayın. docker-compose up
Parametreyi kullanın veya sağlayın--service-ports
limanlar :
ortaya çıkarmak :
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.
ports
Bö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-proxy
ilk 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.
Maruziyet belgelerdir. Görüntüde ve çalışırken kapsayıcıda da meta veriler ayarlar. Genellikle bunu Dockerfile içinde EXPOSE
talimatla 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 inspect
Gö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, -P
bayrak 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.
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.
expose
bir yerdocker-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.