Skip to main content

Docker Nedir? Konteyner Teknolojisine Giriş

· 4 min read
Metin Karakus
Data Professional

Bir uygulamayı geliştirdiniz, kendi makinenizde mükemmel çalışıyor. Sunucuya aldınız — çalışmıyor. Python versiyonu farklı, bir kütüphane eksik, işletim sistemi farklı davranıyor. Docker tam olarak bu problemi çözmek için var.

Temel Sorun: "Bende Çalışıyor"

Geleneksel yazılım dağıtımında uygulama ve çalışma ortamı birbirinden ayrıdır:

Geliştirici makinesi:  Python 3.11, pandas 2.0, libpq-dev kurulu
Üretim sunucusu: Python 3.9, pandas 1.5, libpq-dev yok

Sonuç: Uygulama geliştirici makinesinde çalışır, sunucuda çalışmaz.

Docker bu sorunu şu şekilde çözer: uygulamayı ve çalışması için gereken her şeyi birlikte paketler.


Docker Nedir?

Docker, uygulamaları container adı verilen izole paketler içinde çalıştırmaya yarayan bir platformdur.

Container; uygulamanın kaynak kodunu, bağımlılıklarını, sistem kütüphanelerini ve çalışma zamanını tek bir birim olarak içerir. Bu container her makinede — geliştirici laptopunda, CI sunucusunda, bulut ortamında — birebir aynı şekilde çalışır.


Container vs Sanal Makine (VM)

Container'lar sık sık sanal makinelerle karıştırılır. İkisi de izolasyon sağlar ama çok farklı şekillerde:

Sanal Makine (VM)Container
İzolasyonTam işletim sistemiSüreç seviyesi
BoyutGigabyte'larMegabyte'lar
Başlama süresiDakikalarSaniyeler (hatta milisaniyeler)
Kaynak kullanımıYüksekDüşük
TaşınabilirlikZorKolay

VM, gerçek bir bilgisayarın tamamını simüle eder. Container ise host işletim sisteminin çekirdeğini paylaşır ve sadece uygulamanın ihtiyaç duyduğu katmanları izole eder.


Temel Kavramlar

Image

Image, container'ın şablonudur. İçinde uygulamanın çalışması için gereken her şey bulunur: işletim sistemi katmanı, bağımlılıklar, uygulama kodu, başlatma komutu.

Image'lar Dockerfile ile tanımlanır ve değişmezdir (immutable).

# Bu bir Dockerfile — image'ın tarifi
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

Container

Container, çalışan bir image örneğidir. Aynı image'dan istediğiniz kadar container başlatabilirsiniz.

Image → Container ilişkisi, sınıf → nesne (class → instance) ilişkisine benzer.


Registry

Image'ların depolandığı ve paylaşıldığı yer. En yaygın registry Docker Hub'dır. Binlerce hazır image barındırır: python, postgres, nginx, clickhouse gibi.

# Docker Hub'dan resmi Python image'ını indir
docker pull python:3.11-slim

İlk Docker Komutları

Image Build Etmek

# Bulunduğunuz dizindeki Dockerfile'dan image oluştur
docker build -t benim-uygulama:1.0 .

Container Başlatmak

# Image'dan container başlat
docker run benim-uygulama:1.0

# Arka planda (detached) başlat
docker run -d benim-uygulama:1.0

# Port yönlendirme ile başlat
# Host'un 8080 portu → Container'ın 80 portuna
docker run -d -p 8080:80 nginx

Çalışan Container'ları Görmek

docker ps

Container'a Bağlanmak

docker exec -it <container_id> bash

Container'ı Durdurmak ve Silmek

docker stop <container_id>
docker rm <container_id>

Dockerfile Yazımı

Katmanlı yapı Docker'ın en önemli özelliklerinden biridir. Her RUN, COPY, ADD komutu yeni bir katman oluşturur. Docker bu katmanları cache'ler — değişmeyen katmanlar her build'de yeniden oluşturulmaz.

FROM python:3.11-slim

# Sistem bağımlılıkları — nadiren değişir, önce koy
RUN apt-get update && apt-get install -y \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /app

# requirements.txt — uygulama kodundan önce kopyala
# Böylece sadece bağımlılıklar değiştiğinde pip install çalışır
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Uygulama kodu — en sık değişen katman, en sona koy
COPY . .

CMD ["python", "main.py"]

Kötü örnek — her build'de tüm pip install yeniden çalışır:

# KÖTÜ: Her şeyi kopyala, sonra install et
COPY . .
RUN pip install -r requirements.txt

Docker Compose: Çoklu Servis

Gerçek projeler genellikle birden fazla servise ihtiyaç duyar: uygulama + veritabanı + cache gibi. docker-compose.yml bu servisleri birlikte tanımlar ve yönetir.

# docker-compose.yml
version: '3.8'

services:
app:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db

db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data

volumes:
postgres_data:

Tüm stack'i başlatmak için:

docker compose up -d

Durdurmak için:

docker compose down

Volume: Veriyi Kalıcı Hale Getirmek

Container'lar stateless'tır — container silindiğinde içindeki veri de gider. Veriyi kalıcı tutmak için volume kullanılır.

# Host dizinini container'a bağla
docker run -v /host/data:/container/data postgres:15

# Docker tarafından yönetilen named volume
docker run -v postgres_data:/var/lib/postgresql/data postgres:15

Veri Mühendisliğinde Docker

Veri projelerinde Docker özellikle şu durumlarda kritik hale gelir:

  • Yerel ClickHouse / PostgreSQL: Gerçek veritabanını local olarak dakikalar içinde ayağa kaldırın
  • dbt geliştirme: Tüm dbt bağımlılıklarını izole tutun
  • Airflow: Docker Compose ile tam Airflow stack'i local'de çalıştırın
  • Spark: PySpark ortamını versiyonlayın, Java/Scala çakışmalarından kaçının
# ClickHouse'u local'de başlat
docker run -d \
--name clickhouse-local \
-p 8123:8123 \
-p 9000:9000 \
clickhouse/clickhouse-server:latest

Özet

KavramAçıklama
ImageUygulamanın çalışma ortamını tanımlayan şablon
ContainerÇalışan image örneği
DockerfileImage'ı oluşturan tarif dosyası
RegistryImage'ların depolandığı merkez (Docker Hub)
VolumeContainer dışında tutulan kalıcı veri
Docker ComposeÇoklu container'ı birlikte yöneten araç

Docker öğrenmek, modern yazılım geliştirmede artık temel bir beceri haline geldi. Geliştirme ortamı kurulumundan CI/CD pipeline'larına, yerel testlerden üretim dağıtımına kadar her aşamada karşınıza çıkacak.

Bir sonraki adım: Dev Containers ile geliştirme ortamınızı Docker üzerine kurun.