← Kursa Dön
📄 Text · 35 min

Docker Ekosistemi — Engine, CLI, Desktop, Hub

Bir önceki derste container nedir, nasıl çalışır, neden bu kadar önemli öğrendik. Şimdi bir adım geri çekilip büyük resme bakalım. Çünkü "Docker" dediğinde aslında tek bir araçtan bahsetmiyorsun — bir sürü bileşenin birlikte çalıştığı bir ekosistemden bahsediyorsun.

Bunu bir araba gibi düşün. Bir araba satın aldığında sadece motor almıyorsun. Motor var, direksiyon var, gösterge paneli var, bagaj var, navigasyon var. Hepsi birlikte "araba" deneyimini oluşturuyor. Docker'da da motoru (Engine), direksiyonu (CLI), gösterge panelini (Desktop) ve garajı (Hub) ayrı ayrı tanımamız lazım.

Bu derste Docker ekosisteminin her bir parçasını tek tek inceleyeceğiz. Her birinin ne işe yaradığını, ne zaman kullanılacağını ve birbirleriyle nasıl konuştuğunu anlayacaksın.


Büyük Resim — Ekosistem Haritası

Önce ekosistemi kuşbakışı görelim, sonra her bir parçaya tek tek dalacağız:

┌─────────────────────────────────────────────────────────────┐
│                    Docker Ekosistemi                         │
│                                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐  │
│  │  Docker   │  │  Docker   │  │  Docker   │  │  Docker   │  │
│  │   CLI     │  │  Desktop  │  │   Hub     │  │  Compose  │  │
│  │(komutlar) │  │  (GUI)    │  │(registry) │  │(çoklu srv)│  │
│  └────┬─────┘  └────┬─────┘  └──────────┘  └──────────┘  │
│       │              │                                      │
│  ┌────▼──────────────▼─────┐                               │
│  │     Docker Engine        │                               │
│  │  ┌─────────────────┐    │                               │
│  │  │   Docker Daemon  │    │                               │
│  │  │    (dockerd)     │    │                               │
│  │  └────────┬────────┘    │                               │
│  │  ┌────────▼────────┐    │                               │
│  │  │   containerd     │    │                               │
│  │  └────────┬────────┘    │                               │
│  │  ┌────────▼────────┐    │                               │
│  │  │      runc        │    │                               │
│  │  └─────────────────┘    │                               │
│  └─────────────────────────┘                               │
└─────────────────────────────────────────────────────────────┘

Şimdi bu diyagramdaki her kutuyu açalım.


Docker Engine — Motorun Kendisi

Docker Engine, tüm ekosistemin kalbi. Container'ları oluşturan, çalıştıran, durduran, silen — asıl işi yapan katman bu. Üç alt bileşenden oluşuyor.

Docker Daemon (dockerd) — Arka Plan Patronu

Bilgisayarında Docker kurulduğunda, arka planda sessizce çalışan bir servis başlar. Bu servisin adı Docker Daemon ve kodadı dockerd. Sen docker run nginx yazdığında aslında bu daemon'a bir istek gönderiyorsun.

Daemon ne yapıyor? Image'ları yönetiyor (indirme, build etme, push'lama). Container'ları oluşturup çalıştırıyor. Network'leri ayarlıyor. Volume'ları yönetiyor. Kısacası, Docker ile ilgili her şeyi o koordine ediyor.

Daemon'un çalışıp çalışmadığını kontrol etmek istersen:

sudo systemctl status docker

Eğer "Active: active (running)" görüyorsan, daemon hazır ve seni bekliyor. Görmüyorsan, sudo systemctl start docker ile başlatabilirsin.

containerd — Container Yaşam Döngüsü Yöneticisi

Docker Daemon'un hemen altında containerd var. Bu arkadaş container'ların yaşam döngüsünü yönetiyor — oluşturma, başlatma, durdurma, silme. Daemon ona "şu container'ı başlat" diyor, containerd de "tamam, hallederim" deyip işi yapıyor.

containerd aslında Docker'dan bağımsız bir proje. Kubernetes gibi büyük orkestratörler de containerd'yi kullanıyor. Ama senin günlük kullanımda doğrudan containerd ile konuşman gerekmez — Docker CLI her şeyi senin adına halleder.

runc — Linux Kernel ile Konuşan Katman

En alt katman runc. Bu, bir önceki derste anlattığımız namespace ve cgroup'ları Linux kernel'ından talep eden asıl bileşen. OCI (Open Container Initiative) standardına uygun çalışır. Yani, Docker standartlara bağlı — kendi kapalı sistemini dayatmıyor.

Günlük kullanımda containerd ve runc'ı düşünmene hiç gerek yok. Ama "Docker nasıl çalışıyor?" sorusuna cevap vermek istediğinde bu üç katmanı bilmek seni bir adım öne çıkarır.


Docker CLI — Senin Direksiyonun

Docker CLI (Command Line Interface), Docker ile konuştuğun arayüz. Terminalde yazdığın her docker komutu CLI üzerinden Docker Daemon'a REST API çağrısı olarak gidiyor. Yani aslında CLI bir "tercüman" — senin komutlarını daemon'un anlayacağı dile çeviriyor.

Komut Yapısı — Modern Format

Docker CLI'nin modern yapısı management commands formatını kullanıyor. Bu format daha düzenli ve anlaşılır:

docker container ls        # Çalışan container'ları listele
docker container run nginx # Yeni container oluştur ve çalıştır
docker container stop web  # Container'ı durdur
docker image ls            # Image'ları listele
docker image pull nginx    # Image indir
docker network ls          # Network'leri listele
docker volume ls           # Volume'ları listele

Pattern'ı gördün mü? docker <nesne> <eylem>. Container ile ilgili bir şey mi yapacaksın? docker container .... Image ile mi? docker image .... Çok düzenli.

Ama eski kısayollar da hâlâ çalışıyor ve pratikte çoğu kişi bunları kullanıyor:

docker ps          # = docker container ls
docker run nginx   # = docker container run nginx
docker images      # = docker image ls
docker pull nginx  # = docker image pull nginx

Hangisini kullanacağın sana kalmış. Ama management command formatını bilmek, Docker'ın yapısını kafanda düzenlemenize yardımcı olur.

Yardım Almak — En Önemli Komut

Docker'da yüzlerce flag ve opsiyon var. Hepsini ezberlemene gerek yok. İhtiyacın olduğunda --help flag'ini kullan:

docker --help                  # Genel yardım
docker run --help              # run komutu için tüm seçenekler
docker container --help        # container alt komutları
docker image --help            # image alt komutları

--help komutunu sık kullanmaktan çekinme. En deneyimli Docker kullanıcıları bile bunu sürekli yapıyor.

Sistem Bilgileri — Docker'ın Durumunu Görmek

Docker'ın ne durumda olduğunu anlamak için iki faydalı komut var:

# Kısa versiyon bilgisi
docker version

# Detaylı sistem bilgisi
docker info

docker info çıktısında dikkat etmen gereken birkaç şey var: Storage Driver'ın overlay2 olması (en performanslısı), toplam container ve image sayıları, ve Docker Root Dir (genellikle /var/lib/docker — disk alanı sorunlarında buraya bakarsın).


Docker Desktop — Geliştirici Dostu Arayüz

Docker Desktop, macOS ve Windows (ve opsiyonel olarak Linux) için geliştirilmiş bir GUI uygulaması. "GUI mu? Ben terminalde çalışırım!" diyebilirsin, ama Docker Desktop sadece bir arayüz değil — arka planda çok önemli bir iş yapıyor.

macOS ve Windows'ta Docker Nasıl Çalışıyor?

Bir önceki derste öğrendik ki Docker, Linux kernel'ın namespace ve cgroup özelliklerini kullanıyor. Peki macOS'ta veya Windows'ta Linux kernel yok — nasıl çalışıyor?

İşte Docker Desktop'un asıl sihri burada. Arka planda hafif bir Linux VM çalıştırıyor. macOS'ta Apple Hypervisor Framework'ü, Windows'ta WSL2'yi kullanarak bu VM'i yönetiyor. Container'lar bu VM'in içinde çalışıyor. Ama sen bunun farkında bile olmuyorsun — docker run nginx yazıyorsun, gerisi otomatik.

macOS / Windows:
┌─────────────────────────────────────┐
│           Docker Desktop             │
├─────────────────────────────────────┤
│     Hafif Linux VM                   │
│  (HyperKit / WSL2 / Hyper-V)       │
│  ┌─────────────────────────────┐    │
│  │      Linux Kernel           │    │
│  │  ┌──────────────────────┐   │    │
│  │  │   Docker Engine      │   │    │
│  │  │   (containerd+runc)  │   │    │
│  │  └──────────────────────┘   │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘

Docker Desktop Ne Sağlar?

Kolay kurulum ilk sırada. Docker Desktop'ı indirip çift tıkladığında Docker Engine, CLI, Compose, BuildKit — hepsi bir arada kuruluyor. Manuel kurulumla uğraşmana gerek kalmıyor.

GUI Dashboard ile container'larını, image'larını, volume'larını görsel olarak yönetebilirsin. Log'ları okumak, container'ı durdurmak, image boyutlarını görmek — hepsi birkaç tıkla.

Resource Management özelliği ile Docker'ın ne kadar CPU, RAM ve disk kullanacağını ayarlayabilirsin. macOS'ta Docker çok RAM yiyor mu? Settings → Resources'tan düşürebilirsin.

Kubernetes entegrasyonu da var — tek tıkla lokal bir Kubernetes cluster'ı ayağa kaldırabilirsin. Ama orası bu kursun kapsamı dışında.

Docker Desktop vs Docker Engine — Hangisini Nerede?

Bu çok sorulan bir soru, hemen açıklığa kavuşturalım:

Geliştirme makinende (laptop, masaüstü) Docker Desktop kullan. Kolay kurulum, GUI, macOS/Windows desteği — geliştirici deneyimini çok kolaylaştırıyor.

Sunucularda ve production'da Docker Engine kullan. GUI'ye gerek yok, ek kaynak tüketmeye gerek yok. Docker Engine, Linux'ta doğrudan kernel üzerinde çalışır — en performanslı ortam.

Lisans konusu da var: Docker Desktop, 250'den fazla çalışanı olan ve 10 milyon dolardan fazla geliri olan şirketler için ücretli. Ama bireysel kullanım ve küçük ekipler için ücretsiz.


Docker Hub — Image'ların Merkezi Deposu

Docker Hub (hub.docker.com), Docker dünyasının GitHub'ı gibi. GitHub kod barındırıyorsa, Docker Hub image barındırıyor.

Official Images — Güvenilir Kaynaklar

Docker Hub'da "Official Image" rozeti taşıyan image'lar var. Bunlar Docker tarafından doğrulanmış, güvenlik açıkları düzenli taranan ve bakımı yapılan image'lar.

docker pull nginx        # Web sunucusu
docker pull postgres     # PostgreSQL veritabanı
docker pull redis        # Cache
docker pull node         # Node.js runtime
docker pull python       # Python runtime
docker pull alpine       # Minimal Linux (~7MB!)

Her zaman official image'ları tercih et. Birileri Docker Hub'a "super-nginx" diye bir şey yüklemiş olabilir — içinde ne var belli olmaz. Official image'lar ise güvenilir.

Image İsimlendirme

Docker Hub'daki image isimleri bir yapıya sahip. Bu yapıyı anlamak çok önemli:

nginx                    # Official image (library/nginx:latest kısaltması)
nginx:1.25               # Belirli versiyon
nginx:1.25-alpine        # Versiyon + varyant
tolgahan/myapp:v1.0      # Kullanıcı image'ı
ghcr.io/user/app:v2      # Farklı registry (GitHub Container Registry)

İlk iki örnekte registry ve namespace yok — Docker Hub'ın official library'sinden geliyor. Üçüncüde tolgahan/ bir kullanıcı adı. Dördüncüde ghcr.io/ farklı bir registry.

Docker Hub ile Authentication

Docker Hub'a image push etmek veya private image'ları pull etmek için giriş yapman gerekir:

docker login
# Username: tolgahan
# Password: ********
# Login Succeeded!

docker logout   # Çıkış yap

Giriş yaptığında pull rate limit'in artar (anonim: 100 pull/6 saat, giriş yapmış: 200 pull/6 saat) ve private repository'lere erişebilirsin. Docker Hub'ın detaylarını Bölüm 2'de çok daha derinlemesine inceleyeceğiz.


Docker Compose — Çoklu Container Yönetimi

Gerçek dünyada bir uygulama nadiren tek bir container'dan oluşur. Bir web uygulaması düşün: frontend, backend API, veritabanı, cache, belki bir kuyruk sistemi. Her biri ayrı bir container. Bunların hepsini tek tek docker run ile başlatmak, sonra birbiriyle bağlamak — çok zahmetli.

İşte Docker Compose tam bu sorunu çözüyor. Tüm container'ları tek bir YAML dosyasında tanımlıyorsun ve tek bir komutla hepsini ayağa kaldırıyorsun:

# docker-compose.yml
services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"

  api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://postgres:secret@db:5432/myapp

  db:
    image: postgres:16
    environment:
      - POSTGRES_PASSWORD=secret
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
# Tüm servisleri başlat
docker compose up -d

# Tüm servisleri durdur ve temizle
docker compose down

# Logları takip et
docker compose logs -f

Tek komutla 3 container ayağa kalktı! Network otomatik oluşturuldu. Container'lar birbirini isimle bulabiliyor — API, veritabanına db ismiyle ulaşabiliyor. Compose'un detaylarını Bölüm 7'de çok daha derinlemesine işleyeceğiz. Şimdilik "böyle bir şey var ve çok işe yarıyor" diye bilmen yeterli.


Docker BuildKit — Modern Build Motoru

BuildKit, Docker'ın yeni nesil image build motorudur. Eski build motoruna göre çok daha hızlı çalışır çünkü bağımsız katmanları paralel olarak build edebilir. Ayrıca daha akıllı cache mekanizması var ve multi-platform image oluşturabilirsin — yani aynı image'ın hem Intel hem Apple Silicon (ARM) versiyonunu tek seferde build edebilirsin.

# BuildKit versiyonunu kontrol et
docker buildx version

# Multi-platform build (hem AMD64 hem ARM64)
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:v1 .

Modern Docker'da BuildKit varsayılan olarak aktif. Eğer eski bir Docker versiyonu kullanıyorsan, DOCKER_BUILDKIT=1 environment variable'ı ile aktif edebilirsin. Build konusunu Bölüm 3'te detaylıca ele alacağız.


Docker Scout — Güvenlik Tarayıcısı

Docker Scout, image'lardaki güvenlik açıklarını (CVE — Common Vulnerabilities and Exposures) tarayan bir araç. Production'a göndermeden önce image'ının güvenli olup olmadığını kontrol etmen çok önemli.

docker scout cves nginx:latest

Bu komut sana image'daki bilinen güvenlik açıklarını, önem derecelerini ve düzeltme önerilerini gösterir. "Nginx'in şu versiyonuna geç, bu CVE düzelir" gibi. Güvenlik konusunu Bölüm 9'da derinlemesine ele alacağız ama bu aracın varlığını bilmen iyi.


Diğer Yararlı Araçlar

Docker ekosisteminde günlük hayatını kolaylaştıracak birkaç araç daha var. Şimdi hepsini detaylıca öğrenmene gerek yok ama varlıklarını bilmek ileride işine yarayacak.

Portainer — Web Tabanlı Docker Yönetimi

Terminalle uğraşmak istemediğin zamanlar olacak. Portainer, tarayıcıdan Docker'ı yönetmeni sağlayan bir web arayüzü. Container'ları görmek, log'ları okumak, image'ları incelemek — hepsi görsel olarak.

docker run -d -p 9443:9443 --name portainer \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest

https://localhost:9443 adresini açtığında tam teşekküllü bir yönetim paneli seni karşılar.

Lazydocker — Terminal Arayüzü

Terminal'den çıkmak istemiyorsan ama docker ps + docker logs + docker stats komutlarını sürekli yazmaktan da sıkıldıysan, Lazydocker tam sana göre. Terminal içinde çalışan, klavye ile yönetilen bir dashboard.

ctop — Container Monitoring

Linux'ta htop'u bilirsin — prosesleri izlersin. ctop aynı şey ama container'lar için. Her container'ın CPU, memory, network kullanımını anlık olarak izlersin.


Docker Versiyonları

Docker iki ana sürüm hattı kullanıyor:

Docker CE (Community Edition) ücretsiz ve açık kaynak. Öğrenme, geliştirme ve çoğu production senaryosu için yeterli. Bu kursta da Docker CE kullanıyoruz.

Docker EE (Enterprise Edition) artık Mirantis tarafından satılıyor. Kurumsal destek, ekstra güvenlik özellikleri ve LDAP entegrasyonu gibi şeyler içeriyor. Büyük şirketlerin ihtiyaçlarına yönelik.

Docker versiyonunu görmek için:

docker version
# Client:
#  Version:           24.0.7
# Server:
#  Engine:
#   Version:          24.0.7

Production'da kararlı (stable) sürüm kullan. Geliştirmede de kararlı sürüm kullan — tutarlılık önemli.


Geliştirmeden Üretime — Tam Akış

Şimdi tüm bu parçaların birlikte nasıl çalıştığını görelim. Bir uygulamayı geliştirmeden production'a taşırken Docker ekosisteminin hangi parçalarını kullanırsın?

┌─────────────────────────────────────────────────────────────────┐
│                        GELİŞTİRME                                │
│  Docker Desktop ─ Docker CLI ─ Docker Compose ─ BuildKit        │
│  "Kodumu yazıyorum, container'da test ediyorum"                 │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                         DAĞITIM                                  │
│  Docker Hub ─ GitHub Container Registry ─ AWS ECR               │
│  "Image'ımı registry'ye push'layıp paylaşıyorum"               │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                        ÇALIŞTIRMA                                │
│  Docker Engine ─ Kubernetes ─ Docker Swarm ─ Cloud Run          │
│  "Image'ımı production sunucusunda çalıştırıyorum"              │
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────────┐
│                        İZLEME                                    │
│  Docker Scout ─ Prometheus ─ Grafana ─ Portainer                │
│  "Container'larımı izliyorum, güvenlik taraması yapıyorum"      │
└─────────────────────────────────────────────────────────────────┘

Geliştirme aşamasında Docker Desktop ve Compose ile çalışırsın. Image hazır olduğunda Docker Hub'a veya başka bir registry'ye push'larsın. Production sunucusunda Docker Engine (veya Kubernetes) ile çalıştırırsın. Ve her aşamada monitoring ve güvenlik araçlarıyla izlersin.


Hadi Deneyelim — Ekosistemi Keşfet

Docker kuruluysa (bir sonraki derste kurulum yapacağız) şu komutları çalıştırarak ekosistemin parçalarını keşfedebilirsin:

# 1. Docker, Compose ve BuildKit versiyonlarını gör
docker version
docker compose version
docker buildx version

# 2. Sistem bilgisi — Docker'ın durumu
docker info

# 3. Disk kullanımı — Docker ne kadar yer kaplıyor
docker system df

# 4. Farklı boyutlarda image'lar indir ve karşılaştır
docker pull alpine:3.19
docker pull ubuntu:22.04
docker pull nginx:1.25-alpine

# 5. Image boyutlarını karşılaştır
docker images
# Alpine: ~7MB, Ubuntu: ~77MB, Nginx: ~43MB
# Boyut farkını gör!

# 6. Temizlik — kullanılmayan her şeyi sil
docker system prune

Bu komutlar seni Docker ekosistemiyle tanıştıracak. Her birinin ne döndürdüğüne, ne bilgi verdiğine dikkat et.


İyi Alışkanlıklar

Docker ekosistemi geniş, ama şu birkaç alışkanlık seni her zaman doğru yolda tutar:

`docker system prune` ile düzenli temizlik yap. Docker zamanla gereksiz image'lar, durmuş container'lar ve eski build cache ile diski doldurur. Haftada bir temizlik yapmak iyi bir alışkanlık.

Docker CLI'nin modern formatını öğren. docker container ls, docker image ls formatı daha düzenli ve ne yaptığın daha açık. Kısayolları da bilmekte fayda var ama yapıyı anlamak önemli.

Docker Desktop'ı geliştirmede kullan ama production sunucularına kurma. Production'da GUI'ye ihtiyacın yok — Docker Engine yeterli ve daha performanslı.

Docker Hub'da her zaman official image'ları tercih et. Güvenlik, güncellik ve dokümantasyon açısından en güvenilir seçenek.

⚠️ Docker Daemon'ını internete açma. Docker Daemon varsayılan olarak sadece local socket üzerinden erişilebilir. TCP üzerinden açmak ciddi güvenlik riski oluşturur — bunu sadece TLS ile korunan ortamlarda yap.


Bu Derste Ne Öğrendik?

  • Docker ekosistemi Engine (motor), CLI (komutlar), Desktop (GUI), Hub (registry) ve daha birçok araçtan oluşur. Her birinin ayrı bir rolü var.

  • Docker Engine = Docker Daemon + containerd + runc. Asıl işi yapan katman bu. Daemon komutlarını alır, containerd container yaşam döngüsünü yönetir, runc Linux kernel ile konuşur.

  • Docker CLI komutları docker <nesne> <eylem> formatını takip eder. Container, image, network, volume — her şey bu yapıda düzenleniyor.

  • Docker Desktop, macOS ve Windows'ta arka planda hafif bir Linux VM çalıştırır. Geliştirici deneyimini kolaylaştırır ama production için değildir.

  • Docker Hub, image'ların merkezi deposu. Official image'ları her zaman tercih et.

  • Docker Compose çoklu container yönetimi, BuildKit modern build motoru, Scout güvenlik taraması sağlar. Her biri ekosisteme kendi katkısını yapıyor.

Bir sonraki derste Docker'ı bilgisayarına kuracağız — Linux, macOS ve Windows için adım adım. Artık ekosistemi biliyorsun, şimdi onu ellerimizle kurup çalıştırma zamanı!