Docker Compose ile PostgreSQL kurulum rehberi

📅 17 Ocak 2026Emre Karabulut
⏱️ Yaklaşık 8 dakikalık okuma süresi

Docker Compose ile PostgreSQL Kurulum Rehberi: Geliştirme Ortamınızı Kolayca Kurun

Veritabanları, modern uygulamaların belkemiğini oluşturur ve PostgreSQL, güvenilirliği, performansı ve zengin özellik seti ile geliştiricilerin ve sistem yöneticilerinin favorilerinden biridir. Geliştirme ortamlarında PostgreSQL’i hızlı ve tutarlı bir şekilde kurmak ve yönetmek, Docker Compose ile çok daha kolay hale gelir. Bu rehberde, Docker Compose kullanarak bir PostgreSQL sunucusunu nasıl çalıştıracağınızı adım adım göstereceğiz. Bu sayede, karmaşık kurulum süreçlerinden kurtulacak ve uygulamanıza odaklanabileceksiniz.

Ön Koşullar

Başlamadan önce aşağıdaki gereksinimlerin sisteminizde kurulu olduğundan emin olun:

  • Docker Desktop: Hem Docker Engine’i hem de Docker Compose’u içerir. Kurulumu için Docker web sitesini ziyaret edebilirsiniz.
  • Temel Docker Bilgisi: Docker kavramlarına (image, container, volume, network) aşina olmak işinizi kolaylaştıracaktır.
  • Metin Düzenleyici: Herhangi bir metin düzenleyici (VS Code, Sublime Text, Notepad++ vb.) kullanabilirsiniz.

Proje Yapısını Oluşturma

İlk olarak, Docker Compose yapılandırma dosyalarımızı ve ilgili veritabanı dosyalarımızı barındıracak bir dizin oluşturalım. Terminalinizde aşağıdaki komutları çalıştırın:


mkdir postgres-docker-compose
cd postgres-docker-compose
    

Bu dizin içinde `docker-compose.yml`, `.env` ve isteğe bağlı olarak `init.sql` dosyalarını oluşturacağız.

docker-compose.yml Dosyasını Oluşturma

Bu dosya, PostgreSQL hizmetimizin nasıl yapılandırılacağını tanımlar. `postgres-docker-compose` dizini içinde `docker-compose.yml` adında bir dosya oluşturun ve aşağıdaki içeriği ekleyin:


version: '3.8'

services:
  db:
    image: postgres:13
    container_name: postgres_db
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "5432:5432"
    volumes:
      - ./data/db:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    restart: unless-stopped
    

Açıklamalar:

  • version: '3.8': Docker Compose dosyasının sürümünü belirtir. En son stabil sürümü kullanmak iyi bir uygulamadır.
  • services: Tanımlayacağımız hizmetleri içerir. Burada sadece bir adet db (veritabanı) hizmetimiz var.
  • image: postgres:13: PostgreSQL’in Docker Hub’dan çekilecek imajını belirtir. Burada PostgreSQL 13 sürümünü kullanıyoruz. İstediğiniz stabil sürümü seçebilirsiniz (örn. postgres:latest, postgres:14).
  • container_name: postgres_db: Oluşturulacak Docker konteynerine okunabilir bir isim verir.
  • environment: PostgreSQL’in başlatılması için gerekli ortam değişkenlerini tanımlar. Bu değerler, güvenlik nedeniyle .env dosyasından okunacaktır (aşağıya bakınız).
    • POSTGRES_DB: Oluşturulacak varsayılan veritabanının adı.
    • POSTGRES_USER: Veritabanı kullanıcısının adı.
    • POSTGRES_PASSWORD: Veritabanı kullanıcısının şifresi.
  • ports: - "5432:5432": Konteynerin 5432 numaralı portunu (PostgreSQL’in varsayılan portu), host makinenizin 5432 numaralı portuna eşler. Böylece host makinenizden PostgreSQL’e erişebilirsiniz.
  • volumes: Veri kalıcılığını ve başlangıç betiklerini yönetir.
    • - ./data/db:/var/lib/postgresql/data: Bu, PostgreSQL verilerini kalıcı hale getirmek için kritik öneme sahiptir. Host makinenizdeki ./data/db dizini (eğer yoksa oluşturulacaktır), konteyner içindeki PostgreSQL’in veri depoladığı /var/lib/postgresql/data dizinine bağlanır. Konteyner silinse bile verileriniz host makinenizde kalır.
    • - ./init.sql:/docker-entrypoint-initdb.d/init.sql: Bu, PostgreSQL konteyneri ilk kez başlatıldığında çalıştırılacak bir SQL betiği eklemenizi sağlar. Veritabanı başlatma ve tablo oluşturma gibi ilk kurulum adımları için kullanışlıdır.
  • restart: unless-stopped: Konteynerin her zaman çalışır durumda kalmasını sağlar. Konteyner beklenmedik bir şekilde durursa veya Docker servisi yeniden başlatılırsa, otomatik olarak yeniden başlatılır.

.env Ortam Değişkenleri Dosyasını Oluşturma

Hassas bilgileri (veritabanı adı, kullanıcı adı, şifre) docker-compose.yml dosyasından ayırmak iyi bir güvenlik uygulamasıdır. postgres-docker-compose dizini içinde .env adında bir dosya oluşturun ve aşağıdaki içeriği ekleyin. Kendi değerlerinizi uygun şekilde değiştirin:


POSTGRES_DB=mydb
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mysecretpassword
    

Gerçek bir projede, bu dosyayı sürüm kontrol sistemine (örn. Git) eklememeye dikkat edin. Bunun için .gitignore dosyanıza .env eklemeniz önerilir.

Opsiyonel: Veritabanı Başlatma Scripti (init.sql)

Eğer veritabanınız ilk oluşturulduğunda otomatik olarak bazı tabloların veya test verilerinin eklenmesini istiyorsanız, postgres-docker-compose dizini içinde init.sql adında bir dosya oluşturabilir ve aşağıdaki gibi bir içerik ekleyebilirsiniz:


CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (name, email) VALUES
    ('John Doe', 'john.doe@example.com'),
    ('Jane Smith', 'jane.smith@example.com');
    

Bu script, PostgreSQL konteyneri ilk kez başlatıldığında otomatik olarak çalıştırılır. PostgreSQL imajı, /docker-entrypoint-initdb.d/ dizini altındaki tüm .sql, .sh veya .py dosyalarını ilk başlatmada çalıştırır.

Docker Compose Stack’i Başlatma

Tüm dosyalarımızı oluşturduktan sonra, terminalinizde postgres-docker-compose dizinine gidin ve aşağıdaki komutu çalıştırarak PostgreSQL hizmetini başlatın:


docker compose up -d
    

-d (detached) bayrağı, konteynerlerin arka planda çalışmasını sağlar ve terminalinizi serbest bırakır. İlk çalıştırmada PostgreSQL imajı indirilecek ve konteyner oluşturulacaktır.

Konteynerlerin başlatıldığını ve loglarını görmek için aşağıdaki komutu kullanabilirsiniz:


docker compose logs -f db
    

Loglarda “database system is ready to accept connections” gibi bir mesaj gördüğünüzde, PostgreSQL sunucunuz başarıyla çalışıyor demektir.

Kurulumu Doğrulama

Konteynerin durumunu kontrol etmek için:


docker compose ps
    

Çıktı, postgres_db konteynerinin Up durumda olduğunu göstermelidir.


NAME                COMMAND                  SERVICE             STATUS              PORTS
postgres_db         "docker-entrypoint.s…"   db                  running             0.0.0.0:5432->5432/tcp
    

Veritabanına bağlanıp test etmek için psql (PostgreSQL komut satırı aracı) kullanabilirsiniz. Eğer sisteminizde psql kurulu değilse, Docker konteyneri içindeki psql‘i kullanabilirsiniz:


docker compose exec db psql -U ${POSTGRES_USER} -d ${POSTGRES_DB}
    

${POSTGRES_USER} ve ${POSTGRES_DB} yerine .env dosyanızdaki değerleri yazın veya kabuk değişkenleri olarak ayarlayın. Örneğin:


docker compose exec db psql -U myuser -d mydb
    

Şifre sorulduğunda .env dosyanızdaki POSTGRES_PASSWORD değerini girin (mysecretpassword).

Bağlandıktan sonra, init.sql ile oluşturduğunuz tabloyu listeleyebilirsiniz:


\dt
    

Çıktıda users tablosunu görmelisiniz. Ardından, eklediğiniz verileri sorgulayabilirsiniz:


SELECT * FROM users;
    

İşiniz bittiğinde \q yazarak psql‘den çıkabilirsiniz.

PostgreSQL Sunucusuna Bağlanma

Uygulamanızdan veya bir GUI aracı (örn. DBeaver, pgAdmin) kullanarak PostgreSQL sunucunuza bağlanmak için aşağıdaki bilgileri kullanabilirsiniz:

  • Host: localhost (veya 127.0.0.1)
  • Port: 5432
  • Database: mydb (.env dosyanızdaki POSTGRES_DB değeri)
  • User: myuser (.env dosyanızdaki POSTGRES_USER değeri)
  • Password: mysecretpassword (.env dosyanızdaki POSTGRES_PASSWORD değeri)

Stack’i Durdurma ve Kaldırma

PostgreSQL hizmetini durdurmak ve konteyneri kaldırmak için:


docker compose down
    

Bu komut, docker-compose.yml dosyasında tanımlanan tüm hizmetleri durdurur ve kaldırır. Ancak, ./data/db dizinindeki verileriniz kalıcı olarak saklanmaya devam edecektir.

Eğer verileri de tamamen kaldırmak istiyorsanız (dikkatli olun, bu geri alınamaz bir işlemdir!):


docker compose down --volumes
    

Bu komut, konteynerleri, ağları ve Docker Compose tarafından oluşturulan tüm veri birimlerini de kaldırır, yani PostgreSQL verilerinizi de siler.

Önemli Hususlar ve En İyi Uygulamalar

  • Veri Kalıcılığı: volumes kullanımı, konteynerler silinse bile verilerinizin kaybolmamasını sağlar. Üretim ortamlarında bu vazgeçilmezdir.
  • Güvenlik: Üretim ortamlarında varsayılan şifreleri kullanmaktan kaçının. Karmaşık şifreler oluşturun ve .env dosyasını güvenli bir şekilde yönetin. Asla internete doğrudan açık bir PostgreSQL sunucusu çalıştırmayın.
  • Yedekleme: Veri kalıcılığı sağlasanız bile, düzenli yedeklemeler almak her zaman en iyi uygulamadır.
  • Sürüm Yönetimi: PostgreSQL imajı için spesifik bir sürüm (örn. postgres:13) kullanmak, beklenmedik güncellemelerden kaynaklanan uyumluluk sorunlarını önler.
  • Kaynak Yönetimi: Üretim ortamlarında, PostgreSQL konteynerine CPU ve RAM limitleri atamak, kaynak tüketimini kontrol altında tutmaya yardımcı olabilir.
  • Güncelleme: Yeni bir PostgreSQL sürümüne geçmek veya mevcut imajı güncellemek için docker compose pull db komutunu kullanabilir, ardından docker compose up -d ile yeni imajı dağıtabilirsiniz.

Sonuç

Docker Compose ile PostgreSQL kurulumu, geliştirme ve hatta küçük ölçekli test ortamları için veritabanı yönetimini inanılmaz derecede basitleştirir. Bu rehber sayesinde, kısa sürede tam işlevsel bir PostgreSQL sunucusunu ayağa kaldırabilir, verilerinizi kalıcı hale getirebilir ve uygulamanızı kolayca bağlayabilirsiniz. Docker ve Docker Compose’un gücüyle, veritabanı kurulumunun getirdiği baş ağrılarını geride bırakın ve geliştirmenize odaklanın!

Emre Karabulut
📊 Bu yazı 4 kez okundu.