Docker Networking - Containerlar Arası İletişim

Docker Networking: Konteynerlar Arası İletişim ve Ağ Yönetimi Rehberi

Docker networking, konteynerize edilmiş uygulamaların birbirleriyle ve dış dünyayla nasıl iletişim kuracağını belirleyen, mikroservis mimarisinin temel taşlarından biridir. Bu makalede, Docker'ın sunduğu ağ sürücülerini, izolasyon mekanizmalarını ve gerçek dünya senaryolarında konteynerlar arası iletişimin nasıl optimize edileceğini teknik detaylarıyla inceleyeceğiz.

Not: Docker'da varsayılan ağ yapılandırmalarını anlamak, sadece bağlantı kurmak için değil, aynı zamanda uygulama güvenliğini (security isolation) sağlamak için de kritiktir.

1. Docker Network Sürücüleri (Network Drivers)

Docker, farklı kullanım durumları için çeşitli ağ sürücüleri sunar. İhtiyacınıza uygun sürücüyü seçmek, performans ve ölçeklenebilirlik açısından hayati önem taşır.

Sürücü (Driver) Kullanım Amacı Öne Çıkan Özellik
Bridge Tekil host üzerinde çalışan konteynerlar. Varsayılan sürücüdür, izolasyon sağlar.
Host Konteyner ile host arasındaki ağ izolasyonunu kaldırır. En yüksek performans, port çakışması riski.
Overlay Farklı hostlar üzerindeki konteynerların iletişimi. Docker Swarm ve multi-host iletişimi için kullanılır.
None Ağ erişimini tamamen kapatır. Maksimum izolasyon, sadece loopback arayüzü.
Macvlan Konteynerlara doğrudan fiziksel MAC adresi atar. Konteynerın ağda fiziksel bir cihaz gibi görünmesini sağlar.

2. Varsayılan Bridge ve Kullanıcı Tanımlı (User-Defined) Bridge

Docker kurulduğunda otomatik olarak bridge isimli bir ağ oluşturur. Ancak, production ortamlarında "User-Defined Bridge" kullanılması şiddetle tavsiye edilir.

Neden User-Defined Bridge Kullanmalıyız?

  • Otomatik DNS Çözümleme: Kullanıcı tanımlı ağlarda konteynerlar birbirlerine IP adresleri yerine konteyner isimleriyle (container name) ulaşabilirler. Varsayılan bridge ağında bu özellik yoktur (Link kullanılması gerekir).
  • Daha İyi İzolasyon: Sadece aynı ağdaki konteynerlar birbirini görebilir.
  • Dinamik Konfigürasyon: Çalışan konteynerları ağdan ayırabilir veya yeni ağlara bağlayabilirsiniz.
# Yeni bir bridge ağı oluşturma
docker network create --driver bridge uygulama_agi

# Konteynerı bu ağda başlatma
docker run -d --name web_app --network uygulama_agi nginx

3. Pratik Senaryo: Web Uygulaması ve Veritabanı İletişimi

Gerçek bir senaryoda, bir Python Flask uygulamasının bir Redis veritabanına bağlanması gerektiğini varsayalım. Burada IP adresi kullanmak yerine Docker DNS servisinden yararlanacağız.

Adım 1: Ağ Oluşturma

docker network create backend_net

Adım 2: Veritabanını Başlatma

docker run -d --name redis_db --network backend_net redis:alpine

Adım 3: Uygulamayı Başlatma ve Bağlanma

Uygulama kodunuzda bağlantı adresi olarak redis://redis_db:6379 kullanabilirsiniz. Docker, redis_db ismini otomatik olarak ilgili konteynerın IP'sine çözümleyecektir.

docker run -d --name flask_app \
  --network backend_net \
  -p 5000:5000 \
  my-flask-app

4. Docker Compose ile Ağ Yönetimi

Docker Compose, ağ yönetimini otomatize eder. Bir docker-compose.yml dosyası çalıştırıldığında, Docker otomatik olarak projeye özel bir ağ oluşturur.

version: '3.8'
services:
  web:
    image: nginx:latest
    networks:
      - frontend
  api:
    image: my-api:v1
    networks:
      - frontend
      - backend
  db:
    image: postgres:15
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true # Dış dünyaya kapalı, sadece konteynerlar arası
Uzman İpucu: Yukarıdaki örnekte db servisi frontend ağına dahil edilmemiştir. Bu, veritabanının dış internetten veya web servisinden gelebilecek doğrudan ataklardan izole edilmesini sağlar (Security Best Practice).

5. Docker Network Debugging ve İnceleme

Ağ sorunlarını gidermek için Docker'ın sunduğu yerleşik araçları kullanmak çok önemlidir. Bir ağın detaylarını (bağlı konteynerlar, IP adresleri vb.) görmek için inspect komutu kullanılır.

# Ağ detaylarını görüntüleme
docker network inspect backend_net

# Konteynerın hangi IP'yi aldığını kontrol etme
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id

Yaygın Sorunlar ve Çözümleri

  • Port Çakışması: Host modunda çalışırken iki konteyner aynı portu kullanamaz.
  • DNS Çözümleme Hatası: Konteynerların aynı ağda (network) olduğundan emin olun.
  • Firewall (iptables): Bazı Linux dağıtımlarında Docker'ın iptables kuralları işletim sistemi firewall'u ile çakışabilir.

6. Sonuç ve Best Practices

Docker networking yapısını doğru kurgulamak, uygulamanızın güvenliğini ve performansını doğrudan etkiler. Özetle şu kurallara dikkat edilmelidir:

  • Varsayılan bridge ağını production'da kullanmayın; kendi ağınızı oluşturun.
  • Konteynerlar arası iletişimde IP adresi değil, Container Name kullanın.
  • Hassas servisleri (DB, Cache) internal: true parametresi ile dış dünyadan izole edin.
  • Gereksiz yere host network modunu kullanmaktan kaçının, bu izolasyonu ortadan kaldırır.

Docker ağ yönetimi hakkında daha fazla bilgi için Resmi Docker Networking Dokümantasyonu adresini ziyaret edebilirsiniz.