Ana içeriğe geç
Kategoriye Dön

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.

Okuma süresi: 16 dk Konteyner & Orkestrasyon
dockervolumenetworkkonteynerdepolamabridgeoverlay

İç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ürAçıklamaKullanım Durumu
Named VolumeDocker tarafından yönetilenVeritabanı, uygulama verisi
Bind MountHost dizini bağlamaGeliştirme ortamı, config dosyaları
tmpfs MountBellek tabanlı geçiciHassas geçici veriler

Named Volume Yönetimi

hljs bash
# 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

hljs bash
# 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ı

hljs bash
# 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

hljs yaml
# 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

hljs bash
# 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)

hljs bash
# 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

hljs bash
# 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

hljs bash
# Ağ erişimi olmayan konteyner
docker run -d \
  --name isolated \
  --network none \
  myapp

Docker Network Yönetimi

hljs bash
# 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

hljs yaml
# 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)

hljs bash
# 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

hljs bash
# 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.