#docker 05 Mart 2026

Konteyner Dünyasına Giriş: Neden Docker Öğrenmelisiniz?

Docker mimarisinin temelleri: Dockerfile, Image, Container ve Compose. Veri mühendisliği projelerinde servis izolasyonu, taşınabilirlik ve çoklu konteyner orkestrasyonuna giriş.

Featured Image

Bölüm 1: Giriş

Yazılım dünyasında, geliştirdiği projeyi sunucuya aktarıp orada sorunsuzca çalışmasını bekleyen geliştirici neredeyse yoktur. Kendi yerel ortamınızda günlerce uğraşarak geliştirdiğiniz o harika projeniz sunucuya çıktığı an kütüphane versiyonu uyuşmazlığı, eksik bir ortam değişkeni veya işletim sistemi farklılığı nedeniyle bir yerden patlak verir. İşte tam bu noktada, yazılım geliştirme süreçlerini kökten değiştiren o sihirli teknoloji Docker devreye giriyor. Peki ya nedir bu Docker?

Docker’ı nakliye konteynerlerine benzetebiliriz. Nakliye konteynerleri içerisinde elektronik komponentler, sanayi malzemeleri, gıda ürünleri vb. birçok farklı alandan ürünler bulunur. Bu konteynerler içinde ne olduğu fark etmeksizin gemilerde, trenlerde ve tırlarda birbirlerine uyumlu bir şekilde yerleştirilir ve taşınabilir.

Docker aslında tam olarak bir nakliye konteyneri gibi çalışır. Projenizin, uygulama dosyalarını, kullandığı kütüphaneleri, yapılandırmaları ve tüm bağımlılıkları bir konteyner içerisinde paketler. Bu sayede projeniz kendi kişisel bilgisayarınızda olduğu gibi Linux bir sunucuda da aynı şekilde çalışır. Bu sayede hepimizin duyduğu “benim bilgisayarımda çalışıyordu” cümlesinin üstesinden gelir.

Bölüm 2: Temel Kavramlar

Docker dünyasına giriş yapıldığında sürekli karşımıza çıkacak birkaç terim bulunur. Docker’ın çalışma mekanizmasını kavramanın yolu bu terimleri anlamaktan geçer. Bu kavramları anlamak için prefabrik ev örneğini kullanalım.

2.1. Dockerfile

Dockerfile’ı prefabrik evin inşasında; inşa edilecek evde hangi malzemelerin kullanacağının belirlendiği, iç yapısının nasıl olacağını belirten bir teknik çizimine benzetebiliriz. Dockerfile tıpkı örnekte olduğu gibi projenizde hangi kütüphanelerin kullanılacağı, hangi servislerin/uygulamaların yükleneceği, hangi portların ne işe yarayacağı gibi yönergeleri belirten bir talimatlar listedir. Dockerfile dosyasının adından gelir ve bu dosyaların uzantısı olmaz.

2.2. Image (İmaj)

Image (İmaj), prefabrik evin teknik çizimini fabrikaya gönderip bu evden bir tane üret dediğimizde ortaya çıkan, kuruluma hazır pakettir. Uygulamanın kodlarını, kütüphanelerini, ayarlarını içeren dondurulmuş bir kopyadır. Henüz burada hayat yoktur, ancak her şeyiyle çalışmaya hazır paketlenmiş bir bütündür.

2.3. Container (Konteyner)

Teknik çizimi ile sipariş ettiğiniz prefabrik ev malzemelerinin inşa edilecek yere indirilip kurulumu tamamladığınızda ortaya çıkan sonucu container (konteyner) kavramına benzetebiliriz. Bu aşamada uygulamanız artık canlı olarak çalışmaya başlamıştır. Bir imajdan istediğiniz kadar farklı container oluşturabilirsiniz. İmaj’dan elde edilen konteynerler birbirinden bağımsızdır ama hepsi aynı plana sadıktır.

2.4. Docker Compose (YAML Dosyası)

Dockerfile tek bir konteynerin planını çizerken, Docker Compose birden fazla konteynerin (örneğin; Airflow, PostgreSQL ve MongoDB) birbirleriyle uyum içinde çalışmasını sağlayan bir "orkestra şefidir". Bu yönetim planı, Dockerfile'dan farklı olarak .yaml uzantılı bir dosyada tutulur. Eğer Dockerfile prefabrik bir evin teknik çizimiyse; Docker Compose, bu evlerin yan yana gelerek oluşturduğu, elektrik ve su hatlarının birbirine bağlandığı modern bir site yerleşim planıdır.

Bölüm 3: Neden Docker Kullanmalıyız?

Temel kavramları anladığımıza göre asıl soruya gelelim: Neden tüm geliştiriciler bu teknolojiyi konuşuyor?

  • 3.1. İzolasyon: Bir sunucu üzerinde birden fazla servis (PostgreSQL, MongoDB, Airflow vb.) çalıştırdığınızda, bu servislerin kütüphaneleri veya ayarları bazen birbirini sabote edebilir. Docker sayesinde her servis, kendi sınırları çizilmiş "müstakil bir bahçe" içinde yaşar. MongoDB’de yaptığınız bir güncelleme veya kütüphane değişikliği, PostgreSQL’in huzurunu bozmaz. Her şey kendi konteyneri içinde izoledir.
  • 3.2. Taşınabilirlik: En büyük kabus, Windows/macOS bilgisayarımda tıkır tıkır çalışan kodun, hosting üzerindeki Linux sunucuya geçtiğinde "kütüphane bulunamadı" hatası vermesidir. Docker ile bu sorun tamamen ortadan kalkıyor. Prefabrik evinizi (Image) bir tırın kasasına yükleyip ister İstanbul’daki bir arsaya, ister Almanya’daki bir sunucuya indirin; kapıyı açtığınızda her eşyanın (bağımlılığın) yerli yerinde olduğunu bilirsiniz. "Benim bilgisayarımda çalışıyordu" cümlesi artık lügatımızdan çıkıyor.
  • 3.3. Hızlı Kurulum: Eskiden bir sunucuya veritabanı kurmak, ayarlarını yapmak ve ortamı hazırlamak saatler, bazen günler alırdı. Şimdi ise Docker Compose sayesinde her şey tek bir dosyada hazır. Terminale gidip docker compose up komutunu verdiğimiz an, sanki sihirli bir değnek değmiş gibi saniyeler içinde veritabanlarımız ve Airflow hazır oluyor, projemiz çalışmaya hazır hale geliyor.

Bölüm 4: Docker Compose: Orkestrayı Yönetmek

Gerçek hayattaki projeler nadiren tek bir konteynerden oluşur. Streamline ETL projemde olduğu gibi; görev yönetimini sağladığım Airflow, elde ettiğim ham verileri sakladığım bir MongoDB ve işlediğim verileri kalıcı olarak sakladığım bir PostgreSQL aynı anda, bir ekip olarak çalışmak zorundadır. Peki, bu farklı servislerin birbirinin "adını" ve "adresini" bilmesini nasıl sağlıyoruz? İşte burada devreye docker-compose.yaml dosyası giriyor.

Docker Compose sayesinde, her bir servisi tek tek elinizle ayağa kaldırmak yerine bir orkestra yönetir gibi docker compose up komutunu verdiğinizde, Docker bu YAML dosyasını okur; servisleri sıraya koyar, aralarındaki ağ bağlantılarını kurar ve tüm sistemi bir bütün halinde senkronize eder. Bu, onlarca farklı prefabrik evi saniyeler içinde elektrik ve su tesisatları çekilmiş, taşınmaya hazır bir "akıllı siteye" dönüştürmek gibidir.

Örnek bir docker-compose.yaml dosyası üzerinden ilgili anahtar kelimeleri inceleyelim;

docker-compose.yaml

yaml

version: '3.8'

services:

db_postgre:

image: postgres:15

container_name: postgres_streamline

ports:

- "5432:5432"

environment:

POSTGRES_USER: my_user

POSTGRES_PASSWORD: gizli_sifre

volumes:

- ./data/db:/var/lib/postgresql/data

data_pipeline:

build: .

depends_on:

- db_postgre

Anahtar KelimeKarşılığı & Görevi
versionDocker Compose dosyasının hangi kurallara ve özelliklere göre okunacağını belirten "dil sürümü"dür. Docker’a bu dosyadaki komutları hangi standartta yorumlaması gerektiğini söyler; örneğin 3.8 günümüzdeki en kararlı ve gelişmiş sürümlerden biridir.
servicesProjenizdeki her bir bağımsız birimi (Veritabanı, Uygulama, Arayüz) temsil eder. Yukarıdaki örnekte db_postgre bir servistir.
imageKonteynerın Docker Hub üzerindeki hangi hazır paketi (orijinal imajı) kullanacağını belirtir. (Örn: postgres:15)
buildEğer hazır bir imaj kullanmak yerine kendi yazdığınız yerel Dockerfile’ı derleyip kullanacaksanız, Docker’a "bunu benim için pişir ve ayağa kaldır" dediğiniz yerdir.
portsKonteynerın içindeki dünyanın dış dünyaya açılan kapısıdır. "5432:5432" yazarak, sunucunuzun (host) 5432 portunu konteynerın içindeki veritabanı servisinin portuna bağlarsınız.
volumesDocker dünyasındaki en kritik kavramlardan biridir. Konteyner silinse bile verilerinizin (örneğin PostgreSQL’deki borsa verilerinin) kaybolmaması için, verileri sunucunun diskinde kalıcı bir yere "mühürler".
environmentUygulamanın şifre, kullanıcı adı veya API anahtarı gibi özel ve hassas yapılandırma bilgilerini güvenli bir şekilde içeri aktarmanızı sağlar.

Bölüm 5: Docker Dünyasında Hayatta Kalma Rehberi

5.1. Volume Kullanımı: Konteyner Gider, Veri Kalır

Docker konteynerları "uçucudur." Konteynerı sildiğinizde içindeki her şey (veritabanı kayıtları dahil) buhar olur. Bu sebeple kalıcı olarak saklamak istediğimiz veriler için Volume kullanarak sunucudaki fiziksel bir klasörü konteynerın kalbiyle mühürlüyoruz. Böylece konteynerı güncelleseniz veya kaldırsanız bile verileriniz sunucunun diskinde güvende kalır.

5.2. Port Yönlendirme: Dış Dünyadan İçeriye Tünel Açmak

Konteynerlar kendi içlerinde izole bir adada yaşarlar. Airflow’un o meşhur kullanıcı arayüzüne (Port 8080) tarayıcıdan ulaşabilmek için bir köprü kurmanız gerekir.

  • Host vs. Container: 8080:8080 ayarı, "Dışarıdan (makineden) gelen 8080 isteklerini al ve içerideki Airflow'a ilet" demektir.

Kritik İpucu: Port yönlendirme yapsanız bile, sunucu tarafındaki (Hetzner, AWS vb.) firewall ayarlarından bu porta izin vermezseniz kapıda kalırsınız. "Bağlantı reddedildi" hatası alıyorsanız, ilk bakacağınız yer bu port eşleşmeleri ve sunucu firewall kuralları olsun.

5.3 Yetki Sorunları: "Permission Denied" Duvarını Aşmak

Docker dünyasındaki en sinsi hatalar genellikle yetki (permission) kaynaklıdır. Konteyner içindeki bir kullanıcı (örneğin UID 50000 olan airflow kullanıcısı), sunucudaki bir klasöre bir şeyler yazmak istediğinde "Dur!" ihtarıyla karşılaşabilir.

  • Gizli Rol (chown & chmod): Sunucu tarafındaki klasörlerin sahibini chown ile Docker kullanıcısına çevirmek veya chmod ile yazma izinlerini düzenlemek, logların akmasını ve DAG'ların okunmasını sağlar.

Tecrübe Notu: Eğer Airflow loglarında hata göremiyorsanız veya klasörler boş kalıyorsa, büyük ihtimalle Docker'ın o klasöre dokunma yetkisi yoktur. Sunucu terminalinde çalıştırılacak sudo chown -R 50000:0 ./klasor_yolu gibi komutlar bu dünyanın gizli anahtarlarıdır.

Bölüm 6: Kapanış

Docker artık bir veri mühendisi için seçenek değil, projelerini standardize etmek ve her ortamda sorunsuz çalıştırmak için gereken temel bir standarttır. Streamline projesinde Airflow, PostgreSQL ve MongoDB’yi bu yapıyla kurgulayarak; hem bağımlılık karmaşasından kurtuldum hem de projenin sunucuya taşınma sürecini tek bir komutla halledebilecek kadar kısalttım.

Siz de projelerinizde "benim bilgisayarımda çalışıyordu" bahanelerinden kurtulmak ve profesyonel bir altyapı kurmak istiyorsanız, Docker dünyasına bugün adım atın. Altyapısına hakim olduğunuz bir pipeline, veri dünyasindeki en güçlü imzanız olacaktır.