Docker Nedir ve Neden Kullanmalısınız?
Docker, uygulamaları ve ihtiyaç duyduğu bileşenleri container (konteyner) adı verilen izole ortamlarda çalıştırmaya yarayan bir platformdur.
İlk bakışta Docker biraz karmaşık görünebilir. Ancak temel amacı oldukça basittir:
Bir uygulamanın çalışması için gereken ortamı, uygulamanın kendisiyle birlikte paketlemek ve farklı sistemlerde mümkün olduğunca aynı şekilde çalıştırabilmek.
Bu rehberde Docker’ın nasıl kurulacağından çok, neden kullanıldığı, hangi sorunları çözdüğü ve hangi durumlarda mantıklı olduğu anlatılacaktır.
1. Docker Neden Ortaya Çıktı?
Bir programı normal şekilde kurduğunuzu düşünelim.
Örneğin bir web uygulaması çalıştıracaksınız.
Uygulamanın çalışması için şunlar gerekebilir:
-
Belirli bir Python sürümü
-
Belirli Python paketleri
-
Bir veritabanı
-
Bir web sunucusu
-
Özel sistem ayarları
-
Belirli ortam değişkenleri
Bilgisayarınızda Python’ın daha yeni bir sürümü varsa uygulama çalışmayabilir.
Bir başka sunucuda farklı bir kütüphane sürümü varsa yine sorun çıkabilir.
Sonuç olarak:
“Benim bilgisayarımda çalışıyor ama sunucuda çalışmıyor.”
gibi problemler ortaya çıkabilir.
Docker’ın çözmeye çalıştığı problemlerden biri tam olarak budur.
2. Docker’ın Temel Mantığı
Docker ile uygulamanın ihtiyaç duyduğu çalışma ortamını bir container image (container imajı) içerisinde tanımlayabilirsiniz.
Daha sonra bu image kullanılarak bir veya daha fazla container oluşturulabilir.
Basitçe:
Dockerfile
↓
Docker Image
↓
Docker Container
↓
Uygulama
Burada her parçanın farklı bir görevi vardır.
3. Container Nedir?
Container, uygulamanın çalıştığı izole bir ortamdır.
Örneğin aynı bilgisayarda:
Container 1 → Web sitesi
Container 2 → Veritabanı
Container 3 → API
Container 4 → Redis
çalışabilir.
Bu uygulamalar birbirinden belirli ölçülerde izole edilebilir.
Ancak container’lar sanal makine ile aynı şey değildir.
4. Container ile Sanal Makine Arasındaki Fark
Sanal makinede genellikle ayrı bir işletim sistemi çalıştırılır.
Örneğin:
Bilgisayar
├── Windows
│
└── Virtual Machine
└── Ubuntu
└── Uygulama
Docker container’larında ise aynı Linux kernel’i paylaşan izole çalışma ortamları kullanılır.
Basitleştirilmiş olarak:
Sunucu
└── Linux Kernel
├── Container
│ └── Uygulama
│
├── Container
│ └── Uygulama
│
└── Container
└── Uygulama
Bu nedenle container’lar birçok kullanım senaryosunda sanal makinelere göre daha hafif olabilir.
Ancak container’lar tamamen risksiz veya tamamen izole bir sanal bilgisayar değildir. Güvenlik ve izolasyon ihtiyaçlarına göre ayrıca değerlendirme yapılmalıdır.
5. Docker Image Nedir?
Image, container oluşturmak için kullanılan bir şablondur.
Örneğin bir image içerisinde:
Ubuntu tabanı
Python
Python paketleri
Uygulama
Çalıştırma komutu
tanımlanmış olabilir.
Bu image’dan container oluşturabilirsiniz.
Image
├── Container 1
├── Container 2
└── Container 3
Yani image’ı bir şablon, container’ı ise bu şablondan oluşturulmuş çalışan örnek gibi düşünebilirsiniz.
6. “Bağımlılık Sorunu” Nedir?
Bir uygulama başka yazılımlara ihtiyaç duyuyorsa bunlara dependency (bağımlılık) denir.
Örneğin:
Uygulama
├── Python 3.11
├── Flask 3.x
├── PostgreSQL
└── Diğer paketler
Sisteminize farklı sürümler kurulduğunda uygulama bozulabilir.
Docker kullanıldığında uygulamanın ihtiyaç duyduğu ortamın tanımı image’a dahil edilebilir.
Böylece:
Benim bilgisayarım
↓
Docker Container
Sunucu
↓
Docker Container
şeklinde daha tutarlı bir çalışma ortamı oluşturabilirsiniz.
7. “Benim Bilgisayarımda Çalışıyor” Sorunu
Docker’ın en önemli kullanım amaçlarından biri budur.
Örneğin geliştirici bilgisayarında:
Ubuntu
Python 3.11
Node.js
PostgreSQL
kullanıyor.
Sunucuda ise:
Debian
Python 3.12
Farklı PostgreSQL sürümü
bulunuyor.
Uygulamanın doğrudan sunucuda çalıştırılması sırasında uyumsuzluk çıkabilir.
Docker yaklaşımında ise çalışma ortamı daha kontrollü biçimde tanımlanabilir.
Bu da özellikle:
-
Geliştirme
-
Test
-
Sunucuya dağıtım (deployment)
aşamalarında avantaj sağlayabilir.
8. Docker Neden Sunucularda Bu Kadar Kullanılıyor?
Docker özellikle sunucu tarafında oldukça kullanışlıdır.
Örneğin bir sunucuda şu servislerin çalıştığını düşünün:
Nginx
PostgreSQL
Redis
Web uygulaması
API
Monitoring
Bunların tamamını doğrudan işletim sistemine kurmak yerine ayrı container’lar halinde yönetebilirsiniz.
Örneğin:
Sunucu
│
├── nginx
├── postgres
├── redis
├── app
└── monitoring
Her servisin kendi container’ı olabilir.
Bu yapı sayesinde servisleri birbirinden daha kolay ayırabilirsiniz.
9. Servisleri Birbirinden Ayırmak
Docker’ın önemli avantajlarından biri de izolasyon mantığıdır.
Örneğin bir sunucuda iki farklı uygulama bulunuyor:
Uygulama A → Python 3.10
Uygulama B → Python 3.12
Normal kurulumda sürüm çakışmaları yaşanabilir.
Container yaklaşımında:
Container A
└── Python 3.10
Container B
└── Python 3.12
şeklinde ayrı çalışma ortamları oluşturulabilir.
Bu, özellikle çok sayıda uygulamanın bulunduğu sistemlerde oldukça kullanışlıdır.
10. Taşınabilirlik
Docker’ın diğer önemli avantajlarından biri **portability (taşınabilirlik)**tir.
Bir uygulamanın Docker yapılandırmasını hazırladıktan sonra aynı yapıyı farklı sunucularda çalıştırabilirsiniz.
Örneğin:
Bilgisayar
↓
Test Sunucusu
↓
VDS
↓
Dedicated Server
Her ortamda Docker bulunuyorsa aynı image kullanılabilir.
Elbette işletim sistemi, CPU mimarisi, donanım, ağ ve diğer çevresel farklılıklar yine dikkate alınmalıdır.
11. Kurulumları Tekrarlamak Daha Kolaydır
Normal bir sunucu kurulumunda şu işlemler yapılabilir:
Paketleri kur
Konfigürasyonu yap
Klasör oluştur
Servisi ayarla
Bağımlılıkları kur
Environment değişkenlerini ayarla
Bunları her sunucuda tekrar yapmak zaman alabilir.
Docker’da ise ortamın nasıl oluşturulacağı kod ve yapılandırma dosyalarıyla tanımlanabilir.
Bu yaklaşım özellikle tekrar tekrar sunucu kuran kişiler için büyük kolaylık sağlar.
12. Dockerfile Nedir?
Dockerfile, bir Docker image’ın nasıl oluşturulacağını tarif eden dosyadır.
Örneğin basit bir Dockerfile şu mantığa sahip olabilir:
FROM python:3.12
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
Burada genel olarak:
FROM
hangi temel image’ın kullanılacağını,
WORKDIR
çalışma klasörünü,
COPY
dosyaların container’a kopyalanmasını,
RUN
image oluşturulurken çalıştırılacak komutları,
CMD
container başlatıldığında çalışacak komutu belirtir.
Bu sayede uygulamanın çalışma ortamı yazılı olarak tanımlanabilir.
13. Docker Compose Nedir?
Birden fazla container kullanmaya başladığınızda Docker Compose oldukça kullanışlı hale gelir.
Örneğin bir web uygulamanız var:
Web uygulaması
+
PostgreSQL
+
Redis
Bunların her birini ayrı ayrı yönetmek yerine Compose ile birlikte tanımlayabilirsiniz.
Örneğin:
services:
app:
image: my-app
database:
image: postgres
redis:
image: redis
Buradaki fikir:
Birden fazla servisin birlikte nasıl çalışacağını tek bir yapılandırmada tanımlamak.
Docker Compose özellikle küçük ve orta ölçekli projelerde oldukça kullanışlıdır.
14. Güncelleme ve Geri Dönüş
Docker image’ları sürümlendirilebilir.
Örneğin:
my-app:1.0
my-app:1.1
my-app:2.0
gibi farklı sürümler bulunabilir.
Yeni sürümde problem çıkarsa eski image’ın kullanılması mümkün olabilir.
Bu da deployment süreçlerini daha kontrollü hale getirebilir.
Ancak yalnızca image’ı eski sürüme döndürmek her zaman yeterli değildir.
Özellikle:
-
Veritabanı değişiklikleri
-
Kalıcı veriler
-
Configuration değişiklikleri
ayrıca planlanmalıdır.
15. Docker Verileri Nerede Tutar?
Container’lar geçici çalışma ortamları olarak düşünülebilir.
Bu yüzden önemli veriler doğrudan yalnızca container’ın kendi dosya sistemi içinde tutulmamalıdır.
Örneğin:
PostgreSQL
↓
Volume
↓
Kalıcı veriler
Docker’da bunun için volume ve bind mount gibi yöntemler kullanılabilir.
Örneğin veritabanı container’ını silseniz bile doğru şekilde yapılandırılmış bir volume kullanılıyorsa veriler korunabilir.
Docker kullanırken “container’ı silersem ne olur?” sorusunu mutlaka düşünün.
16. Docker’ın Avantajları
Docker özellikle şu durumlarda güçlüdür:
Taşınabilirlik
Uygulamanın çalışma ortamını daha kolay başka sistemlere taşıyabilirsiniz.
İzolasyon
Servisleri birbirinden ayırabilirsiniz.
Tekrarlanabilirlik
Aynı ortamı tekrar oluşturmak kolaylaşır.
Deployment
Uygulamaları sunuculara dağıtmak daha düzenli hale gelebilir.
Bağımlılık yönetimi
Farklı uygulamaların farklı sürümlere ihtiyaç duyması daha kolay yönetilebilir.
Test
Bir uygulamayı ayrı bir container içerisinde deneyebilirsiniz.
17. Docker’ın Dezavantajları
Docker her durumda mükemmel çözüm değildir.
Ekstra karmaşıklık
Küçük bir uygulamayı Docker’a almak bazen gereksiz olabilir.
Öğrenme süreci
Başlangıçta şu kavramların öğrenilmesi gerekir:
Image
Container
Volume
Network
Dockerfile
Compose
Registry
Depolama kullanımı
Çok sayıda image ve container zamanla ciddi miktarda disk alanı kaplayabilir.
Yanlış yapılandırma
Volume, network veya izinlerin yanlış yapılandırılması sorunlara yol açabilir.
Güvenlik
Docker kullanmak uygulamayı otomatik olarak güvenli hale getirmez.
Image’ların kaynağı, güncelliği, container izinleri, secrets yönetimi ve host güvenliği ayrıca değerlendirilmelidir.
18. Docker Herkes İçin Gerekli mi?
Hayır.
Örneğin yalnızca bilgisayarınızda:
Firefox
LibreOffice
Discord
VLC
kullanıyorsanız Docker kullanmanız gerekmeyebilir.
Docker’ın asıl faydası daha çok:
-
Sunucu yönetenler
-
Yazılım geliştiriciler
-
Web uygulaması çalıştıranlar
-
Self-hosting yapanlar
-
Birden fazla servis kullananlar
-
Test ortamları oluşturanlar
için ortaya çıkar.
19. Docker Ne Zaman Kullanılmalı?
Şu durumlardan biri varsa Docker mantıklı olabilir:
Birden fazla servis çalıştırıyorum.
Uygulamamın bağımlılıkları fazla.
Aynı uygulamayı farklı sunucularda çalıştıracağım.
Sunucuyu yeniden kurduğumda ortamı tekrar oluşturmak istiyorum.
Self-hosted uygulamalar çalıştırıyorum.
Test ortamı oluşturmak istiyorum.
20. Docker Ne Zaman Gereksiz Olabilir?
Şöyle bir durum düşünün:
Tek bir küçük Python scripti
veya:
Tek bir basit web sitesi
çalıştırıyorsunuz.
Böyle bir durumda Docker kullanmak bazen uygulamanın kendisinden daha fazla yönetim gerektirebilir.
Bu yüzden:
Docker kullanmak amaç değil, bir araçtır.
İhtiyaç varsa kullanmak gerekir.
21. Gerçek Hayattan Basit Bir Örnek
Bir Linux sunucunuz olduğunu düşünelim.
Sunucuda:
Ubuntu/Debian
üzerinde şu servisleri çalıştırmak istiyorsunuz:
Web sitesi
PostgreSQL
Redis
Docker kullanmadan bunları doğrudan işletim sistemine kurabilirsiniz.
Docker kullanarak ise:
Sunucu
│
├── Web Container
├── PostgreSQL Container
└── Redis Container
şeklinde bir yapı oluşturabilirsiniz.
Bunun avantajı, servislerin çalışma ortamlarını birbirinden ayırabilmeniz ve tüm yapıyı daha sistematik biçimde yönetebilmenizdir.
22. Docker ile Ne Tür Şeyler Çalıştırılabilir?
Docker yalnızca web sitesi çalıştırmak için kullanılmaz.
Örneğin:
-
Web sunucuları
-
Veritabanları
-
API’ler
-
Geliştirme ortamları
-
CI/CD araçları
-
Monitoring sistemleri
-
Self-hosted uygulamalar
-
Test ortamları
-
Proxy servisleri
-
Medya servisleri
-
Çeşitli sunucu uygulamaları
çalıştırılabilir.
Ancak her uygulamanın Docker için uygun olup olmadığı ayrıca değerlendirilmelidir.
23. Docker Öğrenmeye Nereden Başlamalı?
Docker’ı öğrenmeye başlarken önce şu kavramları öğrenmek yeterlidir:
1. Image
2. Container
3. Dockerfile
4. Port
5. Volume
6. Network
7. Docker Compose
Bunların mantığını anladıktan sonra komutları öğrenmek çok daha kolay hale gelir.
Örneğin daha sonra şu temel komutlarla karşılaşacaksınız:
docker pull
docker images
docker run
docker ps
docker stop
docker start
docker rm
docker exec
docker logs
docker build
Bu komutların her birinin farklı bir görevi vardır.
24. Sonuç
Docker’ın amacı:
“Her şeyi Docker’a taşımak” değildir.
Asıl amaç, uygulamaların çalıştırılmasını ve yönetilmesini daha tekrarlanabilir, taşınabilir ve düzenli hale getirmektir.
Özellikle sunucu, geliştirme ve self-hosting dünyasında Docker’ın avantajları daha belirgin hale gelir.
Ancak küçük ve basit işler için Docker kullanmak gereksiz bir karmaşıklık da oluşturabilir.
Bu yüzden Docker kullanmadan önce kendinize şu soruyu sorun:
“Docker burada gerçekten bir problemimi çözüyor mu?”
Cevap evetse Docker çok güçlü bir araç olabilir.
Kısaca
Docker
↓
Uygulama + Gereken ortam
↓
Container
↓
Daha taşınabilir ve tekrarlanabilir çalışma ortamı
Docker’ın temel mantığını anladıktan sonraki doğal adım, Docker kurulumu ve temel komutlarını öğrenmektir.
İlgili rehber:
Docker Kurulumu ve Temel Komutlar Rehberi