Bir web uygulamanız ve bir veritabanı container’ınız olduğunda, bu ikisinin birbirini nasıl bulup konuştuğu sorusu er ya da geç karşınıza çıkar. Docker networking, container’lar arasındaki ve container’larla dış dünya arasındaki bu iletişimi yöneten katmandır.
Docker’ın varsayılan ağ türleri
| Ağ türü | Davranış |
|---|---|
bridge (varsayılan) |
Aynı host üzerindeki container’lar, izole bir sanal ağ üzerinden birbirleriyle konuşabilir |
host |
Container, host’un ağ arayüzünü doğrudan paylaşır — izolasyon yoktur, port eşleme gerekmez |
none |
Container’ın hiçbir ağ erişimi olmaz — tamamen izole |
özel bridge |
Sizin oluşturduğunuz, isimle DNS çözümlemesi yapan özel bir ağ — önerilen yöntem |
Sorun: varsayılan bridge ağında isimle erişim yok
Docker’ın varsayılan bridge ağı, container’ların birbirine IP adresiyle erişmesine izin verir ama container isimlerini otomatik olarak çözümlemez. Bu, pratikte kullanışsızdır çünkü container’lar yeniden başladığında IP adresleri değişebilir.
Çözüm: kendi ağınızı oluşturun
# Özel bir bridge ağı oluştur
docker network create uygulama-agi
# Veritabanını bu ağa bağlı olarak başlat
docker run -d --name db --network uygulama-agi \
-e POSTGRES_PASSWORD=gizli123 postgres:16
# API'yi aynı ağa bağlı olarak başlat
docker run -d --name api --network uygulama-agi \
-e DB_HOST=db my-api:1.0
Burada kritik nokta: api container’ı, veritabanına db‘nin IP adresini bilmeden, doğrudan container ismini (db) bir hostname gibi kullanarak erişebilir. Docker, kendi ağı içinde otomatik bir DNS sunucusu çalıştırır ve container isimlerini IP’lere çözümler — bu, aynı ağdaki container’lar arasında en pratik iletişim yoludur.
Docker Compose kullanıyorsanız bu adımı elle yapmanıza gerek yok: aynı docker-compose.yml içindeki tüm servisler otomatik olarak ortak bir ağa bağlanır ve birbirlerine doğrudan servis ismiyle (db, redis, api gibi) erişebilir.
Port eşleme: dış dünyadan erişim
Container’lar arası iletişim için port eşlemeye gerek yoktur (aynı ağdaysalar container’ın kendi iç portuna doğrudan erişilir). Port eşleme (-p), sadece host makineden veya internetten container’a erişmek istediğinizde gerekir:
# Host'un 8080 portunu container'ın 80 portuna bağla
docker run -d -p 8080:80 --name web nginx:alpine
# Sadece belirli bir arayüzden (örn. localhost) erişime izin ver
docker run -d -p 127.0.0.1:8080:80 --name web nginx:alpine
-p host_portu:container_portu formatını doğru okumak önemlidir — sondaki (sağdaki) sayı her zaman container’ın içindeki porttur, ilk sayı ise dışarıdan bağlanacağınız host portudur.
Ağları listelemek ve incelemek
# Mevcut tüm ağları listele
docker network ls
# Bir ağa hangi container'ların bağlı olduğunu gör
docker network inspect uygulama-agi
# Çalışan bir container'ı sonradan başka bir ağa da bağla
docker network connect baska-ag api
Docker Compose’da ağ örneği
services:
api:
build: .
environment:
DB_HOST: db # servis ismiyle doğrudan erişim
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: gizli123
# api ve db aynı otomatik ağda — ekstra tanım gerekmez
Güvenlik açısından bir not
Bir veritabanı container’ının portunu (-p 5432:5432) doğrudan dışarıya açmak, gereksiz yere saldırı yüzeyi oluşturur. Genellikle sadece uygulamanızın erişmesi gereken bir servisin (veritabanı, cache) portunu host’a hiç eşlemeyin — aynı Docker ağındaki diğer container’lar zaten container isim çözümlemesi üzerinden erişebilir; sadece kullanıcıların doğrudan erişmesi gereken servisleri (web sunucusu, API) dışarı açın.
Container’lar artık birbiriyle güvenli şekilde konuşabiliyor. Bu imajları başka makinelerde ve ekiplerde de kullanılabilir hale getirmek için sıradaki adım, onları bir registry’e (Docker Hub veya kendi private registry’niz) göndermektir — bunu bir sonraki yazıda ele alıyoruz.