Docker Compose ile PostgreSQL Kurulum Rehberi
Sistem yöneticisi olarak, modern uygulama geliştirme ve dağıtım süreçlerinde veritabanı yönetiminin ne kadar kritik olduğunu biliyorum. Docker Compose, karmaşık çoklu konteyner uygulamalarını tanımlama ve çalıştırma için güçlü bir araçtır ve PostgreSQL gibi ilişkisel veritabanlarını izole, taşınabilir ve kolay yönetilebilir bir şekilde kurmak için ideal bir çözümdür. Bu rehberde, Docker Compose kullanarak bir PostgreSQL veritabanını nasıl hızlıca ayağa kaldıracağımızı adım adım inceleyeceğiz.
Neden Docker Compose ile PostgreSQL?
Geleneksel veritabanı kurulumları genellikle işletim sistemine bağımlılıklar, versiyon çakışmaları ve manuel konfigürasyon gibi zorluklarla doludur. Docker Compose bu sorunları ortadan kaldırır:
- İzolasyon: Veritabanı, diğer sistem bileşenlerinden tamamen izole bir ortamda çalışır.
- Taşınabilirlik: Aynı `docker-compose.yml` dosyası ile her ortamda (geliştirme, test, üretim) aynı veritabanı ortamını oluşturabilirsiniz.
- Kolay Yönetim: Tek bir komutla veritabanını başlatabilir, durdurabilir ve silebilirsiniz.
- Veri Kalıcılığı: Verileriniz konteyner yaşam döngüsünden bağımsız olarak kalıcı depolama alanlarında saklanır.
- Versiyon Kontrolü: `docker-compose.yml` dosyası versiyon kontrol sistemlerine entegre edilebilir, bu da altyapı kod olarak (IaC) yaklaşımını destekler.
Ön Gereksinimler
Bu rehberi takip edebilmek için sisteminizde aşağıdaki bileşenlerin kurulu olması gerekmektedir:
- Docker Engine: Konteynerleri çalıştırmak için temel araç.
- Docker Compose: Çoklu konteyner uygulamalarını yönetmek için Docker ile birlikte gelir (Docker Desktop ile otomatik kurulur).
Kurulumları kontrol etmek için terminalinizde aşağıdaki komutları çalıştırabilirsiniz:
docker --version
docker compose version
Proje Yapısının Oluşturulması
İlk adım olarak, projemiz için bir dizin oluşturalım ve bu dizine geçelim:
mkdir postgresql-dc-rehberi
cd postgresql-dc-rehberi
Bu dizin içinde, Docker Compose konfigürasyon dosyamızı (`docker-compose.yml`) ve hassas bilgileri depolamak için bir çevre değişkenleri dosyasını (`.env`) oluşturacağız.
touch docker-compose.yml
touch .env
`docker-compose.yml` Dosyasının Oluşturulması
Şimdi `docker-compose.yml` dosyamızı aşağıdaki gibi düzenleyelim. Bu dosya, PostgreSQL servisimizi ve ona ait özellikleri tanımlar.
version: '3.8'
services:
db:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
PGDATA: /var/lib/postgresql/data/pgdata # Veri yolunu belirleriz
ports:
- "5432:5432" # Host:Container port eşleşmesi
volumes:
- db-data:/var/lib/postgresql/data # Veri kalıcılığı için named volume
networks:
- app_network # İsteğe bağlı, ağ izolasyonu için
volumes:
db-data: # Named volume tanımı
networks:
app_network: # İsteğe bağlı, ağ tanımı
Açıklamalar:
- `version: ‘3.8’`: Docker Compose dosya formatının sürümünü belirtir.
- `services`: Tanımladığımız konteyner servislerini içerir.
- `db`: PostgreSQL servisi için verdiğimiz isimdir. Uygulamanız bu isimle veritabanına bağlanacaktır.
- `image: postgres:15-alpine`: PostgreSQL’in hangi sürümünü kullanacağımızı belirtir. `alpine` etiketi, daha küçük bir imaj boyutu ve daha hızlı indirme süreleri sağlar.
- `restart: always`: Konteynerin bir hata durumunda veya Docker daemon yeniden başlatıldığında otomatik olarak tekrar başlatılmasını sağlar.
- `environment`: PostgreSQL konteyneri için gerekli ortam değişkenlerini tanımlar. Bu değişkenler `.env` dosyasından alınır.
- `POSTGRES_DB`: Oluşturulacak ilk veritabanının adı.
- `POSTGRES_USER`: Veritabanı kullanıcısının adı.
- `POSTGRES_PASSWORD`: Veritabanı kullanıcısının parolası.
- `PGDATA`: Veritabanı verilerinin konteyner içindeki depolama yolunu belirler.
- `ports: – “5432:5432″`: Host makinemizin 5432 portunu, konteynerin 5432 portuna yönlendirir. Bu, host makinemizden veritabanına bağlanmamızı sağlar.
- `volumes: – db-data:/var/lib/postgresql/data`: Veritabanı verilerinin kalıcılığını sağlar. `db-data` adında bir named volume oluşturulur ve konteyner içindeki `/var/lib/postgresql/data` yoluna bağlanır. Bu sayede konteyner silinse bile verileriniz kaybolmaz.
- `networks: – app_network`: İsteğe bağlı olarak, bu servisi belirli bir ağa atarız. Bu, diğer servislerin bu ağ üzerinden `db` servisi ile iletişim kurmasını sağlar.
- `volumes`: En üst seviyede `db-data` named volume’unun tanımını yaparız.
- `networks`: En üst seviyede `app_network` ağının tanımını yaparız.
`.env` Dosyasının Oluşturulması
Güvenlik ve esneklik açısından, hassas bilgileri (`POSTGRES_DB`, `POSTGRES_USER`, `POSTGRES_PASSWORD`) doğrudan `docker-compose.yml` dosyasına yazmak yerine ayrı bir `.env` dosyasında tutmak en iyi uygulamadır. `.env` dosyasını `docker-compose.yml` ile aynı dizine oluşturun ve aşağıdaki içeriği ekleyin:
POSTGRES_DB=mydatabase
POSTGRES_USER=myuser
POSTGRES_PASSWORD=mysupersecretpassword
Önemli: Üretim ortamlarında çok daha güçlü ve rastgele parolalar kullanmaya özen gösterin. Bu `.env` dosyasını versiyon kontrol sistemlerine (git gibi) eklemeyin. Bunun yerine, bu değişkenleri CI/CD süreçlerinizde veya sunucuya manuel olarak dağıtım yaparken güvenli bir şekilde yönetin.
PostgreSQL Konteynerini Çalıştırma
Tüm dosyaları hazırladıktan sonra, terminalinizde `postgresql-dc-rehberi` dizininde olduğunuzdan emin olun ve aşağıdaki komutu çalıştırın:
docker compose up -d
Bu komut, Docker Compose dosyasını okur, gerekli PostgreSQL imajını indirir (eğer yerel olarak yoksa), named volume’u oluşturur ve PostgreSQL konteynerini arka planda (`-d` veya `–detach`) çalıştırır.
Kurulumu Doğrulama
Konteynerin başarıyla çalışıp çalışmadığını kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
docker ps
Çıktıda `db` servisi için bir konteynerin `Up` durumda olduğunu görmelisiniz. Konteynerin loglarını incelemek isterseniz:
docker compose logs db
Loglarda “database system is ready to accept connections” gibi bir mesaj görmeniz, PostgreSQL’in başarıyla başlatıldığı anlamına gelir.
İsterseniz, host makinenizden `psql` (PostgreSQL komut satırı aracı) kullanarak veritabanına bağlanabilirsiniz:
psql -h localhost -p 5432 -U myuser -d mydatabase
Parola istendiğinde `.env` dosyasındaki `mysupersecretpassword` parolasını girin. Başarıyla bağlanırsanız, veritabanınız kullanıma hazırdır.
Veritabanını Durdurma ve Temizleme
Veritabanı konteynerini durdurmak ve oluşturulan ağı ve konteyneri kaldırmak için:
docker compose down
Önemli Not: Yukarıdaki komut verilerinizi tutan `db-data` named volume’unu silmez. Bu, bir sonraki `docker compose up` komutunda verilerinizin kalmasını sağlar. Eğer verilerinizi de tamamen silmek istiyorsanız (örneğin geliştirme ortamını sıfırlarken), aşağıdaki komutu kullanın:
docker compose down --volumes
Bu komut, konteynerleri, ağları ve ilişkili named volume’ları (`db-data` dahil) kaldırır, böylece tüm veritabanı verileriniz silinir.
Sonuç
Bu rehberle, Docker Compose kullanarak kalıcı verilere sahip, izole edilmiş ve kolay yönetilebilir bir PostgreSQL veritabanı ortamını başarıyla kurmuş olduk. Bu kurulum, geliştirme ortamlarınızı standartlaştırmanıza, test süreçlerinizi hızlandırmanıza ve üretim ortamı dağıtımlarını basitleştirmenize olanak tanır. Artık uygulamanız bu `db` servisine kolayca bağlanabilir ve veritabanı işlemlerini gerçekleştirebilir. Bir sonraki adım, uygulamanızı bu veritabanına bağlamak ve tam bir konteynerize edilmiş uygulama yığını oluşturmaktır.
