Docker Volume ve Network Yönetimi: Kalıcı Depolama ve Ağ Yapılandırması
Docker volume türleri (named, bind mount, tmpfs), volume yönetimi, Docker network modları (bridge, host, overlay), özel ağ oluşturma ve konteyner iletişimi. Kapsamlı rehber.
İçindekiler
Docker Volume ve Network Yönetimi
Docker konteynerler varsayılan olarak geçicidir — konteyner silindiğinde içindeki veriler de kaybolur. Volume'lar bu sorunu çözer ve verilerin konteyner yaşam döngüsünden bağımsız kalmasını sağlar. Docker network'leri ise konteynerler arası ve dış dünya ile iletişimi yönetir.
Docker Volume Türleri
| Tür | Açıklama | Kullanım Durumu |
|---|---|---|
| Named Volume | Docker tarafından yönetilen | Veritabanı, uygulama verisi |
| Bind Mount | Host dizini bağlama | Geliştirme ortamı, config dosyaları |
| tmpfs Mount | Bellek tabanlı geçici | Hassas geçici veriler |
Named Volume Yönetimi
# Volume oluştur
docker volume create myapp-data
# Volume'ları listele
docker volume ls
# Volume detaylarını görüntüle
docker volume inspect myapp-data
# Volume'u sil
docker volume rm myapp-data
# Kullanılmayan volume'ları temizle
docker volume prune
# Tüm volume'ları temizle (dikkatli!)
docker volume prune -a
Named Volume ile Konteyner Çalıştırma
# Volume bağlayarak MySQL çalıştır
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=GucluSifre123! \
-e MYSQL_DATABASE=myapp \
-v mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0
# Volume bağlayarak PostgreSQL çalıştır
docker run -d \
--name postgres-db \
-e POSTGRES_PASSWORD=GucluSifre123! \
-e POSTGRES_DB=myapp \
-v postgres-data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:15
Bind Mount Kullanımı
# Mevcut dizini konteyner içine bağla
docker run -d \
--name nginx-web \
-v /home/user/website:/usr/share/nginx/html:ro \
-p 80:80 \
nginx:latest
# Geliştirme ortamı için bind mount
docker run -it \
--name node-dev \
-v $(pwd):/app \
-w /app \
-p 3000:3000 \
node:20 \
npm run dev
# Config dosyası bağlama
docker run -d \
--name nginx-custom \
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
-p 80:80 \
nginx:latest
Docker Compose ile Volume
# docker-compose.yml
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: GucluSifre123!
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
ports:
- "3306:3306"
app:
image: myapp:latest
volumes:
- app-uploads:/app/uploads
- ./config:/app/config:ro
depends_on:
- db
volumes:
mysql-data:
driver: local
app-uploads:
driver: local
Volume Yedekleme ve Geri Yükleme
# Volume'u yedekle (tar arşivi)
docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/mysql-backup.tar.gz -C /data .
# Volume'u geri yükle
docker run --rm \
-v mysql-data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/mysql-backup.tar.gz -C /data
# Volume'u başka bir host'a kopyala
docker run --rm \
-v mysql-data:/data \
alpine tar czf - -C /data . | ssh user@remote-host 'docker run --rm -i -v mysql-data:/data alpine tar xzf - -C /data'
Docker Network Modları
Bridge Network (Varsayılan)
# Varsayılan bridge network
docker run -d --name web nginx
# Konteyner 172.17.0.x IP alır
# Özel bridge network oluştur
docker network create myapp-network
# Konteyneri özel network'e bağla
docker run -d \
--name web \
--network myapp-network \
nginx
docker run -d \
--name db \
--network myapp-network \
-e MYSQL_ROOT_PASSWORD=GucluSifre123! \
mysql:8.0
# Özel network'te konteynerler isimle birbirini bulabilir
docker exec web ping db # 'db' hostname ile erişim
Host Network
# Host network modunda çalıştır (Linux only)
docker run -d \
--name nginx-host \
--network host \
nginx
# Konteyner host'un ağ arayüzünü doğrudan kullanır
# Port mapping gerekmez
None Network
# Ağ erişimi olmayan konteyner
docker run -d \
--name isolated \
--network none \
myapp
Docker Network Yönetimi
# Network'leri listele
docker network ls
# Network detaylarını görüntüle
docker network inspect myapp-network
# Network oluştur
docker network create \
--driver bridge \
--subnet 172.20.0.0/16 \
--gateway 172.20.0.1 \
myapp-network
# Konteyneri network'e bağla
docker network connect myapp-network existing-container
# Konteyneri network'ten ayır
docker network disconnect myapp-network existing-container
# Network'ü sil
docker network rm myapp-network
# Kullanılmayan network'leri temizle
docker network prune
Docker Compose ile Network
# docker-compose.yml
version: '3.8'
services:
frontend:
image: nginx:latest
networks:
- frontend-net
ports:
- "80:80"
backend:
image: myapp:latest
networks:
- frontend-net
- backend-net
db:
image: mysql:8.0
networks:
- backend-net
environment:
MYSQL_ROOT_PASSWORD: GucluSifre123!
networks:
frontend-net:
driver: bridge
backend-net:
driver: bridge
internal: true # Dış erişim yok
Overlay Network (Docker Swarm)
# Swarm başlat
docker swarm init
# Overlay network oluştur
docker network create \
--driver overlay \
--attachable \
swarm-network
# Service oluştur ve overlay network'e bağla
docker service create \
--name web \
--network swarm-network \
--replicas 3 \
nginx
Konteyner Arası İletişim Sorunlarını Giderme
# Konteyner IP adresini öğren
docker inspect CONTAINER_NAME | grep IPAddress
# Konteyner içinden ping testi
docker exec CONTAINER_NAME ping -c 3 OTHER_CONTAINER
# Konteyner içinden curl testi
docker exec CONTAINER_NAME curl http://other-service:8080/health
# Network bağlantılarını görüntüle
docker exec CONTAINER_NAME netstat -tulpn
# DNS çözümlemesini test et
docker exec CONTAINER_NAME nslookup db
# Network istatistikleri
docker stats CONTAINER_NAME
Sonuç
Docker volume ve network yönetimi, production-grade konteyner altyapısının temel taşlarıdır. Named volume'lar ile verilerinizi güvenle saklayın, özel bridge network'ler ile konteynerlerinizi izole edin ve Docker Compose ile tüm altyapıyı kod olarak tanımlayın. REXE sunucularında bu yapılandırmalar ile güvenilir ve ölçeklenebilir konteyner ortamları oluşturabilirsiniz.
İlgili Makaleler
K3s ile Kubernetes Kurulumu: Hafif Konteyner Orkestrasyonu
K3s ile tek node ve çok node Kubernetes cluster kurulumu, kubectl kullanımı, deployment ve service oluşturma, Helm ile uygulama yönetimi. VPS üzerinde Kubernetes rehberi.
Konteyner Loglama: Docker ve Kubernetes Log Yönetimi
Docker log sürücüleri, docker logs komutu, Kubernetes pod logları, merkezi log toplama (Loki, ELK Stack), log rotasyonu ve production ortamında log yönetimi en iyi pratikleri.
Docker Güvenliği: Konteyner Ortamını Sertleştirme
Docker güvenlik en iyi pratikleri: root olmayan kullanıcı, read-only filesystem, seccomp profilleri, image tarama, Docker socket güvenliği, network izolasyonu ve secrets yönetimi.