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.
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.
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.
| 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 |
# 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
# 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
# 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.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'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'
# 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 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
# Ağ erişimi olmayan konteyner
docker run -d \
--name isolated \
--network none \
myapp
# 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.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
# 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 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
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.
Named volume Docker tarafından yönetilir (/var/lib/docker/volumes/ altında saklanır), taşınabilir ve yedeklemesi kolaydır. Bind mount ise host'taki belirli bir dizini doğrudan bağlar, geliştirme ortamında kod değişikliklerini anlık görmek için idealdir. Production'da named volume, geliştirmede bind mount tercih edilir.
Konteynerler aynı özel network'te olmalıdır. Varsayılan bridge network'te konteynerler isimle birbirini bulamaz, sadece IP ile erişebilir. docker network create ile özel network oluşturun ve her iki konteyneri de bu network'e bağlayın. Sonra konteyner adını hostname olarak kullanabilirsiniz.
En güvenilir yöntem: geçici bir Alpine konteyner ile volume'u tar arşivine sıkıştırın. docker run --rm -v VOLUME_ADI:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data . komutu volume içeriğini mevcut dizine yedekler. Geri yükleme için tar xzf kullanın.
Docker Compose aynı docker-compose.yml dosyasındaki servisleri otomatik olarak aynı network'e koyar. Servisler birbirini servis adıyla bulabilir. Örneğin 'db' adlı servis, diğer servislerden 'db' hostname'i ile erişilebilir. Özel network tanımlamazsanız Compose varsayılan bir bridge network oluşturur.
Host network modu, konteynerin host'un ağ arayüzünü doğrudan kullandığı durumlarda kullanılır. Avantajı: en yüksek ağ performansı, port mapping gerekmez. Dezavantajı: izolasyon yoktur, port çakışmaları olabilir. Yüksek performanslı ağ uygulamaları veya host'un tüm ağ arayüzlerine erişim gereken durumlar için uygundur. Sadece Linux'ta çalışır.
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.
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ü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.