Docker Kurulumu ve Konfigürasyonu
Sunucularımızda uygulamaları izole etmek ve kolay yönetmek için Docker ve Docker Compose kullanıyoruz.
1. Kurulum (Resmi Yöntem - Production Grade) 🏭
Prodüksiyon ortamları için en güvenli ve güncel yöntem, Docker'ın kendi apt deposunu kullanmaktır.
1.1. Kritik Güvenlik Uyarısı (Firewall) 🛡️
[!WARNING] > Docker ve UFW Çatışması: Docker, container'ları dışarı açarken (binding ports)
iptableskurallarını doğrudan değiştirir ve UFW'yi BYPASS EDER. Yaniufw statusçıktısında port kapalı görünse bile, Docker container'ınız tüm dünyaya açık olabilir! Çözüm: Bu rehberin ilerleyen kısımlarında veya Firewall Rehberi'nde bahsedilenufw-dockeraracını mutlaka kullanın.
1.2. Eski Sürümleri Temizle 🧹
Sistemde kurulu (Ubuntu ile gelen) eski veya çakışan paketler varsa temizleyelim:
sudo apt remove docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc
# "Package not found" derse sorun yok, devam edin.
1.3. Docker Deposunu (Repository) Ekleme
-
Gerekli sertifika araçlarını kurun:
-
Docker'ın resmi GPG anahtarını indirin ve güvenli klasöre kaydedin:
-
Depoyu kaynak listenize (
sources.list) ekleyin: -
Paket listesini güncelleyin:
1.4. Docker Engine Kurulumu 📦
Artık en güncel sürümü kurabiliriz:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[!NOTE] Eski
docker-compose(Python tabanlı) yerine artıkdocker-compose-plugin(Go tabanlı,docker composekomutu) kullanıyoruz.
1.5. Doğrulama (Test) 🧪
Her şeyin doğru kurulduğunu basit bir imaj çalıştırarak görelim:
(Ekrana "Hello from Docker!" yazan bir mesaj geldiyse kurulum başarılıdır.)
1.6. Sudo'suz Kullanım (Opsiyonel ama Önerilen)
Her komutun başına sudo yazmak yorucudur. Mevcut kullanıcınızı docker grubuna ekleyin:
Artık sudo olmadan deneyin:
2. Docker Storage (Kritik)
Varsayılan olarak Docker, tüm imajları ve volume'leri /var/lib/docker altında tutar. Bu klasör "Boot Volume" üzerindedir. Eğer bu disk dolarsa sunucu çöker. Eğer sunucu bozulursa verileriniz gider.
Bu yüzden Docker verilerini harici Block Volume'e taşımalıyız.
[!IMPORTANT] Önce Oracle Block Volume rehberindeki adımları tamamlayıp diski
/mnt/blockvolumealtına mount ettiğinizden emin olun.
Data Root Değiştirme Adımları
-
Klasörü Hazırla:
-
Konfigürasyon Dosyasını Düzenle:
/etc/docker/daemon.jsondosyasını oluşturun veya düzenleyin:İçeriği şu şekilde olmalıdır:
{ "data-root": "/mnt/blockvolume/docker-data", "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }(Not: Log ayarlarını da ekledik ki loglar diski doldurmasın)
-
Docker'ı Yeniden Başlat:
-
Doğrulama:
Çıktıda/mnt/blockvolume/docker-datagörüyorsanız işlem başarılıdır! 🎉
3. Temel Komutlar
# Arkaplanda çalıştır
docker compose up -d
# Logları izle
docker compose logs -f
# Tüm sistemi temizle (Kullanılmayan imajlar, containerlar)
docker system prune -a
4. Docker Compose Mantığı (Neden Kullanıyoruz?)
Eğer Docker'ı "elle" (docker run ...) kullanıyorsanız, muhtemelen şöyle uzun komutlar yazıyorsunuzdur:
Bu yöntem yorucudur ve hataya açıktır. Yarın bu komutu hatırlayabilecek misiniz? Muhtemelen hayır.
Compose: Sizin "Manifesto"nuzdur 📜
Docker Compose, "Benim sunucumda ne çalışmalı?" sorusunun yazılı cevabıdır (docker-compose.yml).
Analoji:
- Docker Run: Garsona sözlü olarak "Bana hamburger getir, soğansız olsun, yanında kola olsun, buzlu olsun..." demek gibidir.
- Docker Compose: Masaya "Menü"yü bırakıp "Bunu getir" (
docker compose up -d) demek gibidir. Mutfak ne yapacağını zaten menüden okur.
Dockerfile vs Docker Compose: Fark Nedir?
Bu ikisi karıştırılır ama görevleri farklıdır:
- Dockerfile (Tarif): "Bu yemeğin içinde ne var?"
- Ubuntu üzerine Python kur, kodlarımı kopyala, kütüphaneleri yükle.
- Sonuç: Bir Image (Kalıp) çıkar.
- Docker Compose (Servis): "Bu yemek nasıl servis edilecek?"
- Oluşan Image'ı al, 80 portunu aç, şu veritabanına bağla, şu diski kullan.
- Sonuç: Çalışan bir Container çıkar.
Soru: Compose, Dockerfile'ı Nasıl Kullanır? (image vs build)
Compose dosyasında iki yöntem kullanabilirsiniz:
Yöntem 1: Hazır Kullan (Image) İnternetten (Docker Hub) hazır paket indirir.
Yöntem 2: Kendin Pişir (Build) 👨🍳
Sizin sorduğunuz senaryo budur. build: . dediğinizde Compose şunları yapar:
- Klasördeki
Dockerfile'ı okur. - Ondan bir Image oluşturur (Build eder).
- Sonra o Image'ı çalıştırır.
services:
api:
build: . # Buradaki Dockerfile'a bak ve build et!
ports:
- "5000:5000"
volumes:
- .:/app
Böylece docker build ... komutuyla uğraşmadan, tek bir docker compose up -d --build komutuyla hem kodunuzu derler hem sunucuyu ayağa kaldırırsınız.