Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Docker port eşlemesi, bilgisayarın bir portuna gelen trafiği konteyner içindeki belirli bir porta yönlendirir. -p 8080:80 ifadesinde soldaki 8080 host portu, sağdaki 80 ise konteyner portudur. Yani tarayıcıdan host makinenin 8080 portuna gelen istek, konteynerin 80 portundaki servise aktarılır. Burada varsayılan bridge ağı ele alınıyor. EXPOSE veya container içindeki dinleme portu, kendiliğinden hostta yayın oluşturmaz. Aynı Docker ağındaki container’lar ve Linux hostu iç porta erişebilir; host networking ve özel doğrudan yönlendirme düzenleri farklı davranır.

En küçük çalışır örnek​


Aşağıdaki örnek, HTTP servisi sunan bir konteyneri host üzerindeki 8080 portundan erişilebilir hâle getirir:

  1. Docker kurulumunun çalıştığını doğrulayın ve örnek konteyneri başlatın:
    Kod:
    docker run --name port-ornek -d -p 127.0.0.1:8080:80 nginx
  2. Host makinede 8080 portuna istek gönderin:
    Kod:
    curl http://127.0.0.1:8080
  3. Başarılı durumda Nginx'in varsayılan HTML yanıtını veya HTML içeriğinin bir bölümünü görürsünüz. Konteynerin durumunu ayrıca kontrol edebilirsiniz:
    Kod:
    docker ps --filter name=port-ornek
  4. Denemeyi bitirdiğinizde konteyneri kaldırın:
    Kod:
    docker rm -f port-ornek

Burada Nginx konteyner içinde 80 portunu dinler; host üzerinde 8080 kullanılır. Tarayıcı adresinde http://127.0.0.1:8080 yazılır, http://127.0.0.1:80 değil. curl bağlantı kuramıyorsa önce docker ps ile konteynerin çalıştığını, ardından docker logs port-ornek ile uygulama çıktısını kontrol edin. Host portu başka bir işlem tarafından kullanılıyorsa konteyner başlatılırken port tahsisi hatası alırsınız; bu durumda yalnızca host tarafını değiştirin: -p 8081:80.

Eşlemenin parçaları​


Port yazımı genel olarak [host_IP:]host_port:container_port biçimindedir. İsteğe bağlı IP adresi, bağlantının hangi host arayüzünde kabul edileceğini belirler; protokol belirtilmezse Docker'ın varsayılan davranışı TCP bağlantısı içindir.

YazımAnlamıTipik kullanım
-p 8080:80Tüm uygun host arayüzlerinde host 8080'i konteyner 80'e yönlendirirWeb servisi
-p 127.0.0.1:8080:80Güncel varsayılan düzende aynı makineyle sınırlarYerel yönetim veya test
-p 8080:80/udpUDP trafiğini host 8080'den konteyner 80'e yönlendirirUDP kullanan uygulama
-p 8080-8082:80-82Host ve konteyner port aralıklarını karşılıklı eşleştirirBirden fazla port

Docker 28.0.0 öncesinde localhost yayınlarına aynı L2 ağ segmentinden erişim istisnası belgelendi. Özellikle eski sürümlerde gerçek erişimi ayrıca test edin. Docker’ın oluşturduğu güvenlik duvarı kuralları bazı host güvenlik duvarı yollarını etkileyebilir; yalnız genel bir engelleme kuralının portu koruduğunu varsaymayın. Bu tablo, uygulamanın konteyner içinde hangi portta dinlediğini değiştirmez. Örneğin -p 8080:80 kullanıldığında uygulama hâlâ konteyner içinde 80 portuna bind olmalıdır. Uygulamanın yalnızca konteynerin 127.0.0.1 adresinde dinlemesi hâlinde Docker yönlendirmesi kurulsa bile dışarıdan yanıt alınamayabilir; ağ üzerinden erişilecek servisler genellikle konteynerin uygun ağ arayüzünde, çoğunlukla 0.0.0.0 üzerinde dinleyecek şekilde yapılandırılır.

Host ve konteyner portunu seçme​


Aynı host IP’si, port ve protokol birleşimi aynı anda tek bir yayına ait olabilir; farklı IP veya protokol farklı bir birleşimdir. İki web uygulamasını çalıştıracaksanız konteyner içindeki portları aynı bırakıp host portlarını ayırabilirsiniz:

Kod:
docker run --name site-a -d -p 127.0.0.1:8080:80 nginx
docker run --name site-b -d -p 127.0.0.1:8081:80 nginx

Bu durumda site-a hostun 8080, site-b ise 8081 portundan erişilir. Konteynerler birbirleriyle haberleşirken çoğu durumda host portunu kullanmaz; aynı Docker ağı üzerindeyseler servis adını ve konteynerin dinlediği iç portu kullanırlar. Örneğin bir uygulama veritabanına bağlanırken, veritabanı konteynerinin publish edilmiş host portu yerine uygun ağdaki servis adını ve veritabanının iç portunu kullanabilir.

Sık yapılan hatalar​


  • Port sırasını ters yazmak: -p 80:8080, host 80'i konteyner 8080'e yönlendirir; bunun tersi değildir.
  • EXPOSE satırını publish sanmak: Dockerfile içindeki EXPOSE dokümantasyon niteliğindedir; tek başına host portu açmaz. Çalıştırırken -p veya uygun Compose port tanımı gerekir.
  • Yanlış adrese bağlanmak: Host portu 8080 ise uygulama http://host-adresi:8080 üzerinden çağrılır. Konteynerin iç portu doğrudan hosttan çağrılmaz.
  • Güvenlik duvarını unutmak: Docker portu dinlese bile işletim sistemi, bulut güvenlik grubu veya harici güvenlik duvarı gelen trafiği engelleyebilir.
  • Gereksiz yere tüm arayüzlere açmak: Yalnızca yerel erişim gerekiyorsa 127.0.0.1:8080:80 kullanın. Tüm ağlardan erişim gereken sunucularda ise ayrıca kimlik doğrulama, TLS ve güvenlik duvarı kurallarını uygulama düzeyinde değerlendirin.

Kaynaklar​



Sık sorulan sorular​


Konteyner yeniden başlatılınca port eşlemesi kaybolur mu?​


Hayır. Eşleme konteyner oluşturulurken tanımlanır ve konteyner yeniden başlatıldığında korunur. Konteyneri silip yeni bir konteyner oluşturursanız port tanımını yeniden vermeniz gerekir.

Bir portu hem TCP hem UDP için nasıl açarım?​


Protokolleri ayrı ayrı belirtin: -p 8080:80/tcp -p 8080:80/udp. Uygulamanın gerçekten her iki protokolü de dinlediğini de doğrulayın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.