Modül 1 · Container & Temel Altyapı · ⏱ 7 dk

Limonatacının sipariş defteri: ilk veritabanın

The lemonade stand order book

Bu derste neler öğreneceksin

  • Postgres i Dockerda calistirir
  • Ilk tabloyu olusturur
  • Ilk 5 satiri ekler

İlk Veritabanın: Postgres + Docker

Bugün gerçek bir production senaryosunun en küçük parçasını kuruyoruz: ilişkisel veritabanı. Bu, neredeyse her modern uygulamanın kalbi. Shopify, Notion, Discord — hepsinin arkasında bir Postgres veya MySQL çalışır. İlk adımı doğru atmak için önce neden container (Docker) kullandığımızı anlayalım.

Neden Docker?

Klasik senaryo: geliştirici bilgisayarında Postgres kurulu, ama başka geliştirici takım arkadaşında çalışmıyor. “Bende çalışıyor” cümlesi yazılım tarihinin en pahalı cümlesi. Docker bu sorunu çözer: veritabanını bir imaj olarak paketlersin, her makinede aynı şekilde ayağa kalkar. “Bende çalışıyor” → “Her yerde çalışıyor”.

Container, bir yalıtılmış süreç olarak düşünülebilir. Kendi dosya sistemi, kendi ağı, kendi ortam değişkenleri var. Bilgisayarındaki diğer şeylere dokunmaz. Veritabanını silmek istediğinde container’ı silmen yeterli, geride iz kalmaz.

Postgres’i Ayağa Kaldır

docker run -d --name pg-limonata \
  -e POSTGRES_USER=elif \
  -e POSTGRES_PASSWORD=limonata \
  -e POSTGRES_DB=limonata_db \
  -p 5432:5432 \
  postgres:18

Bayrakları tek tek açalım:

  • -d: detached (arkaplan). Terminal bloke olmaz.
  • --name pg-limonata: container’a isim verir, yoksa Docker rastgele bir isim atar (örn. vigilant_archimedes).
  • -e: environment variable. Veritabanı kullanıcı adı, şifresi, varsayılan DB.
  • -p 5432:5432: port yönlendirme. Sol taraf host (senin bilgisayarın), sağ taraf container.
  • postgres:18: imaj + versiyon. Major versiyonu sabitlemek çok önemli — Postgres 17 ile yazılmış kodu 18’e taşıyınca davranış değişebilir.

Kontrol: docker ps. Çıktıda pg-limonata adında bir satır görmelisin. STATUS sütununda “Up” yazmalı.

Logları görmek için:

docker logs -f pg-limonata

“database system is ready to accept connections” mesajını görünce her şey hazır. Ctrl+C ile çık.

Bağlan: psql

Container çalışıyor. Şimdi içine girelim:

docker exec -it pg-limonata psql -U elif -d limonata_db

exec çalışan bir container’a komut gönderir. -it interaktif terminal. psql Postgres’in CLI istemcisi.

İçeridesin. musteriler tablosu oluşturalım:

CREATE TABLE musteriler (
  id SERIAL PRIMARY KEY,
  isim TEXT NOT NULL,
  icecek TEXT NOT NULL,
  fiyat NUMERIC(5,2) NOT NULL CHECK (fiyat >= 0),
  tarih DATE NOT NULL DEFAULT CURRENT_DATE
);

Burada üretim kalıpları var:

  • SERIAL: Auto-incrementing integer. UUID da kullanabilirsin ama SERIAL küçük ve debug dostu.
  • NOT NULL: Boş geçilemez. Veri kalitesinin ilk savunma hattı.
  • CHECK (fiyat >= 0): Negatif fiyat olamaz, DB seviyesinde garanti.
  • DEFAULT CURRENT_DATE: Tarihi unutursan bugünü yazar.
  • NUMERIC(5,2): Ondalıklı sayı. FLOAT para için kullanma — yuvarlama hataları olur.

İlk Satırları Ekle

INSERT INTO musteriler (isim, icecek, fiyat) VALUES
  ('Ayşe', 'Limonata', 25.00),
  ('Mehmet', 'Nane Limonata', 30.00),
  ('Zeynep', 'Çilekli Limonata', 35.00),
  ('Ali', 'Klasik Limonata', 25.00),
  ('Elif', 'Buzlu Limonata', 28.00);

Doğrula:

SELECT * FROM musteriler ORDER BY id;

İstersen tablonun şemasını incele:

\d musteriler

Çıktıda sütun tipleri, kısıtlamalar, varsayılanlar görünür. Bu, production debugging’de en çok başvuracağın komutlardan biri.

Container’ı Yönet

Durdurmak için: docker stop pg-limonata. Veriler kaybolmaz, sadece container kapanır. Tekrar başlat: docker start pg-limonata.

Tamamen silmek (veriler dahil!):

docker stop pg-limonata
docker rm pg-limonata

Üretimde veri asla container içinde tutulmaz — bir sonraki derste göreceğimiz volume ile kalıcı diske bağlanır. Şimdilik konteyner durunca verinin de gitmesi beklenen davranış; bu sayede “sıfır kurulum, sıfır artık” elde edersin.

Alıştırma

  1. Bir musteri ekle: kendi adın, kendi içeceğin, istediğin fiyat.
  2. SELECT COUNT(*) FROM musteriler; çalıştır. 6 görmelisin.
  3. docker logs pg-limonata | tail -20 ile son logları incele. Çalıştırdığın sorgular orada görünür mü?

Sıradaki

Veritabanı canlı, şimdi ona soru sormayı öğreniyoruz →