Docker Compose ile PostgreSQL Kurulum Rehberi
Veritabanları, modern uygulamaların belkemiğini oluşturur ve bunların geliştirme ile test ortamlarında hızlı ve güvenilir bir şekilde kurulması kritik öneme sahiptir. Docker Compose, çoklu konteyner uygulamalarını tanımlamak ve çalıştırmak için mükemmel bir araçtır. Bu rehberde, Docker Compose kullanarak bir PostgreSQL veritabanını nasıl kuracağınızı, yapılandıracağınızı ve yöneteceğinizi adım adım öğreneceksiniz.
Bu kurulum, özellikle geliştirme ve küçük ölçekli test ortamları için idealdir. Veritabanınızı tamamen izole bir ortamda çalıştırmanıza, ana sisteminize herhangi bir bağımlılık yüklemeden denemeler yapmanıza ve projenizi kolayca taşınabilir hale getirmenize olanak tanır.
Önkoşullar
Başlamadan önce sisteminizde aşağıdaki bileşenlerin kurulu olduğundan emin olun:
- Docker Desktop (veya Linux için Docker Engine ve Docker Compose)
Kurulumu doğrulamak için aşağıdaki komutları çalıştırabilirsiniz:
docker --version
docker compose version
1. Proje Dizini Oluşturma
Öncelikle projeniz için bir dizin oluşturalım ve içine girelim:
mkdir postgres-compose-example
cd postgres-compose-example
2. docker-compose.yml Dosyasını Oluşturma
Bu dizinin içinde docker-compose.yml adında bir dosya oluşturun. Bu dosya, Docker Compose’a PostgreSQL servisini nasıl başlatacağını anlatacaktır.
touch docker-compose.yml
Şimdi docker-compose.yml dosyasını favori metin düzenleyicinizle açın ve aşağıdaki içeriği yapıştırın:
version: '3.8'
services:
db:
image: postgres:14
restart: always
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
ports:
- "5432:5432"
volumes:
- db_data:/var/lib/postgresql/data
# Eğer başlangıçta veritabanına veri yüklemek isterseniz, aşağıdaki satırı etkinleştirebilirsiniz.
# - ./init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser -d mydatabase"]
interval: 5s
timeout: 5s
retries: 5
start_period: 10s
volumes:
db_data:
docker-compose.yml Açıklaması:
version: '3.8': Docker Compose dosya formatının sürümünü belirtir.services:: Uygulamanızın servislerini tanımladığımız bölümdür.db:: PostgreSQL veritabanı servisimizin adıdır. Uygulamanızda bu servise bu isimle erişeceksiniz.image: postgres:14: Kullanılacak Docker imajını belirtir. Burada PostgreSQL’in 14. sürümünü kullanıyoruz. İhtiyacınıza göre sürümü değiştirebilirsiniz.restart: always: Konteynerin bir hata durumunda veya Docker daemon yeniden başlatıldığında otomatik olarak yeniden başlatılmasını sağlar.environment:: Konteyner içindeki ortam değişkenlerini ayarlar.POSTGRES_DB: Oluşturulacak ilk veritabanının adıdır.POSTGRES_USER: Veritabanına bağlanmak için kullanılacak kullanıcı adıdır.POSTGRES_PASSWORD: Kullanıcı için parola. Gerçek uygulamalarda bu parolanın güvenli bir şekilde yönetildiğinden (örneğin Docker secrets ile) emin olun.
ports: - "5432:5432": Host makinenizin 5432 portunu, konteynerin 5432 portuna yönlendirir. Böylece veritabanına dışarıdan erişebilirsiniz.volumes: - db_data:/var/lib/postgresql/data: Veritabanı verilerinin kalıcı olmasını sağlar.db_dataadında bir Docker volume’u oluşturulur ve PostgreSQL’in veri dizinine bağlanır. Bu sayede konteyner silinse bile verileriniz kaybolmaz.healthcheck:: Konteynerin sağlık durumunu düzenli olarak kontrol eder.pg_isreadykomutu, PostgreSQL sunucusunun bağlantıları kabul edip etmediğini kontrol eder.volumes: db_data:: Tanımlanmış volume’u oluşturur.
3. Veritabanı Başlangıç Betikleri (Opsiyonel)
Eğer veritabanı ilk başlatıldığında otomatik olarak bazı tabloları oluşturmak veya başlangıç verisi eklemek isterseniz, init.sql adında bir dosya oluşturabilirsiniz.
postgres-compose-example dizini içinde init.sql adında bir dosya oluşturun:
touch init.sql
init.sql dosyasının içine aşağıdaki gibi SQL komutları ekleyebilirsiniz:
-- init.sql
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com') ON CONFLICT (email) DO NOTHING;
INSERT INTO users (name, email) VALUES ('Jane Smith', 'jane.smith@example.com') ON CONFLICT (email) DO NOTHING;
Bu betiği kullanmak için docker-compose.yml dosyasındaki volumes bölümündeki aşağıdaki satırı etkinleştirmeniz gerekir:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
Bu, init.sql dosyanızı PostgreSQL imajının başlangıç betiklerini aradığı dizine kopyalar ve ilk başlatma sırasında otomatik olarak çalıştırır.
4. Servisleri Başlatma
docker-compose.yml dosyasını ve (isteğe bağlı) init.sql dosyasını kaydettikten sonra, proje dizininizde aşağıdaki komutu çalıştırarak PostgreSQL servisini başlatabilirsiniz:
docker compose up -d
up:docker-compose.ymldosyasında tanımlanan servisleri oluşturur ve başlatır.-d: (detached mode) Servisleri arka planda çalıştırır, böylece terminalinizi kullanmaya devam edebilirsiniz.
Docker, PostgreSQL imajını indirip (eğer yerel olarak yoksa) konteyneri oluşturup başlatacaktır.
5. Kurulumu Doğrulama
Servislerin çalıştığından emin olmak için aşağıdaki komutu kullanın:
docker compose ps
Çıktıda db servisinin running (çalışıyor) durumda olduğunu görmelisiniz. Ayrıca konteynerin sağlık durumu da (health: starting, healthy) görünecektir.
NAME COMMAND SERVICE STATUS PORTS
postgres-compose-example-db-1 "docker-entrypoint.s…" db running (healthy) 0.0.0.0:5432->5432/tcp
Konteynerin loglarını kontrol etmek için:
docker compose logs db
Bu, PostgreSQL sunucusunun başlatıldığını gösteren çıktıları gösterecektir.
Veritabanına Bağlanma
PostgreSQL’e bağlanmak için çeşitli yöntemler kullanabilirsiniz:
a) Host Makinenizden psql ile Bağlanma:
Eğer host makinenizde psql kuruluysa, doğrudan bağlanabilirsiniz:
psql -h localhost -p 5432 -U myuser -d mydatabase
Parola sorulduğunda mypassword girin.
Bağlantı başarılı olursa, PostgreSQL komut istemcisinde olacaksınız. \dt komutuyla tabloları listeyebilirsiniz (eğer init.sql kullandıysanız users tablosunu görmelisiniz).
\dt
Bir sorgu çalıştırmayı deneyin:
SELECT * FROM users;
Çıkmak için \q yazın ve Enter’a basın.
b) Docker Konteyneri İçinden psql ile Bağlanma:
psql host makinenizde kurulu değilse veya konteyner ortamında bir şeyi test etmek isterseniz, doğrudan konteynerin içine bağlanabilirsiniz:
Önce PostgreSQL konteynerinin adını veya ID’sini bulun:
docker ps
Ardından, konteynerin içine bağlanın ve psql‘i çalıştırın (<container_id_or_name> yerine kendi konteynerinizin adını veya ID’sini yazın):
docker exec -it <container_id_or_name> psql -U myuser -d mydatabase
Parola sorulduğunda mypassword girin. Aynı şekilde sorgularınızı çalıştırabilirsiniz.
c) Veritabanı Yönetim Araçları (PgAdmin, DBeaver vb.):
PostgreSQL’e bağlanmak için PgAdmin, DBeaver veya DataGrip gibi GUI tabanlı araçları da kullanabilirsiniz. Bağlantı ayarları genellikle şunlar olacaktır:
- Host:
localhost - Port:
5432 - User:
myuser - Password:
mypassword - Database:
mydatabase
6. Servisleri Yönetme
Docker Compose ile servislerinizi yönetmek oldukça kolaydır:
- Servisleri Durdurma:
docker compose stopBu, konteynerleri durdurur ancak kaldırmaz. Yeniden başlatıldığında verileriniz korunur.
- Servisleri Başlatma (Durdurulduktan Sonra):
docker compose startDaha önce durdurulan servisleri yeniden başlatır.
- Servisleri Yeniden Başlatma:
docker compose restartÇalışan servisleri durdurur ve yeniden başlatır.
- Servisleri Durdurma ve Kaldırma:
docker compose downBu komut, konteynerleri, ağları ve varsa harici olarak belirtilen tüm kaynakları durdurur ve kaldırır. Ancak volume’lar varsayılan olarak korunur, yani verileriniz kalır.
- Servisleri Tamamen Kaldırma (Verileriyle Birlikte):
docker compose down -vBu komut,
docker compose downile aynı şeyi yapar, ancak-v(veya--volumes) bayrağı sayesinde Docker volume’larını da kaldırır. Bu işlemle veritabanı verileriniz kalıcı olarak silinecektir. Dikkatli kullanın!
Sonuç
Bu rehberde, Docker Compose kullanarak bir PostgreSQL veritabanını başarıyla kurmayı, yapılandırmayı ve yönetmeyi öğrendiniz. Bu yöntem, geliştirme ve test ortamlarınız için tutarlı, izole ve taşınabilir bir veritabanı kurulumu sağlar.
İleri düzey konular için, Docker Swarm veya Kubernetes ile PostgreSQL’i dağıtma, yedekleme ve kurtarma stratejileri oluşturma, replikasyon ve daha gelişmiş güvenlik ayarları gibi konuları araştırabilirsiniz. Ancak, temel geliştirme ihtiyaçlarınız için bu kurulum oldukça yeterli olacaktır.