What is Docker Network

Docker network, Docker container’larının birbirleriyle ve dış dünya ile nasıl haberleşeceğini belirleyen sanal ağ yapısıdır. Kısaca,  Container’lar arası iletişimi ve internet erişimini yönetir.

Docker Network ne işe yarar?

  • Container’ların birbirini IP veya isimle bulmasını sağlar.
  • Aynı sunucudaki container’ları izole eder.
  • Güvenli ve kontrollü servis iletişimi kurar.
  • Port çakışmalarını azaltır.
  • Mikroservis mimarisini kolaylaştırır.

Docker Network türleri ne işe yarar?

Docker network driver’ları, container’ların hangi ağ yapısını kullanacağını ve nasıl haberleşeceğini belirleyen mekanizmalardır. Temel olarak 5 tane driver gelir.

  • bridge: Aynı host üzerindeki container’ların birbiriyle izole ve güvenli şekilde iletişim kurmasını sağlar
  • host: Container’ın host makinenin ağını doğrudan kullanmasını sağlar. (düşük gecikme, az izolasyon)
  • none: Container’ı tamamen ağdan izole eder
  • overlay: Farklı Docker host’larındaki container’ların tek bir sanal ağdaymış gibi haberleşmesini sağlar
  • macvlan: Container’lara fiziksel ağdan gerçek IP vererek LAN’daki cihazlar gibi davranmalarını sağlar

Network Create

Bir container oluştururken eğer network seçilmez ise varsayılan olarak bridge network dahil olunur.  Docker host üzerinde çalışan container’ların özel (sanal) bir ağ üzerinden birbirleriyle haberleşmesini sağlar. Docker, Linux’ta docker0 adlı sanal bir köprü (bridge) oluşturur. ifconfig komutunu kullanarak bu network'u görebilirsiniz. Container’lar bu köprüye bağlanır ve her container’a özel bir IP atanır. (genelde 172.x.x.x)

Container’lar aynı bridge içindeyse, birbirlerine doğrudan erişebilir. Farklı bridge’ler üzerinde ise birbirlerini göremezler yani izolasyon sağlanır.

Network driverlarının detaylarını öğrenmek için yine inspect komutunu kullanabilirsiniz.

docker network inspect bridge

Aşağıdaki çıktıda hangi containerların bu network'a bağlandığını görebilirsiniz.

Aslında sistemde birden fazla bridge network var. Ancak yukarıda söylediğimiz gibi farklı bridge network oluşturduğumuz zaman containlar birbirinden izole olup erişim engellemektedir.

docker network ls
docker network inspect ozwiki_default 

Aşağıdaki örnek ile custom bridge network oluşturup container’ları bu ağa nasıl dahil edeceğimizi anlatmaktadır. Bridge Network Oluşturmak için aşağıdaki komutu çalıştırın.

docker network create my_bridge

Kontrol etmek için aşağıdaki komutu kullanabilirsiniz.

docker network ls

Container’ı Bridge Network’e Dahil Etmek için --network my_bridge opsiyonunu kullanmanız yeterlidir.

docker run -d --name network_test --network my_bridge busybox sleep 3600 

Connecting the Container to the Network Later

Çalışan bir containerı eklemek için aşağıdaki komutu kullanabilirsiniz.

docker network connect my_bridge container_name 

Çalışan bir containerı çıkarmak için aşağıdaki komutu kullanabilirsiniz.

docker network disconnect my_bridge container_name 

Host Network Create

Host network, containerın ayrı bir sanal ağ kullanmadan, doğrudan host makinenin network’ünü kullanmasıdır. Yani, Container = Host olur aynı IP, aynı network interface’leri, aynı port alanı olacaktır.

Host networkte port mapping yapılamaz. Çünkü host network kullanan container, host makinenin ağını doğrudan kullanır. 

  • Ayrı bir container IP’si yoktur
  • NAT yoktur
  • Docker araya girmez
Özellik bridge host
IP Container’a özel Host ile aynı
Port mapping Gerekli Gerekmez
İzolasyon Var Yok
Güvenlik Daha iyi Zayıf
Performans Normal Yüksek

Basit bir örnek ile daha iyi anlaşılmasını sağlayalım. Aşağıda 3000 ve 3001 numaralı portlardan yayın yapan bir uygulama ayağa kaldırıyorum. Farkındaysanız komutta port publish yapılmamış. Bunun sebebi biraz önce bahsettiğimiz --network host opsiyonu ile container ağını yalıtmadan host ile birleştirmemizdir.

docker run -d --name openspeedtest --network host openspeedtest/latest

Şimdi container içine girelim.

docker exec -it openspeedtest sh

Container içindeki network kartlarını görüntüleyelim.

ifconfig

Aşağıda görüldüğü gibi containerden farklı olarak host üzerinde bulunan tüm kartlar gözükmektedir. Yani izole olmadan host ile birebir aynı olmuştur.

None Network Create

Docker none network, bir container’ın hiçbir ağa bağlanmadan, tamamen izole şekilde çalışmasını sağlayan network sürücüsüdür.

  • Container’a IP adresi atanmaz
  • lo (localhost) dışında network arayüzü yoktur
  • İnternete çıkamaz
  • Başka container’larla haberleşemez
  • Dışarıdan erişilemez, port açılmaz
  • Docker’ın bridge, NAT, DNS, iptables mekanizmeleri devre dışıdır

Ne zaman kullanılır?

  • Maksimum güvenlik gereken durumlarda
  • Offline çalışması istenen işlemlerde
  • Ağ erişimi olmaması gereken script veya batch job’larda
  • Test ve izolasyon amaçlı çalışmalarda

Docker none network, container’ı tamamen ağdan izole eder. Aşağıdaki örnek ile daha iyi anlaşılmasını sağlayabiliriz. Şimdi None Network ile Container çalıştıralım.

docker run -it --name isolated --network none alpine

Aşağıda görüldüğü gibi lo (localhost) dışında hiçbir interface yok.

Bu container, IP adresi almadığı için, İnternete çıkamaz, başka container’ları göremez. Ping denemesi yaptığımız zaman başarısız olduğunu görebiliriz.

ping 8.8.8.8 

Port Publish

Docker port publish, container içindeki bir servisin kullandığı portu host makinenin bir portu üzerinden dış dünyaya açma işlemidir.

  • Container içindeki port → host portuna bağlanır
  • Host’tan gelen trafik container’a yönlendirilir (NAT)
  • Sadece bridge / custom network’lerde kullanılır
  • host network’te çalışmaz

Örneğin, host’un 8888 portuna gelen istekleri, container’ın 80 portuna iletmeye çalışalım.

docker run -p 8888:80 nginx

Aşağıda gördüğünüz gibi çok basit bir şekilde bu işlemi gerçekleştirebildik.

Varsayılan olarak herhangi bir opsiyon belirtilmez ise port publish tcp paketleri için geçerli olacaktır. Eğer Container içindeki UDP tabanlı bir servisin (DNS, syslog, game server vb.) ise host makineden erişilebilir hale getirilmesi için aşağıdaki örneği baz alabilirsiniz.

docker run -d -p 5353:53/udp my-dns-image
Blog'a Dön