🐳 Docker Nedir ve Neden Kullanmalısınız?

:spouting_whale: 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:

:white_check_mark: Taşınabilirlik

Uygulamanın çalışma ortamını daha kolay başka sistemlere taşıyabilirsiniz.

:white_check_mark: İzolasyon

Servisleri birbirinden ayırabilirsiniz.

:white_check_mark: Tekrarlanabilirlik

Aynı ortamı tekrar oluşturmak kolaylaşır.

:white_check_mark: Deployment

Uygulamaları sunuculara dağıtmak daha düzenli hale gelebilir.

:white_check_mark: Bağımlılık yönetimi

Farklı uygulamaların farklı sürümlere ihtiyaç duyması daha kolay yönetilebilir.

:white_check_mark: Test

Bir uygulamayı ayrı bir container içerisinde deneyebilirsiniz.


17. Docker’ın Dezavantajları

Docker her durumda mükemmel çözüm değildir.

:cross_mark: Ekstra karmaşıklık

Küçük bir uygulamayı Docker’a almak bazen gereksiz olabilir.

:cross_mark: Öğrenme süreci

Başlangıçta şu kavramların öğrenilmesi gerekir:

Image
Container
Volume
Network
Dockerfile
Compose
Registry

:cross_mark: Depolama kullanımı

Çok sayıda image ve container zamanla ciddi miktarda disk alanı kaplayabilir.

:cross_mark: Yanlış yapılandırma

Volume, network veya izinlerin yanlış yapılandırılması sorunlara yol açabilir.

:cross_mark: 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.


:pushpin: 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:
:spouting_whale: Docker Kurulumu ve Temel Komutlar Rehberi

güzel anlatım olmuş