Ana içeriğe geç

Docker’da PostgreSQL: Yeni Başlayanlar için Adım Adım Rehber

Kurulumdan en iyi uygulamalara kadar Docker’da PostgreSQL çalıştırmanın eksiksiz rehberi; böylece geliştirme iş akışınızı baş ağrısı olmadan iyileştirin.
· 15 dk. oku

Yapay Zeka ile Keşfedin

Bir PostgreSQL geliştirme ortamını kurmak saatlerce yapılandırma ve sorun giderme gerektirmemeli — Docker ile de gerektirmez.

Docker, işletim sisteminiz ne olursa olsun, PostgreSQL’i dakikalar içinde ayağa kaldırmanın net bir yolunu sunar. Sadece birkaç komutla, sisteminizden yalıtılmış, bağımlılık çakışmalarını ve kurulum dertlerini önleyen, tamamen işlevsel bir veritabanı ortamı oluşturabilirsiniz.

Docker’da PostgreSQL, yerel kurulumunuzu bozma korkusu olmadan deneme yapma özgürlüğü verir. Veritabanı örneklerini kolayca oluşturabilir, değiştirebilir veya silebilir, farklı PostgreSQL sürümlerini test edebilir ve gerektiğinde tertemiz bir duruma dönebilirsiniz.

Bu rehberde, sorunsuz bir geliştirme deneyimi için PostgreSQL’i Docker konteynerlerinde çalıştırmaya dair bilmeniz gereken her şeyi adım adım göstereceğim.

>PostgreSQL konusunda fazla deneyiminiz yok mu? Yeni başlayanlar için giriş kursumuz size rehberlik eder.

Neden Docker’da PostgreSQL Kullanmalı?

Docker’dan önce, bir veritabanı kurmak çoğu zaman uzun kurulum kılavuzlarını takip etmeyi, sisteme özgü sorunları çözmeyi ve sistem bağımlılıklarını dikkatle yönetmeyi gerektirirdi. Docker bu yaklaşımı tamamen değiştiriyor.

>Peki bir PostgreSQL veritabanı tam olarak nedir? Nasıl çalıştığını, en yaygın kullanım alanlarını ve kaynakları öğrenin.

PostgreSQL’i Docker’da çalıştırmanın faydaları

Docker, PostgreSQL veritabanlarını çalıştırmanın zarif bir yolunu sunar. Geleneksel kurulum yöntemleriyle karşılaştırıldığında birkaç bariz avantaj sağlar:

  • Basitleştirilmiş kurulum ve yapılandırma: Docker ile tek bir komutla bir PostgreSQL örneği başlatabilirsiniz. Paket yöneticileri, sistem bağımlılıkları veya karmaşık kurulum betikleriyle uğraşmaya son. Veritabanı mantıklı varsayılanlarla önceden yapılandırılmış olarak gelir ve anında kullanıma hazırdır.
  • Ekipler arasında tutarlı ortamlar: Ekipteki herkes, işletim sisteminden bağımsız olarak, tam olarak aynı PostgreSQL kurulumuna sahip olur. Bu durum, geliştirme ekiplerinde yaygın olan “benim makinemde çalışıyor” sorununu ortadan kaldırır.
  • Diğer sistem bileşenlerinden yalıtım: Docker konteynerleri yalıtılmış çalışır; yani PostgreSQL örneğiniz makinenizdeki diğer yazılımlara müdahale etmez. Çakışma olmadan aynı anda birden fazla PostgreSQL sürümünü çalıştırabilir, kaldırmak ise konteyneri durdurup silmek kadar basittir.
  • Veritabanı ortamınız için sürüm kontrolü: Docker, yapılandırma dosyalarınızda tam PostgreSQL sürümlerini belirtmenize olanak tanır. Böylece geliştirme ortamlarının üretimle birebir eşleşmesini sağlayabilir ve yükseltmeleri üretime uygulamadan önce izole şekilde test edebilirsiniz.
  • Kaynak verimliliği: Docker konteynerleri sanal makinelere kıyasla hafiftir. Daha az sistem kaynağı kullanır ve benzer yalıtım avantajları sunar. Bu sayede PostgreSQL’i diğer konteynerlerle yan yana çalıştırabilir ve sistem performansını kayda değer ölçüde etkilemezsiniz.

Ne zaman Docker’da PostgreSQL kullanılmalı

Yıllarca containerize ortamlarda veritabanlarıyla çalıştıktan sonra, geleneksel kurulumlara kıyasla sayısız fayda sağladığını gönül rahatlığıyla söyleyebilirim.

Kolaylık olması adına sadece birkaçını sıralayacağım:

  • Yerel geliştirme ortamları: PostgreSQL kullanan uygulamalar üzerinde çalışan geliştiriciler için Docker, yerel sistemi değiştirmeden hızlı başlangıç sağlar. Üretimde kullanılan veritabanı sürümünü ve yapılandırmasını birebir eşleştirmek kolaydır; bu da yerelde çalışan kodun dağıtıldığında da çalışmasını garanti eder.
  • Mikroservis mimarisi: Uygulamaları mikroservislerle inşa ediyorsanız, Docker her servisin gerekirse kendi veritabanı örneğine sahip olmasına izin verir. Bu, servisler arasında daha iyi yalıtım sağlar ve ekiplerin veritabanı bağımlılıklarını bağımsız yönetmesine olanak tanır.
  • CI/CD hatları ve otomatik testler: Docker, testleri çalıştırmak için taze veritabanı örnekleri oluşturmayı kolaylaştırır. Her test çalıştırması temiz bir veritabanı durumu ile başlayabilir; bu da test güvenilirliğini artırır. 
  • Veritabanı geçiş (migration) betiklerinin geliştirilmesi: Docker, veritabanı geçişlerini test etmek için güvenli bir ortam sağlar. Gerçek sistemlere uygulamadan önce, üretim ortamınızla eşleşen, atılabilir bir veritabanı üzerinde geçiş betiklerinizi doğrulayabilirsiniz.
  • Kubernetes dağıtımları: Orkestrasyon için Kubernetes kullanıyorsanız, PostgreSQL’i Docker’da çalıştırmak doğal bir uyum sağlar. Yerel geliştirme ortamınız, üretim Kubernetes kurulumunuza yakından benzeyebilir; bu da geliştirmeden üretime geçişi pürüzsüz kılar.

Kısacası, Dockerize PostgreSQL geliştirme ve test için idealdir; ancak üretim veritabanı dağıtımlarını yönetmek veri kalıcılığı, yedeklemeler ve yüksek erişilebilirlik gibi ek hususlar gerektirir.

Bu hususlardan bazılarına yazının ilerleyen bölümlerinde değineceğim.

Docker’da PostgreSQL Kurulumu

Postgres veritabanını Docker’da çalıştırmak için ihtiyacınız olan tek şey Docker motorunun kendisidir.

Bu bölümde, önkoşulları karşılamaktan başlayıp Docker konteynerinde tam işlevsel bir PostgreSQL veritabanı çalıştırmaya kadar olan süreci adım adım anlatacağım.

Önkoşullar

Docker’da PostgreSQL’e başlamadan önce, sisteminizde Docker kurulu olmalıdır.

Kurulum işletim sistemine göre değişir. Windows ve macOS kullanıcıları, konteynerleri yönetmek için kullanımı kolay bir grafik arayüz olan Docker Desktop’ı kolayca kurabilir. İndirin from the official Docker website.

Linux kullanıcıları dağıtımlarının paket yöneticisini kullanarak doğrudan Docker Engine’i kurabilir. Örneğin Ubuntu’da:

sudo apt update
sudo apt install docker.io
sudo systemctl enable --now docker

Docker’ın kurulu olmasına ek olarak, temel terminal komutlarına ve image, container ve volume gibi temel Docker kavramlarına aşina olmanız önerilir. DataCamp’ten şu pratik rehberler işinizi görecektir:

PostgreSQL Docker imajını çekmek

PostgreSQL’i çalıştırmadan önce, Docker Hub’dan resmi PostgreSQL Docker imajını indirmeniz gerekir. Bu imaj, konteyner oluşturmak için bir şablon görevi görür.

En son PostgreSQL imajını çekmek için terminali veya komut satırını açıp şunu çalıştırın:

docker pull postgres

Bu komut PostgreSQL’in en son kararlı sürümünü indirir. Belirli bir sürüme ihtiyacınız varsa etiketiyle belirtebilirsiniz:

docker pull postgres:17

Görsel 1 - PostgreSQL veritabanı imajının en son kararlı sürümünü çekmek

Görsel 1 - PostgreSQL veritabanı imajının en son kararlı sürümünü çekmek

Yaygın kullanılan bazı PostgreSQL imaj etiketleri şunlardır:

  • postgres:latest - En güncel kararlı PostgreSQL sürümü
  • postgres:17 - PostgreSQL 14.x sürümü (17 sürümünün en güncel yaması)
  • postgres:17.4 - Belirli bir sürüm (bu örnekte 17.4).
  • postgres:bookworm - Debian Bookworm Linux dağıtımı üzerinde inşa edilmiş PostgreSQL.

Mevcut tüm etiketleri resmi PostgreSQL Docker Hub sayfasında görüntüleyebilirsiniz.

PostgreSQL’i bir Docker konteynerinde çalıştırmak

PostgreSQL imajına sahip olduktan sonra, tek bir komutla bir konteyner oluşturup başlatabilirsiniz:

docker run --name postgres-db -e POSTGRES_PASSWORD=mypassword postgres

Görsel 2 - Bir PostgreSQL konteynerini başlatmak

Görsel 2 - Bir PostgreSQL konteynerini başlatmak

Bu komut, postgres-db adlı yeni bir konteyner oluşturur ve PostgreSQL parolası için bir ortam değişkeni ayarlar.

Ancak bu temel komutun sınırlamaları var. Aşağıdaki ek seçenekleri kullanmanızı öneririm:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -p 5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Görsel 3 - Değişkenlerle, arka planda çalışan modda PostgreSQL konteyneri başlatmak

Görsel 3 - Değişkenlerle, arka planda çalışan modda PostgreSQL konteyneri başlatmak

Bu ek seçenekleri kısaca açıklayayım:

  • Ortam değişkenleri:
    • POSTGRES_PASSWORD: PostgreSQL süper kullanıcı parolasını ayarlar (zorunlu).
    • POSTGRES_USER: Bu adla yeni bir süper kullanıcı oluşturur (belirtilmezse varsayılan "postgres").
    • POSTGRES_DB: Bu adla yeni bir veritabanı oluşturur (belirtilmezse varsayılan kullanıcı adıdır).
  • Port eşleme (-p 5432:5432) konteynerin PostgreSQL portunu (5432) ana makinenizde aynı porta eşler; böylece localhost:5432 ile bağlanabilirsiniz.
  • Hacim bağlama (-v postgres-data:/var/lib/postgresql/data) postgres-data adlı bir Docker hacmi oluşturur ve veritabanı dosyalarını konteynerin dışında kalıcı kılar. Böylece konteyner durduğunda veya silindiğinde verileriniz kaybolmaz.
  • -d bayrağı konteynerin arka planda çalışmasını sağlar. Kısaca, konteyner arka planda çalışır.

Konteynerin çalıştığını şu komutla doğrulayabilirsiniz:

docker ps

Görsel 4 - Çalışan tüm konteynerlerin listelenmesi

Görsel 4 - Çalışan tüm konteynerlerin listelenmesi

Bir sonraki bölümde, belirli kullanım durumları için PostgreSQL konteynerinizi nasıl daha ileri düzeyde yapılandıracağınızı göstereceğim.

Docker’da PostgreSQL Yapılandırma

Önceki bölümde ele aldığım temel kurulum başlangıç için yeterli olacaktır; ancak daha gelişmiş ihtiyaçlar için PostgreSQL konteynerinizi özelleştirmek isteyeceksiniz.

Bu bölüm tam da bununla ilgili.

Hacimlerle kalıcı depolama ayarlama

Docker’da bir veritabanı çalıştırırken en önemli konulardan biri, verilerinizin konteynerin yaşam döngüsünün ötesinde kalıcı olmasını sağlamaktır. Varsayılan olarak, bir konteyner içindeki tüm veriler, konteyner kaldırıldığında kaybolur. Veritabanları için bu neredeyse hiç istenen bir durum değildir.

Docker hacimleri, verileri konteyner dosya sistemi dışında depolayarak bu soruna çözüm sunar.

Kurmak için, önce adlandırılmış bir hacim oluşturun:

docker volume create postgres-data

İsterseniz aşağıdaki komutla hacim ayrıntılarını inceleyebilirsiniz:

docker volume inspect postgres-data

Görsel 5 - Hacim ayrıntılarının listelenmesi

Görsel 5 - Hacim ayrıntılarının listelenmesi

Şimdi PostgreSQL konteynerinizi başlatırken, hacmi PostgreSQL veri dizinine bağlayın:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

-v postgres-data:/var/lib/postgresql/data parametresi, adlandırılmış hacmi konteynerin veri dizinine bağlar.

Özetle, PostgreSQL için hacim kullanmanın avantajları şunlardır:

  • Konteyneri silseniz bile verileriniz kalıcı olur.
  • Konteyneri durdurup başlatabilir veya yükseltebilirsiniz; veriler kaybolmaz.
  • Hacmi yedekleyerek verilerinizin yedeğini alabilirsiniz.
  • Bağlı dizinlere (bind mount) kıyasla daha iyi performans (özellikle macOS ve Windows’ta).

PostgreSQL’e bağlanmak için portları açma

Ana makinenizde çalışan uygulamalardan PostgreSQL veritabanınıza bağlanmak için PostgreSQL portunu (5432) yerel sisteminize açmanız gerekir.

En basit yaklaşım, konteynerin 5432 portunu ana makinedeki aynı porta eşlemektir:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  -d postgres

-p 5432:5432 parametresi, konteynerin 5432 portunu ana makinenizin 5432 portuna eşler.

Ana makinenizde zaten 5432 portunu kullanan PostgreSQL veya başka bir servis varsa, farklı bir porta eşleme yapabilirsiniz:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5433:5432 \
  -d postgres

Artık konteynerin 5432 portu, ana makinenizde 5433’e eşlenmiştir. Bağlanırken varsayılan 5432 yerine 5433 portunu belirtmeniz gerekir.

Varsayılan olarak, port tüm ağ arayüzlerinde (0.0.0.0) açılır. İsterseniz ek güvenlik için localhost ile kısıtlayabilirsiniz:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 127.0.0.1:5432:5432 \
  -d postgres

Bu, yalnızca yerel makinenizden bağlantılara izin verir; ağdaki diğer makinelerden değil.

PostgreSQL ayarlarını yapılandırma

Konteynerinizi başlatırken birçok varsayılan PostgreSQL ayarını değiştirebilirsiniz. Yaygın bir yaklaşım, ancak tek yol değil, ortam değişkenleri kullanmaktır.

Veritabanını yapılandırmak için kullanabileceğiniz birkaç değişken şunlardır:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -e POSTGRES_INITDB_ARGS="--data-checksums" \
  -e POSTGRES_HOST_AUTH_METHOD=scram-sha-256 \
  -d postgres

Ve her birinin yaptığı şudur:

  • POSTGRES_PASSWORD: Süper kullanıcı parolasını ayarlar (zorunlu).
  • POSTGRES_USER: Süper kullanıcı adını ayarlar (varsayılan "postgres").
  • POSTGRES_DB: Varsayılan veritabanı adını ayarlar (varsayılan kullanıcı adıyla aynıdır).
  • POSTGRES_INITDB_ARGS: PostgreSQL’in initdb komutuna argümanlar geçirir.
  • POSTGRES_HOST_AUTH_METHOD: Kimlik doğrulama yöntemini ayarlar.

Ortam değişkenlerine ek olarak, veritabanı yapılandırmasına daha gelişmiş değişiklikler yapmak için PostgreSQL yapılandırmasını özelleştirmeyi de tercih edebilirsiniz.

Sık özelleştirilen PostgreSQL ayarlarından bazıları şunlardır:

  • max_connections: PostgreSQL’in kabul edeceği bağlantı sayısını kontrol eder (varsayılan 100).
  • shared_buffers: Önbellekleme için kullanılacak belleği ayarlar (varsayılan değer üretim için genelde düşüktür).
  • work_mem: Sorgu işlemleri için kullanılan bellek.
  • maintenance_work_mem: Bakım işlemleri için kullanılan bellek.

Uygulamada, bir dosya oluşturarak başlayın, adına my-postgres-conf diyelim:

max_connections = 200
shared_buffers = 1GB
work_mem = 16MB
maintenance_work_mem = 256MB

Şimdi konteyneri çalıştırırken bu dosyayı bağlayın:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v ./my-postgres.conf:/etc/postgresql/postgresql.conf \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres \
  -c 'config_file=/etc/postgresql/postgresql.conf'

Kısacası, kalıcılığı, ağ erişimini ve PostgreSQL ayarlarını doğru şekilde yapılandırarak, tam istediğiniz gibi çalışan Docker tabanlı bir PostgreSQL ortamı oluşturabilirsiniz. postgres:latest temel imajı sadece bir başlangıçtır; ayarlayabileceğiniz çok şey var.

Bir sonraki bölümde, Docker’da çalışan PostgreSQL veritabanına nasıl bağlanacağınızı göstereceğim.

Docker’da Çalışan PostgreSQL’e Bağlanma

Artık PostgreSQL konteyneriniz çalıştığına göre, sıradaki adım ona bağlanmak. Sonuçta veritabanını başka ne için çalıştırırız?

Bu bölümde, containerize PostgreSQL veritabanınıza bağlanmanın iki yolunu göstereceğim: komut satırı psql aracı ve grafik arayüz kullanmak.

Referans olması için, veritabanı konteynerimi şu komutla çalıştırıyorum:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  -d postgres

psql komut satırı aracıyla bağlanma

psql komut satırı aracı, veritabanıyla SQL komutları kullanarak etkileşim kurmanızı sağlayan resmi PostgreSQL istemcisidir. 

Konteynerde çalışan PostgreSQL veritabanına ana makinenizden bağlanmak için aşağıdaki komutu çalıştırın; kullanıcı ve veritabanı değerlerini güncellemeyi unutmayın:

docker exec -it postgres-db psql -U myuser -d mydatabase

Görsel 6 - psql kullanarak Postgres veritabanına bağlanma

Görsel 6 - psql kullanarak Postgres veritabanına bağlanma

Hepsi bu!

Komutun ne yaptığından emin değilseniz, kısa bir özet:

  • docker exec -it postgres-db: "postgres-db" adlı konteyner içinde etkileşimli bir komut çalıştırın.
  • psql -U myuser -d mydatabase: psql’i başlatıp "myuser" olarak "mydatabase" veritabanına bağlanın.

Bağlanırken sorun yaşıyorsanız şu yaygın noktalara bakın:

  • docker ps ile konteynerin çalıştığını doğrulayın.
  • docker port postgres-db ile port eşlemesini kontrol edin.

Bir GUI aracıyla bağlanma

Birçok geliştirici, CLI yerine grafik araç kullanmayı tercih eder — ben de dahil. PostgreSQL için popüler ve ücretsiz bir seçenek pgAdmin’dir; ancak DBeaver, DataGrip veya TablePlus gibi araçlarda da süreç benzerdir.

pgAdmin’in kurulumu basittir; burada ele almayacağım.

Kurulu ve çalışır durumda olduğunu varsayarsak, tarayıcı panelinde "Servers" üzerine sağ tıklayıp "Register > Server"’ı seçin. Genel sekmede bağlantınıza bir ad verin:

Görsel 7 - pgAdmin genel sekmesi

Görsel 7 - pgAdmin genel sekmesi

Ardından "Connection" sekmesine geçin ve şu bilgileri girin:

  • Host name/address: localhost
  • Port: 5432 (veya eşlediğiniz herhangi bir port)
  • Maintenance database: mydatabase
  • Username: myuser
  • Password: PostgreSQL parolanız

Görsel 8 - pgAdmin bağlantı sekmesi

Görsel 8 - pgAdmin bağlantı sekmesi

Son olarak bağlanmak için "Save"’e tıklayın:

Görsel 9 - Başarılı bağlantı

Görsel 9 - Başarılı bağlantı

Bağlantıyı kurduktan sonra, veritabanınızla, yerel olarak kurulu ya da bulutta sağlanan bir PostgreSQL örneğinde olduğu gibi çalışmaya başlayabilirsiniz. Docker’ın güzelliği şudur: Uygulamanızın veya istemcinizin perspektifinden bir fark yoktur — belirtilen adresten erişilebilen bir PostgreSQL veritabanıdır.

>PostgreSQL veritabanınıza programatik erişim mi lazım? Python’dan nasıl erişeceğinizi öğrenin.

Bir sonraki bölümde, konteynerinizi durdurma, başlatma ve izleme dahil PostgreSQL konteynerini nasıl yöneteceğinizi ele alacağım.

Docker’da PostgreSQL Yönetimi

Bir konteynerde PostgreSQL veritabanını çalıştırmak ve ona bağlanmak bir şeydir, yönetmek bambaşka. Neyse ki elinizin altında bir dizi komut var.

Bu bölümde, konteynerinizi durdurma ve başlatma, günlükleri inceleme ve PostgreSQL sürümünü güncel tutma gibi temel işlemleri ele alacağım.

PostgreSQL konteynerini durdurma, yeniden başlatma ve kaldırma

Docker’ın komut satırı araçları, PostgreSQL konteynerinizin yaşam döngüsünü yönetmenize olanak tanır.

Çalışan bir PostgreSQL konteynerini durdurmak için şunu çalıştırın:

docker stop postgres-db

Benzer şekilde, yeniden başlatmak istediğinizde şu komutu çalıştırın:

docker start postgres-db

Görsel 10 - Konteyneri durdurup başlatmak

Görsel 10 - Konteyneri durdurup başlatmak

Bazı yapılandırma değişikliklerinden sonra işe yarayabilecek şekilde, çalışan bir konteyneri yeniden başlatmak için şu komutu çalıştırın:

docker restart postgres-db

Bir konteynerle işiniz tamamen bitti ve kaldırmak istiyorsanız, şu iki komut yeterlidir:

docker stop postgres-db
docker rm postgres-db

Unutmayın, bir konteyneri kaldırmak verilerinizi silmez; eğer bir hacmi doğru şekilde yapılandırdıysanız. Verileriniz, daha önce oluşturduğunuz postgres-data hacminde kalır.

Konteynerin kaldırıldığını doğrulamak için şunu çalıştırın:

docker ps -a

-a bayrağı, durdurulmuş olanlar dahil tüm konteynerleri gösterir. Konteyner başarıyla kaldırıldıysa, bu listede görünmez:

Görsel 11 - Tüm konteynerlerin listelenmesi

Görsel 11 - Tüm konteynerlerin listelenmesi

Günlükleri (log) inceleme

Bir şeyler ters gittiğinde ya da veritabanı etkinliğini izlemek istediğinizde, günlükleri kontrol etmek iyi bir ilk adımdır.

PostgreSQL konteynerinizin günlüklerini görüntülemek için şu komutu çalıştırın:

docker logs postgres-db

Bu, konteyner başlatıldığından beri tüm günlükleri gösterir. Günlükler çok fazlaysa, çıktıyı sınırlandırmak isteyebilirsiniz; örneğin son 50 girdiyle:

docker logs --tail 50 postgres-db

Görsel 12 - Konteyner günlüklerini görüntüleme

Görsel 12 - Konteyner günlüklerini görüntüleme

Öte yandan, günlükleri gerçek zamanlı izlemek isterseniz, şu komutu çalıştırın:

docker logs -f postgres-db

Görsel 13 - Günlükleri gerçek zamanlı görüntüleme

Görsel 13 - Günlükleri gerçek zamanlı görüntüleme

Bu, özellikle bağlantı sorunlarını ayıklarken veya geliştirme sırasında veritabanı etkinliğini izlerken faydalıdır.

Ctrl+C/CMD+C ile günlükleri izlemeyi durdurabilirsiniz.

Docker’da PostgreSQL’i güncelleme

Zamanla, en yeni özellikler, performans iyileştirmeleri ve güvenlik yamalarını almak için PostgreSQL sürümünüzü güncellemek isteyeceksiniz.

Bu yazı yazılırken postgres:17.4 en yeni sürümdür; ancak teorik olarak postgres:17.5 yayınlandı diyelim. Bu bölüm, konteynerinizde veritabanı sürümünü nasıl güncelleyeceğinizi gösterir.

Önce, en son PostgreSQL imajını (veya belirli bir sürümü) çekin:

docker pull postgres:17.5

Ardından mevcut konteyneri durdurup kaldırın:

docker stop postgres-db
docker rm postgres-db

Son olarak, aynı hacmi kullanarak yeni bir konteyner oluşturun:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydatabase \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  -d postgres:17.5

Aynı hacmi (postgres-data) kullandığınız için, mevcut verileriniz korunacaktır.

Büyük bir ana sürüme (örneğin 17’den 18’e) yükseltiyorsanız, PostgreSQL başlatılırken gerekli veri geçişlerini otomatik olarak çalıştırır. Yalnız şu noktaları aklınızda tutun:

  • Ana sürüm yükseltmelerini önce üretim dışı bir ortamda test edin.
  • Ana sürüm yükseltmesinden önce her zaman veri hacminizin yedeğini alın.
  • PostgreSQL sürüm notlarında yıkıcı değişiklik olup olmadığını kontrol edin.

Yükseltmeden önce yedek oluşturmak için şu komutu çalıştırın:

docker run --rm -v postgres-data:/data -v $(pwd):/backup postgres:17.4 \
  bash -c "pg_dumpall -U myuser > /backup/postgres_backup.sql"

Bu, bir şeyler ters giderse verilerinizi geri yüklemek için kullanabileceğiniz bir SQL yedek dosyasını geçerli dizininizde oluşturur.

>PostgreSQL Temelleri Hızlı Başvuru Kılavuzunı Docker ile çalışırken hızlı bir referans olarak faydalı bulabilirsiniz.

Bir sonraki bölümde, güvenlik hususları ve optimizasyon ipuçları dahil Docker’da PostgreSQL kullanımı için en iyi uygulamaları ele alacağım.

Docker’da PostgreSQL Kullanımı için En İyi Uygulamalar

Docker’ın esnekliği, beraberinde sorumluluk getirir. Bu bölümde, containerize PostgreSQL kurulumunuzun güvenilir, güvenli ve sektör standartlarına uygun olmasını sağlayacak bazı en iyi uygulamaları paylaşacağım.

Düzenli yedeklemelerle verilerinizi güvenceye alın

PostgreSQL’i nasıl çalıştırdığınızdan bağımsız olarak, düzenli yedekler şarttır. Önceki bölümde yedeklerden bahsettim, ancak burada vitesi biraz artıracağım. 

Docker’da çalışan bir PostgreSQL veritabanını yedeklemenin en basit yolu pg_dump kullanmaktır:

docker exec -t postgres-db pg_dump -U myuser mydatabase > backup.sql

Görsel 14 - PostgreSQL yedeği

Görsel 14 - PostgreSQL yedeği

Tüm veritabanlarının, rollerin ve tablespace’lerin tam yedeği için pg_dumpall kullanın:

docker exec -t postgres-db pg_dumpall -U myuser > full_backup.sql

Görsel 15 - Tam PostgreSQL veritabanı yedeği

Görsel 15 - Tam PostgreSQL veritabanı yedeği

Ekrana tüm çıktıyı sığdırmak mümkün olmadığından görsel yalnızca birkaç yedekleme komutunu gösteriyor.

Yedeklemeleri otomatikleştirmek için basit bir kabuk betiği oluşturup cron ile çalıştırabilirsiniz:

#!/bin/bash
# backup.sh
TIMESTAMP=$(date +"%Y%m%d")
BACKUP_DIR="/Users/dradecic/Documents/pg-backups"

# Make sure the backup directory exists
mkdir -p $BACKUP_DIR

# Create the backup
docker exec postgres-db pg_dumpall -U myuser | gzip > $BACKUP_DIR/postgres_$TIMESTAMP.sql.gz

# Remove backups older than 30 days
find $BACKUP_DIR -name "postgres_*.sql.gz" -mtime +30 -delete

Betiği çalıştırılabilir yapın ve çalıştırın:

chmod +x backup.sh

bash backup.sh

Görsel 16 - Bir PostgreSQL veritabanı yedekleme betiğini çalıştırma

Görsel 16 - Bir PostgreSQL veritabanı yedekleme betiğini çalıştırma

Yedeklemeyi tamamen otomatikleştirmek için betiği günlük çalışacak şekilde crontab’inize ekleyebilirsiniz:

0 3 * * * /path/to/backup.sh

Bu zamanlama, her gün saat 03:00’te yedek alır; elbette zamanlamayı ve sıklığı ihtiyacınıza göre ayarlayabilirsiniz. 

>Cron işleriyle ilgili tam rehberime göz atarak bu kullanışlı otomasyon aracı hakkında daha fazla bilgi edinebilirsiniz.

Üretim ortamları için, yedekleri harici bir yerde veya bulut depolamada saklamayı düşünün; felaket kurtarma için önemlidir.

Veri kalıcılığı için adlandırılmış hacimler kullanın

Hacimleri daha önce kısaca ele aldım, ancak biraz daha detaylandırmaya değer.

Genel bir kural olarak, doğru yapılandırılmış bir hacim olmadan Docker’da PostgreSQL çalıştırmamalısınız. Aksi halde, konteyner kaldırıldığında veya Docker temizlik işlemi yaptığında verileriniz kaybolur.

Adlandırılmış hacimler (anonim hacimler yerine) veri yedekleme ve yönetimini çok daha kolaylaştırır:

# Create a named volume
docker volume create postgres-data

# Use it when running the container
docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Yeni bir şey yok.

Adlandırılmış hacimleri yedeklemek de daha kolaydır. Tüm hacmin yedeğini almak için şu komutu çalıştırın:

docker run --rm -v postgres-data:/data -v $(pwd):/backup alpine tar czf /backup/postgres-data-backup.tar.gz /data

Bu, komutu çalıştırdığınız klasörde postgres-data-backup.tar.gz adlı bir dosya oluşturur.

Şimdi bu hacmi geri yüklemek için şunu çalıştırın:

docker run --rm -v postgres-data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/postgres-data-backup.tar.gz --strip 1"

Hepsi bu!

Docker’da PostgreSQL’i güvenli hale getirme

Veritabanlarında güvenlik asla sonradan düşünülmemelidir. Bu alt bölüm, PostgreSQL konteynerinizi güvenli hale getirmek için bazı temel uygulamalarda size yol gösterecek.

Güçlü ve benzersiz parolalar kullanın

Varsayılan veya zayıf parolalardan kaçının. PostgreSQL süper kullanıcısı için güçlü, rastgele bir parola üretin:

export POSTGRES_PASSWORD=$(openssl rand -base64 32)
echo "$POSTGRES_PASSWORD" > postgres-password.txt

docker run --name postgres-db \
  -e POSTGRES_PASSWORD="$POSTGRES_PASSWORD" \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Görsel 17 - Güvenli parola kullanımı

Görsel 17 - Güvenli parola kullanımı

Bu parolayı, bir parola yöneticisi veya sürüm kontrolüne dâhil edilmeyen bir ortam değişkeni dosyası gibi güvenli bir yerde saklayın.

Ağ erişimini kısıtlayın

Varsayılan olarak Docker, PostgreSQL portunu tüm arayüzlerde açar. Özellikle üretimde, güvenliği artırmak için erişimi localhost ile kısıtlayın:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 127.0.0.1:5432:5432 \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

Özel PostgreSQL yapılandırması kullanın

Aşağıdakiler gibi parametreleri değiştirerek daha güvenli bir PostgreSQL yapılandırması oluşturun:

# Require SSL
ssl = on
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'

# Limit connection attempts
max_connections = 100
authentication_timeout = 1min

# Restrict access
listen_addresses = 'localhost'

Konteyneri başlatırken bu yapılandırma dosyasını bağlayın:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf \
  -v ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

PostgreSQL imajınızı düzenli olarak güncelleyin

En yeni güvenlik yamalarını almak için PostgreSQL sürümünüzü güncel tutun:

docker pull postgres:latest
docker stop postgres-db
docker rm postgres-db
# Then recreate with the latest image

Bu en iyi uygulamalar, hem geliştirme hem de üretim kullanım senaryolarına uygun, daha güvenilir ve güvenli bir Docker’da PostgreSQL ortamı oluşturmanızı sağlar.

Bir sonraki bölümde, Docker’da PostgreSQL çalıştırırken karşılaşabileceğiniz yaygın sorunları nasıl gidereceğinizi ele alacağım.

Docker’da PostgreSQL Sorun Giderme

Er ya da geç, Docker’da PostgreSQL çalıştırırken sorunlarla karşılaşmanız olasıdır. Bu bölümde yaygın problemleri ve çözümlerini ele alacağım; yol boyunca zaman ve efor kazandıracaktır.

PostgreSQL konteynerlerinde yaygın sorunlar

Birçok kullanıcının yaşadığı yaygın sorunlardan biri, konteynerin başlar başlamaz hemen kapanmasıdır. Sizde de böyleyse, sorunu belirlemek için günlükleri kontrol edin:

docker logs postgres-db

Hatanız, bağlanan hacimlerle ilgili izin sorunlarına bağlı olabilir. Bu durumda, buna benzer bir günlük iletisi görürsünüz:

initdb: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted

Bu sorunu çözmek için, hacminizin sahipliğini ve izinlerini kontrol edip gerekiyorsa düzeltin:

# Check the ownership
docker run --rm -v postgres-data:/data alpine ls -la /data

# Fix the permissions
docker run --rm -v postgres-data:/data alpine chmod 700 /data

Bir diğer yaygın sorun ise gerekli ortam değişkenlerinin eksik olmasıdır. Bu durumda tipik bir günlük iletisi şu şekilde olur:

Database is uninitialized and superuser password is not specified

Çözmek için, gerekli POSTGRES_PASSWORD ortam değişkenini — ya da her ne eksikse onu — ayarladığınızdan emin olun:

docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data:/var/lib/postgresql/data \
  -d postgres

“Veri dizini boş değil ama PostgreSQL dosyaları eksik” hatası da yaygındır. Muhtemelen şu günlük iletisini göreceksiniz:

PostgreSQL Database directory appears to contain a database; Skipping initialization

Ardından eksik dosyalarla ilgili hatalar gelir.

Genellikle, geçerli bir PostgreSQL veritabanı içermeyen dosyalar barındıran bir hacmi bağladığınızda ortaya çıkar. Yeni bir hacim kullanarak yeniden başlatmanız gerekebilir:

docker volume create postgres-data-new
docker run --name postgres-db \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v postgres-data-new:/var/lib/postgresql/data \
  -d postgres

Bağlantı sorunlarını giderme

Konteynerde çalışan PostgreSQL veritabanınıza bağlanamıyorsanız, önce konteynerin çalıştığını doğrulayın:

docker ps | grep postgres-db

Listede yoksa çökmüş olabilir. Daha önce anlatıldığı gibi günlükleri kontrol edin.

Listede ama hâlâ bağlanamıyorsanız, port eşlemesini doğrulayın:

docker port postgres-db

Şuna benzer bir çıktı görmelisiniz:

Görsel 18 - Konteyner port eşlemesi

Görsel 18 - Konteyner port eşlemesi

Aksi halde, port eşlemeniz yanlış olabilir. Konteyneri doğru -p seçeneğiyle yeniden oluşturun.

Hâlâ veritabanına bağlanamıyorsanız, bağlantı ayarlarınızı kontrol edin. Şu parametrelere bakın:

  • Hostname: localhost veya 127.0.0.1 (konteyner adı değil).
  • Port: Eşlemeden gelen ana makine portu (genellikle 5432).
  • Kullanıcı adı: POSTGRES_USER değeri (varsayılan "postgres").
  • Parola: POSTGRES_PASSWORD değeri.
  • Veritabanı: POSTGRES_DB değeri (varsayılan POSTGRES_USER ile aynı).

Bunları düzelttikten sonra tekrar deneyin. Sorun devam ederse, konteyner içinden bağlantıyı test edin:

docker exec -it postgres-db psql -U postgres

Bu çalışırsa, sorun port eşlemenizde veya harici ağınızdadır.

Son olarak, güvenlik duvarı sorunlarını kontrol edebilirsiniz. Sisteminizin güvenlik duvarı PostgreSQL portuna gelen bağlantıları engelliyor olabilir; bir kontrol edin:

# Linux
sudo iptables -L | grep 5432

# macOS
sudo pfctl -sr | grep 5432

Bu yaygın kontrolleri yaparak, Docker’da PostgreSQL ile ilgili çoğu sorunu tespit edip çözebilirsiniz. Hâlâ takılıyorsanız, PostgreSQL ve Docker dokümantasyonları ile topluluk forumları daha spesifik sorun giderme için mükemmel kaynaklardır.

Docker’da PostgreSQL Veritabanı Özet

İşte böyle — Docker’da PostgreSQL veritabanlarını yapılandırma ve çalıştırmanın kapsamlı rehberi! İlk konteynerinizi kurmaktan yapılandırma, bağlanma ve yönetmeye kadar başlamanız için bilmeniz gereken her şeyi ele aldım. 

Geleneksel PostgreSQL seçenekleri, veritabanını yerelde kurmak veya bulutta sağlamak gibi, geliştirme amaçları için ya verimsiz ya da pahalı olabilir. Docker bu boşluğu kapatır. İster yerel geliştirme, ister test, hatta üretim ortamları için kullanın; containerize PostgreSQL, yenilmesi zor bir esneklik ve tutarlılık sunar.

Artık Dockerize Postgres veritabanını uygulamalarınıza entegre etmeye fazlasıyla hazırsınız.

Daha derine inmek için DataCamp’ten şu kursları öneririm:

SSS

Geleneksel kurulum yerine neden PostgreSQL’i Docker’da çalıştırmalıyım?

Docker’da PostgreSQL kullanımı, basitleştirilmiş kurulum, farklı makineler arasında tutarlı ortamlar ve diğer sistem bileşenlerinden yalıtım sunar. Birden çok PostgreSQL sürümünü çakışma olmadan aynı anda çalıştırmanıza, yükseltme ve geri dönüşleri kolaylaştırmanıza ve geliştirme ile test için hızlı kurulum/söküm yapmanıza olanak tanır. Docker konteynerleri ayrıca sanal makinelerle karşılaştırıldığında daha az sistem kaynağı kullanır.

Docker’da çalışan bir PostgreSQL veritabanına nasıl bağlanırım?

Docker’da çalışan bir PostgreSQL veritabanına, konteyner içinde psql komut satırı aracına doğrudan erişmek için docker exec -it postgres-db psql -U myuser -d mydatabase komutunu kullanarak bağlanabilirsiniz. Alternatif olarak, eşlediğiniz port (genellikle 5432) üzerinden localhost’a (veya 127.0.0.1) yapılandırdığınız kullanıcı adı ve parolayla bağlanarak pgAdmin, DBeaver veya TablePlus gibi GUI araçlarını kullanabilirsiniz.

Bir Docker konteynerini kaldırdığımda PostgreSQL verilerime ne olur?

Bir Docker konteynerini kaldırdığınızda, konteyner içinde saklanan tüm veriler, bir hacim kurmadıysanız kaybolur. Adlandırılmış hacimler (örn. docker volume create postgres-data) kullanarak veritabanı verileriniz konteyner dosya sisteminin dışında kalıcı olur. Böylece aynı hacmi kullanarak yeni bir konteyner oluşturduğunuz sürece PostgreSQL konteynerinizi güvenle durdurabilir, kaldırabilir veya yükseltebilirsiniz.

Docker’da çalışan PostgreSQL veritabanımın yedeğini nasıl alırım?

Docker’da çalışan bir PostgreSQL veritabanını yedeklemek için pg_dump komutunu şu şekilde kullanabilirsiniz: docker exec -t postgres-db pg_dump -U myuser mydatabase > backup.sql. Tüm veritabanlarını ve rolleri içeren tam bir yedek için bunun yerine pg_dumpall kullanın. Yedeklemeleri, cron ile zamanlanmış aralıklarla çalışan bir kabuk betiği kullanarak otomatikleştirebilir; sıkıştırma ve eski yedekleri döndürme gibi özellikler ekleyebilirsiniz.

Dario Radečić

Yazar

Dario Radečić

Hırvatistan merkezli Kıdemli Veri Bilimci. 700’ün üzerinde yayımlanmış makaleyle 10 M+ görüntüleme elde eden, önde gelen bir teknoloji yazarı. TPOT ile Makine Öğrenimi Otomasyonu kitabının yazarı.

Konular

İlgili