İçindekiler
Docker hakkındaki yazıların çoğu ya onu her derde deva gibi anlatıyor ya da hiç anlatmıyor. Ben ortada bir yerden başlayacağım: Docker'ın ne olduğundan, hangi sorunu gerçekten çözdüğünden ve ne zaman gereksiz bir katman olduğundan.
Konteyner nedir, ne değildir?
Konteyner, bir uygulamayı ve ihtiyaç duyduğu her şeyi (kütüphaneler, belirli bir PHP ya da Node sürümü, sistem paketleri) bir arada paketleyip, ana sistemden yalıtılmış bir ortamda çalıştırmanın yoludur.
Sanal makineyle karıştırılır ama aynı şey değildir. Sanal makine kendi işletim sistemi çekirdeğini çalıştırır. Konteyner ise ana makinenin çekirdeğini paylaşır; yalnızca dosya sistemi, ağ ve süreç alanı ayrılır. Bu yüzden saniyeler içinde açılır ve çok daha az kaynak tüketir. Bunun bir bedeli de var: Konteyner yalıtımı, sanal makine kadar güçlü bir güvenlik sınırı değildir.
Hangi sorunları çözer?
1. "Bende çalışıyordu." Geliştiricinin bilgisayarında PHP 8.3, sunucuda 8.1 varsa sürprizler kaçınılmazdır. Docker imajı, uygulamanın çalıştığı ortamı birebir tarif eder. Geliştirmede, testte ve canlıda aynı imaj çalışır.
2. Yan yana farklı sürümler. Bir projeniz PHP 7.4, diğeri 8.3 istiyor. Ya da biri MySQL 5.7, diğeri 8.0. Aynı makinede bunları kurmak zahmetlidir. Konteynerlerle her proje kendi sürümünü getirir.
3. Yeni geliştiricinin ilk günü. "Şu paketleri kur, şu ayarı yap, şu dosyayı kopyala" diye uzayan bir belge yerine:
git clone ...
docker compose up
4. Tekrarlanabilir dağıtım. İmaj bir kez oluşturulur ve sürüm numarasıyla etiketlenir. Geri dönmek gerektiğinde bir önceki etiketi çalıştırmak yeterlidir.
Basit bir örnek
Bir PHP uygulaması ve veritabanı için compose.yaml:
services:
web:
image: php:8.3-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mariadb:11
environment:
MARIADB_DATABASE: uygulama
MARIADB_USER: uygulama
MARIADB_PASSWORD: gelistirme-sifresi
MARIADB_ROOT_PASSWORD: gelistirme-root
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
docker compose up -d komutundan sonra uygulama http://localhost:8080 adresinde açılır. Veritabanı verisi dbdata biriminde (volume) saklanır; konteyneri silseniz bile veri kaybolmaz.
Sık yapılan hatalar
- Veriyi konteynerin içinde tutmak. Konteynerler geçicidir. Veritabanı dosyaları, yüklenen görseller ve loglar mutlaka bir birimde (volume) ya da dışarıda durmalı.
- Her şeyi root olarak çalıştırmak. İmajlarda mümkün olduğunca ayrıcalıksız bir kullanıcı kullanın.
latestetiketine güvenmek.mariadb:latestbugün bir sürüm, altı ay sonra başka bir sürüm olur. Sürümü açıkça yazın.- Şifreleri imajın içine gömmek. İmajlar paylaşılır ve katmanları okunabilir. Gizli bilgileri çalışma zamanında ortam değişkeni ya da secret olarak verin.
- Portları gereksiz yere dışarı açmak.
3306:3306satırı veritabanını internete açabilir. Docker, güvenlik duvarı kurallarını kendi yönettiği içinufwya dafirewalldkurallarınızı atlayabilir. Veritabanını dışarı açmanız gerekmiyorsa port satırını hiç yazmayın ya da127.0.0.1:3306:3306biçimini kullanın.
Ne zaman gereksiz?
Dürüst olmak gerekirse, her proje Docker'a ihtiyaç duymaz:
- Paylaşımlı hostingde çalışan tek bir WordPress sitesi için Docker bir şey kazandırmaz; çoğu zaman zaten kullanamazsınız bile.
- Tek kişinin geliştirdiği, tek sunucuda çalışan küçük bir uygulamada, düzgün belgelenmiş bir kurulum betiği çoğu zaman yeterlidir.
- Ekipte kimse konteyner bilmiyorsa ve canlı ortamı yönetecek kimse yoksa, Docker çözdüğünden fazla sorun getirebilir. Konteynerlerin de güncellenmesi, loglarının izlenmesi ve disk kullanımlarının kontrol edilmesi gerekir.
docker system dfkomutunu ilk çalıştırdığınızda şaşırabilirsiniz.
Başlamak için öneri
Docker'ı önce geliştirme ortamında kullanmaya başlayın. Veritabanı, Redis ve e-posta yakalayıcı (Mailpit gibi) için konteyner kullanmak düşük riskli ve hemen faydalı bir başlangıçtır. Canlı ortama taşımayı ise ekip ve süreçler hazır olduğunda düşünün.
Docker bir amaç değil, bir araçtır. Çözdüğü sorunu yaşıyorsanız harikadır. Yaşamıyorsanız beklemenin hiçbir zararı yok.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.