Elbette, Docker Compose ile PostgreSQL kurulumuna yönelik, uzman bir sistem yöneticisi bakış açısıyla hazırlanmış teknik blog yazınız aşağıdadır:
***
Docker Compose ile Üretim Ortamına Yakın PostgreSQL Kurulum Rehberi
Modern uygulama geliştirme süreçlerinde veritabanı yönetimi, karmaşık ve zaman alıcı bir görev olabilir. Ancak Docker ve Docker Compose gibi araçlar sayesinde, veritabanı kurulumları ve yönetimleri oldukça basitleştirilmiştir. Bu rehberde, Docker Compose kullanarak hızlı, izole edilmiş ve üretim ortamlarına yakın bir PostgreSQL veritabanı sunucusunu nasıl ayağa kaldıracağınızı adım adım inceleyeceğiz.
Docker Compose, çoklu kapsayıcı (multi-container) Docker uygulamalarını tanımlamak ve çalıştırmak için bir araçtır. Tek bir YAML dosyası ile uygulamanızın tüm servislerini (örneğin, bir web uygulaması, bir API servisi ve bir veritabanı) yapılandırabilir, başlatabilir ve yönetebilirsiniz. Bu, özellikle geliştirme ve test ortamlarında tutarlılık sağlamak için kritik öneme sahiptir.
Neden Docker Compose ile PostgreSQL?
- İzolasyon: Veritabanı ve uygulamanız diğer sistem bileşenlerinden tamamen izole çalışır.
- Taşınabilirlik: Aynı Docker Compose dosyası ile farklı ortamlarda (geliştirme, test, üretim) aynı veritabanı yapısını kolayca kurabilirsiniz.
- Sürüm Yönetimi: Veritabanı sürümünü (örneğin PostgreSQL 16) kolayca belirleyip değiştirebilirsiniz.
- Hızlı Kurulum ve Kaldırma: Tek komutla tüm veritabanı ortamını kurabilir veya kaldırabilirsiniz.
- Veri Kalıcılığı: Verilerinizi kapsayıcıdan bağımsız olarak kalıcı depolama alanlarında saklayabilirsiniz.
Ön Gereksinimler
Bu rehberi takip edebilmek için sisteminizde aşağıdaki bileşenlerin kurulu olması gerekmektedir:
- Docker Desktop: Docker Engine ve Docker Compose bileşenlerini içerir. Linux kullanıcıları için Docker Engine ve Docker Compose eklentisi.
- Temel komut satırı (terminal) bilgisi.
Proje Yapısı ve Dosyaların Oluşturulması
Öncelikle projeniz için bir ana dizin oluşturalım ve içine gerekli dosyaları yerleştirelim:
mkdir my-pg-app
cd my-pg-app
touch docker-compose.yml .env
mkdir -p init-scripts
touch init-scripts/init.sql
Bu komutlar ile aşağıdaki dizin yapısını oluşturmuş olmalıyız:
my-pg-app/
├── docker-compose.yml
├── .env
└── init-scripts/
└── init.sql
docker-compose.yml Dosyasının Hazırlanması
Bu dosya, PostgreSQL servisimizi tanımlayacağımız ana konfigürasyon dosyasıdır. Aşağıdaki içeriği docker-compose.yml dosyanıza ekleyin:
version: '3.8' # Docker Compose dosya formatının versiyonu
services:
db: # Veritabanı servisimizi tanımlıyoruz
image: postgres:16-alpine # PostgreSQL'in 16. sürümünü Alpine Linux üzerinde kullanıyoruz (daha küçük boyutlu)
container_name: my_postgres_db # Kapsayıcıya okunabilir bir isim veriyoruz
restart: unless-stopped # Kapsayıcı durdurulmadıkça veya bir hata nedeniyle çökmedikçe yeniden başlatılmasını sağlar
environment: # PostgreSQL'in başlangıç ayarları için ortam değişkenleri
POSTGRES_DB: ${POSTGRES_DB} # Veritabanı adı, .env dosyasından alınacak
POSTGRES_USER: ${POSTGRES_USER} # Veritabanı kullanıcısı, .env dosyasından alınacak
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # Veritabanı parolası, .env dosyasından alınacak
ports:
- "5432:5432" # Dışarıdan 5432 portundan gelen istekleri kapsayıcının 5432 portuna yönlendir
volumes:
- pgdata:/var/lib/postgresql/data # Veritabanı verilerini kalıcı olarak saklamak için named volume kullanıyoruz
- ./init-scripts:/docker-entrypoint-initdb.d # Başlangıçta çalıştırılacak SQL scriptleri için bind mount
healthcheck: # Kapsayıcının sağlıklı olup olmadığını kontrol etmek için sağlık kontrolü
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] # Veritabanının hazır olup olmadığını kontrol eder
interval: 5s # Her 5 saniyede bir kontrol et
timeout: 5s # Kontrol için maksimum 5 saniye bekle
retries: 5 # 5 başarısız denemeden sonra sağlıksız olarak işaretle
start_period: 10s # Kapsayıcı başlangıcında ilk 10 saniye içinde başarısız olan kontrolleri göz ardı et
volumes:
pgdata: # pgdata adında bir named volume tanımlıyoruz
Açıklamalar:
version: '3.8': Docker Compose dosya formatının sürümünü belirtir.services: Docker Compose uygulamanızın ana bileşenlerini tanımlar.db: PostgreSQL servisimizin adıdır.image: postgres:16-alpine: Kullanılacak Docker imajını belirtir.alpinesürümü daha hafif ve daha güvenli olduğu için tercih edilir.container_name: my_postgres_db: Oluşturulacak kapsayıcıya kolayca erişilebilecek bir isim verir.restart: unless-stopped: Kapsayıcının beklenmedik bir şekilde durması veya sunucu yeniden başlatıldığında otomatik olarak tekrar başlamasını sağlar.environment: PostgreSQL için başlangıç ayarlarını (veritabanı adı, kullanıcı adı, parola) tanımlar.${VARIABLE_NAME}sözdizimi, bu değerlerin.envdosyasından alınacağını gösterir.ports: - "5432:5432": Host makinesinin 5432 portunu, kapsayıcının 5432 portuna eşler. Böylece host makinesinden PostgreSQL’e erişebilirsiniz.volumes:pgdata:/var/lib/postgresql/data: Bu satır, PostgreSQL’in veri dizinini (/var/lib/postgresql/data) Docker’ın yönettiğipgdataadlı bir named volume’a bağlar. Bu, kapsayıcı silinse bile veritabanı verilerinizin kalıcı olarak saklanmasını sağlar../init-scripts:/docker-entrypoint-initdb.d: Bu, yerelinit-scriptsdizinindeki tüm.sql,.shveya.sql.gzdosyalarının PostgreSQL kapsayıcısı ilk başlatıldığında otomatik olarak çalıştırılmasını sağlar. Bu sayede veritabanı, tablo veya başlangıç verilerini otomatik olarak oluşturabilirsiniz.
healthcheck: Kapsayıcının sadece çalışır durumda olup olmadığını değil, aynı zamanda içindeki servisin (PostgreSQL) de sağlıklı bir şekilde hizmet verip vermediğini kontrol eder.volumes: pgdata::pgdataadında boş bir named volume tanımlar. Docker, bu volume’u otomatik olarak yönetir.
.env Dosyasının Hazırlanması
Veritabanı kimlik bilgilerinizi ve adını .env dosyasında saklamak, hassas bilgileri docker-compose.yml dosyasından ayırır ve güvenliği artırır. Ayrıca bu, farklı ortamlar için kolayca farklı konfigürasyonlar kullanmanıza olanak tanır.
.env dosyasını aşağıdaki gibi doldurun:
POSTGRES_DB=mydb
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
Önemli: Üretim ortamlarında güçlü ve karmaşık parolalar kullanmaya özen gösterin!
Veritabanı Başlatma Scripti (init-scripts/init.sql)
PostgreSQL kapsayıcısı ilk kez başlatıldığında, /docker-entrypoint-initdb.d dizinindeki tüm .sql dosyalarını otomatik olarak çalıştırır. Bu özellik sayesinde veritabanınızda başlangıç tabloları oluşturabilir veya örnek veri ekleyebilirsiniz.
init-scripts/init.sql dosyasını aşağıdaki gibi düzenleyin:
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 ('Ali Can', 'ali.can@example.com') ON CONFLICT (email) DO NOTHING;
INSERT INTO users (name, email) VALUES ('Ayşe Yılmaz', 'ayse.yilmaz@example.com') ON CONFLICT (email) DO NOTHING;
Bu script, eğer yoksa users adında bir tablo oluşturacak ve içine iki örnek kullanıcı kaydı ekleyecektir. ON CONFLICT DO NOTHING ifadesi, scriptin birden fazla kez çalıştırılması durumunda aynı veriyi tekrar eklemeyi engeller.
Servisi Başlatma
Tüm dosyalarımızı hazırladığımıza göre, şimdi Docker Compose ile PostgreSQL servisimizi başlatabiliriz. my-pg-app dizini içinde terminali açın ve aşağıdaki komutu çalıştırın:
docker compose up -d
docker compose up:docker-compose.ymldosyasında tanımlanan servisleri oluşturur ve başlatır.-d(detached mode): Kapsayıcıları arka planda çalıştırır ve terminalinizi serbest bırakır.
Komutu çalıştırdıktan sonra Docker, PostgreSQL imajını indirip (eğer yerelde yoksa) kapsayıcıyı oluşturacak ve başlatacaktır. İlk başlatmada init.sql scripti de çalışacaktır.
Kurulumu Doğrulama
Servisin doğru bir şekilde çalıştığını doğrulamak için çeşitli kontroller yapabiliriz.
Kapsayıcının Durumunu Kontrol Etme
docker compose ps
Çıktı aşağıdaki gibi olmalı (durumun Up (healthy) olduğuna dikkat edin):
NAME COMMAND SERVICE STATUS PORTS
my_postgres_db "docker-entrypoint.s…" db running (healthy) 0.0.0.0:5432->5432/tcp
Kapsayıcı Loglarını Kontrol Etme
docker compose logs db
Bu komut, PostgreSQL kapsayıcısının loglarını gösterecektir. Loglarda database system is ready to accept connections gibi mesajları görmeniz, veritabanının başarıyla başlatıldığını gösterir. Ayrıca init.sql scriptinin başarıyla çalıştığına dair çıktılar da görebilirsiniz.
Veritabanına Bağlanma ve Verileri Kontrol Etme
Şimdi doğrudan veritabanı kapsayıcısının içine girip psql istemcisi ile bağlanarak verilerimizi kontrol edelim:
docker compose exec db psql -U myuser -d mydb
docker compose exec db:dbservisi kapsayıcısının içinde bir komut çalıştırmamızı sağlar.psql -U myuser -d mydb:myuserkullanıcısı ilemydbveritabanına bağlanır.
Bağlandıktan sonra aşağıdaki komutları çalıştırarak tabloları ve verileri listeleyebilirsiniz:
\dt
Çıktı:
List of relations
Schema | Name | Type | Owner
--------+---------+-------+---------
public | users | table | myuser
(1 row)
SELECT * FROM users;
Çıktı:
id | name | email
----+-------------+---------------------
1 | Ali Can | ali.can@example.com
2 | Ayşe Yılmaz | ayse.yilmaz@example.com
(2 rows)
Verilerin başarıyla eklenmiş olduğunu gördüğünüze göre, \q komutuyla psql istemcisinden çıkış yapabilirsiniz.
Uygulamanızdan Bağlanma (Kısa Bilgi)
Eğer bir uygulama geliştiriyorsanız, uygulamanızı bu PostgreSQL veritabanına aşağıdaki bağlantı bilgileriyle bağlayabilirsiniz:
- Host:
localhostveya127.0.0.1 - Port:
5432 - Database:
mydb(veya.envdosyanızdakiPOSTGRES_DBdeğeri) - User:
myuser(veya.envdosyanızdakiPOSTGRES_USERdeğeri) - Password:
mypassword(veya.envdosyanızdakiPOSTGRES_PASSWORDdeğeri)
Servisi Durdurma ve Kaldırma
PostgreSQL servisini durdurmak veya tamamen kaldırmak için aşağıdaki komutları kullanabilirsiniz.
Sadece Durdurma
Kapsayıcıyı durdurur ancak verilerini ve diğer kaynaklarını korur:
docker compose stop
Durdurma ve Kaldırma (Verileri Korumak İçin)
Kapsayıcıyı, ağları ve diğer tanımlı kaynakları kaldırır, ancak verilerin saklandığı pgdata volume’u korur:
docker compose down
Durdurma ve Tamamen Kaldırma (Veriler Dahil)
Kapsayıcıyı, ağları ve veri volume’unu (pgdata) da kaldırır. Bu komutu çalıştırdığınızda verileriniz kalıcı olarak silinecektir. Dikkatli kullanın!
docker compose down -v
Sonuç
Bu rehberde, Docker Compose kullanarak güvenilir, taşınabilir ve yönetim kolaylığı sağlayan bir PostgreSQL veritabanı ortamını nasıl kuracağımızı öğrendik. .env dosyası ile ortam değişkenlerini yönetmek, named volume’lar ile veri kalıcılığını sağlamak, init.sql ile başlangıç verilerini yapılandırmak ve sağlık kontrolleri eklemek, üretim ortamlarına yakın bir kurulum için temel ve kritik adımlardır. Artık kendi uygulamalarınız için bu yapıyı rahatlıkla kullanabilir ve geliştirme süreçlerinizi hızlandırabilirsiniz.
***
