🐳 Docker & Containerization: Hızlı Giriş
Bu rehber, Docker ekosistemini profesyonel bir bakış açısıyla (özellikle backend odaklı) ele alan, terminal dostu bir başvuru kaynağıdır. Geliştirme ortamından prodüksiyon hattına kadar ihtiyaç duyacağın tüm temel taşları içerir.
🏗️ Docker Mimarisi: Kısa ve Öz
Docker, işletim sistemi seviyesinde sanallaştırma yaparak uygulamaları izole eder. Sanal makinelerin (VM) aksine, ana işletim sisteminin çekirdeğini (kernel) paylaşır, bu da onu çok daha hafif ve hızlı yapar.
- Docker Engine: Konteynerleri çalıştıran çekirdek yapı.
- Images: Uygulamanın çalışması için gereken her şeyin (binary, config, libs) dondurulmuş halidir.
- Containers: İmajların yaşayan, nefes alan halidir.
- Volumes: Konteynerler geçicidir (ephemeral), veriler kalıcıdır. Veriyi saklamak için kullanılırlar.
⌨️ Olmazsa Olmaz CLI Komutları
Konteyner Operasyonları
| Komut | Açıklama |
|---|---|
docker run -it --rm <image> |
İnteraktif terminal açar, çıkışta konteyneri siler. |
docker run -d -p 5000:8080 <image> |
Arka planda çalıştırır (Host:5000 -> Container:8080). |
docker logs -f <container_id> |
Logları canlı olarak takip etmeni sağlar. |
docker stats |
Çalışan konteynerlerin RAM/CPU kullanımını gösterir. |
İmaj ve Temizlik
| Komut | Açıklama |
|---|---|
docker image prune |
Kullanılmayan "dangling" imajları temizler. |
docker system prune -a --volumes |
Tüm durmuş konteynerleri, ağları ve imajları siler. |
docker inspect <id> |
Konteyner veya imajın tüm detaylarını (JSON) döner. |
📜 Dockerfile: Profesyonel Yapılandırma
İyi bir Dockerfile, Multi-Stage Build kullanmalıdır. Bu, final imajının boyutunu küçültür ve güvenliği artırır. İşte bir .NET 9/10 uygulaması için örnek:
# 1. Build Stage
FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build
WORKDIR /src
COPY ["MyApi.csproj", "./"]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish
🧩 Docker Compose: Çoklu Servis Yönetimi
Mikroservis mimarilerinde veya bağımlı servislerde (DB, Redis) hayat kurtarır.
version: '3.8'
services:
api:
build: .
ports:
- "5000:80"
environment:
- ConnectionStrings__DefaultConnection=Host=db;Database=mydb;Username=admin;Password=secret
depends_on:
- db
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
pgdata:
🌐 Networking: Konteynerler Arası İletişim
Docker'da konteynerler isimleriyle birbirlerine ulaşabilirler.
- Bridge (Varsayılan): Konteynerler arası özel bir ağ oluşturur.
- Host: Konteynerin ağ izolasyonunu kaldırır, doğrudan ana makinenin portlarını kullanır.
- None: Ağ bağlantısını tamamen kapatır.
İpucu: Docker Compose kullanırken tüm servisler otomatik olarak aynı ağa dahil edilir, bu yüzden
apiservisidbservisine doğrudanhttp://db:5432üzerinden erişebilir.
💾 Veri Kalıcılığı (Volumes vs Binds)
- Volumes: Docker tarafından yönetilir.
/var/lib/docker/volumesaltında tutulur. En güvenli yoldur. - Bind Mounts: Host makinedeki belirli bir klasörü (
C:/proje/logs) konteynere bağlar. Geliştirme aşamasında kodları canlı görmek için idealdir.
# Bind Mount örneği
docker run -v $(pwd):/app -w /app my-image dotnet watch run
🛡️ Güvenlik ve Performans İpuçları
- Root Kullanmayın:
USERkomutu ile yetkisiz bir kullanıcı oluşturup uygulamayı onunla çalıştırın. - Alpine Image Seçin: Daha küçük saldırı yüzeyi ve daha hızlı yükleme süresi için
alpinetabanlı imajları tercih edin. - .dockerignore Kullanın:
node_modules,bin/,obj/gibi gereksiz dosyaların imajın içine girmesini engelleyin. - Healthcheck Ekleyin: Konteynerin sadece "çalışıyor" olması değil, "sağlıklı" olması da önemlidir.
Not: Docker öğrenmek bir maratondur. Her hata mesajı, Linux çekirdeği ve ağ yapılandırması hakkında yeni bir ders öğretir. Logları okumaktan korkma!