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.
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ı
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
bridgeağı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: trueparametresi ile dış dünyadan izole edin. - Gereksiz yere
hostnetwork 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.