Docker ile PostgreSQL ve MySQL Kurulumu

Docker ile PostgreSQL ve MySQL Kurulumu

Bir veritabanını doğrudan sunucuya kurmak yerine Docker konteyneri olarak çalıştırmak; hızlı, temiz ve taşınabilir bir yöntemdir. Tek bir komutla PostgreSQL veya MySQL ayağa kalkar, sistemde kalıcı iz bırakmaz ve istediğiniz sürümü kolayca deneyebilirsiniz. Sunucuya doğrudan kurulum yaptığınızda apt/yum paketleri, servis dosyaları ve yapılandırma dizinleri sistemin her köşesine dağılır; sürümü değiştirmek istediğinizde işler kolayca karışır. Konteyner yaklaşımında ise her şey tek bir imajın içinde toplanır, kaldırmak istediğinizde komşusuna dokunmadan tek komutla silersiniz.

Bu rehberde resmi imajlarla PostgreSQL ve MySQL konteynerlerinin nasıl kurulacağını, verinin nasıl kalıcı tutulacağını, üretim ortamında nelere dikkat edileceğini ve Docker Compose ile düzenli bir kurulumun nasıl yapılacağını adım adım anlatıyoruz. Komutları kopyala-yapıştır çalışacak şekilde, gerçek kullanımdan örneklerle verdik.

Veritabanı konteynerlerinizi çalıştırmak için Docker kurulu, ayrılmış kaynaklı bir VPS/sunucu yeterlidir. Veritabanı RAM ve disk I/O’ya duyarlı olduğundan, NVMe SSD’li ve garantili kaynaklı bir sunucu üzerinde çok daha tutarlı performans alırsınız.

Neden Docker ile Veritabanı Çalıştırılır?

Docker ile veritabanı çalıştırmanın avantajları net: sistemi kirletmeden farklı sürümleri deneyebilir, bir projeden diğerine kolayca geçebilir ve aynı yapıyı başka bir sunucuda birebir tekrar oluşturabilirsiniz. Bir projede PostgreSQL 16, diğerinde 18 gerekiyorsa ikisini de aynı makinede, birbirine karışmadan ayağa kaldırabilirsiniz. Geliştirme ortamları, sürekli entegrasyon (CI) testleri ve mikroservis mimarileri için bu esneklik standart hâle geldi.

Tek kritik nokta verinin kalıcılığıdır. Konteyner doğası gereği “geçici” (ephemeral) çalışır; içine yazdığınız her şey konteyner silindiğinde gider. Veritabanı için bu kabul edilemez, dolayısıyla veriyi konteynerin dışında, bir volume üzerinde tutmak şarttır. Aşağıdaki tüm örneklerde bunu baştan doğru kuruyoruz.

Avantajlar ve Sınırlar Bir Bakışta

Konu Konteynerde Veritabanı Sunucuya Doğrudan Kurulum
Sürüm değiştirme Etiket değiştir, yeniden başlat Paket kaldır/kur, çakışma riski
Taşınabilirlik İmaj + volume kopyala, hazır Manuel yapılandırma gerekir
İzolasyon Her veritabanı kendi konteynerinde Tüm servisler aynı sistemde
Disk I/O performansı Volume doğru kurulursa neredeyse aynı En düşük katman, en doğrudan
Yönetim olgunluğu Yedek/izleme ek kurgu ister Klasik araçlar hazır

Güncel Sürümler ve Doğru İmaj Etiketi Seçimi

İmaj çekerken latest etiketi cazip görünür ama üretimde tehlikelidir: bir gün yeniden başlattığınızda ana sürüm atlamış olabilir ve uyumsuzlukla karşılaşırsınız. Üretimde her zaman ana sürüm numarasını sabitleyin. 2026 itibarıyla pratik seçimler şöyle:

Mail hosting 1 ay ücretsiz
Veritabanı Güncel kararlı sürüm Önerilen etiket Not
PostgreSQL 18 serisi (18.x) postgres:18 veya postgres:18-alpine Alpine varyantı çok daha küçük imaj
MySQL (LTS) 8.4 LTS mysql:8.4 Uzun süreli destek, üretim için ideal
MySQL (Innovation) 9 serisi (9.x) mysql:9 En yeni özellikler, daha hızlı sürüm döngüsü
MariaDB 11.8 LTS / 12.x mariadb:lts veya mariadb:11.8 MySQL’e büyük ölçüde uyumlu açık alternatif

Küçük bir uyarı: MySQL 8.0 serisi 2026 Nisan’ında destek sonuna (EOL) ulaştı. Yeni projelerde 8.0 yerine mysql:8.4 (LTS) tercih etmek, alacağınız güvenlik güncellemeleri açısından doğru olanıdır.

PostgreSQL Konteyneri Kurulumu

Resmi postgres imajıyla, parola ve kalıcı volume vererek başlıyoruz:

docker run --name pg-db 
  -e POSTGRES_PASSWORD=guclu_bir_parola 
  -e POSTGRES_USER=uygulama 
  -e POSTGRES_DB=uygulamadb 
  -p 5432:5432 
  -v pgdata:/var/lib/postgresql/data 
  -d postgres:18

POSTGRES_PASSWORD zorunludur; bu olmadan konteyner başlamaz. POSTGRES_USER ve POSTGRES_DB isteğe bağlıdır ve verilmezse varsayılan olarak postgres kullanıcısı ve veritabanı oluşur. Veri /var/lib/postgresql/data yolunda saklanır; pgdata adlı volume sayesinde konteyner silinse bile korunur.

Konteynerin ayağa kalkıp kalkmadığını ve hazır olup olmadığını şöyle kontrol edebilirsiniz:

docker logs pg-db
docker exec -it pg-db pg_isready -U uygulama

Konteynerin içinden hızlıca SQL çalıştırmak isterseniz psql istemcisi imajın içinde hazır gelir:

docker exec -it pg-db psql -U uygulama -d uygulamadb

MySQL Konteyneri Kurulumu

Resmi mysql imajıyla mantık aynı; yalnızca ortam değişkenlerinin adları farklı:

docker run --name mysql-db 
  -e MYSQL_ROOT_PASSWORD=guclu_root_parola 
  -e MYSQL_DATABASE=uygulamadb 
  -e MYSQL_USER=uygulama 
  -e MYSQL_PASSWORD=guclu_kullanici_parola 
  -p 3306:3306 
  -v mysqldata:/var/lib/mysql 
  -d mysql:8.4

MYSQL_ROOT_PASSWORD zorunludur. MYSQL_DATABASE, MYSQL_USER ve MYSQL_PASSWORD ile ilk açılışta uygulamaya özel bir veritabanı ve yetkili kullanıcı oluşturulur; böylece her şeyi root ile yapmak zorunda kalmazsınız. MySQL verisi /var/lib/mysql yolunda tutulur.

Bağlantıyı doğrulamak için:

docker exec -it mysql-db mysql -u uygulama -p uygulamadb

MariaDB tercih ederseniz değişen tek şey imaj ve birkaç değişken adıdır: mariadb:lts imajını kullanır, MARIADB_ROOT_PASSWORD gibi MariaDB önekli değişkenleri verirsiniz. Geri kalan mantık birebir aynıdır.

Veri Kalıcılığı: Volume mı, Bind Mount mı?

İki kurulumda da kritik nokta -v ile bağlanan depolama alanıdır. Bunun olmadan konteyner silindiğinde tüm veritabanı yok olur. Burada iki yöntem var ve farkı bilmek önemli:

  • Named volume (örneklerimizdeki pgdata, mysqldata): Docker’ın yönettiği depolama alanıdır. Üretim için önerilen yöntem budur; izinler ve performans Docker tarafından düzgün kurgulanır.
  • Bind mount (örneğin -v /srv/pgdata:/var/lib/postgresql/data): Host üzerindeki belirli bir klasörü bağlar. Yedeklemek veya dosyalara doğrudan erişmek isterseniz kullanışlıdır, ancak izin (permission) sorunlarına daha açıktır.

Mevcut volume’leri görmek ve içeriğini denetlemek için:

docker volume ls
docker volume inspect pgdata

Güvenlik: En Sık Yapılan Hata Portu Açmak

Örneklerde gösterdiğimiz -p 5432:5432 ve -p 3306:3306, veritabanı portunu sunucunun tüm ağ arayüzlerinde dışarı açar. Geliştirme için pratiktir ama üretimde ciddi bir risktir: internete açık bir veritabanı portu, tarama botlarının ilk hedefidir. Birkaç pratik kural:

  • Veritabanına yalnızca aynı sunucudaki uygulama erişiyorsa portu hiç yayınlamayın; konteynerler aynı Docker ağındaysa birbirlerine servis adıyla zaten erişir.
  • Yalnızca yerelden bağlanmanız gerekiyorsa porta IP sabitleyin: -p 127.0.0.1:5432:5432. Böylece dışarıdan erişim kapanır.
  • Parolaları güçlü tutun ve mümkünse komut satırına yazmak yerine .env dosyası veya gizli yönetimi (secret) ile geçirin; aksi halde parola docker inspect ve süreç listesinde görünür.
  • Sunucu seviyesinde firewall (örneğin ufw ya da firewalld) ile 5432/3306 portlarını dış dünyaya kapatın.

Alastyr tarafında, ağ katmanında Voxility tabanlı 1 Tbps üzeri kapasiteli L3-L4 anti-DDoS koruması zaten devrededir; yine de uygulama ve veritabanı portlarının güvenliği size aittir, bu yüzden yukarıdaki temel kuralları atlamayın.

Docker Compose ile Düzenli Kurulum

Tek tek docker run komutları küçük denemeler için iyidir, ama gerçek bir projede veritabanını uygulamayla birlikte tanımlamak çok daha düzenlidir. Aşağıdaki compose.yaml hem PostgreSQL hem MySQL’i, kalıcı volume ve sağlık kontrolüyle (healthcheck) birlikte ayağa kaldırır:

services:
  postgres:
    image: postgres:18
    environment:
      POSTGRES_USER: uygulama
      POSTGRES_PASSWORD: guclu_bir_parola
      POSTGRES_DB: uygulamadb
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U uygulama"]
      interval: 10s
      timeout: 5s
      retries: 5

  mysql:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: guclu_root_parola
      MYSQL_DATABASE: uygulamadb
      MYSQL_USER: uygulama
      MYSQL_PASSWORD: guclu_kullanici_parola
    volumes:
      - mysqldata:/var/lib/mysql

volumes:
  pgdata:
  mysqldata:

Dikkat edin: burada bilerek port yayınlamadık. Aynı Compose dosyasındaki uygulama servisi, veritabanına postgres:5432 ya da mysql:3306 adresiyle, yani servis adı üzerinden erişir. Tek komutla başlatıp durdurursunuz:

docker compose up -d
docker compose ps
docker compose down

Yedekleme ve Geri Yükleme

Volume veriyi konteynerin ömründen bağımsız tutar, ama yedek değildir. Disk bozulur, yanlış komutla volume silinir veya tablo yanlışlıkla düşürülür. Düzenli mantıksal yedek (dump) almak şarttır. PostgreSQL için:

# Yedek al
docker exec pg-db pg_dump -U uygulama uygulamadb > yedek.sql
# Geri yükle
cat yedek.sql | docker exec -i pg-db psql -U uygulama -d uygulamadb

MySQL için mantık aynı, araç farklı:

# Yedek al
docker exec mysql-db mysqldump -u root -pguclu_root_parola uygulamadb > yedek.sql
# Geri yükle
cat yedek.sql | docker exec -i mysql-db mysql -u root -pguclu_root_parola uygulamadb

Bu komutları bir cron işine bağlayıp günlük çalıştırmak, üretimdeki en küçük kuruluma bile uygulanması gereken bir alışkanlıktır. Alastyr sunucularında günlük otomatik yedekleme zaten standarttır; yine de uygulama seviyesinde kendi dump’larınızı ayrı bir konuma almanız, çok katmanlı bir koruma sağlar.

Üretim İçin Pratik Öneriler

  • Sürümü sabitleyin: latest yerine postgres:18, mysql:8.4 gibi etiketler kullanın; beklenmedik ana sürüm atlamalarını önler.
  • Kaynak sınırı koyun: Compose’da deploy.resources.limits veya --memory ile veritabanının tüm RAM’i tüketmesini engelleyin.
  • Yapılandırmayı dışarı alın: Özel ayarları (örneğin postgresql.conf veya my.cnf) bir dosya olarak mount edin; imaja gömmeyin.
  • İzleme ekleyin: En azından docker stats ve healthcheck ile konteynerin sağlığını takip edin.
  • Doğru sunucuyu seçin: Veritabanı disk I/O’ya çok duyarlıdır; paylaşımlı, dalgalanan kaynaklar yerine NVMe SSD’li ve ayrılmış kaynaklı bir bulut sunucu üzerinde çok daha tutarlı sonuç alırsınız.

Sıkça Sorulan Sorular

Konteyner silinince verim gider mi?

Named volume veya bind mount kullandıysanız gitmez; veri konteynerin dışında tutulduğu için konteyneri silip yeniden oluşturduğunuzda eski veriniz olduğu gibi kalır. Volume olmadan çalıştırırsanız konteyner silindiğinde tüm veritabanı kaybolur.

Belirli bir PostgreSQL veya MySQL sürümünü çalıştırabilir miyim?

Evet. İmaj etiketiyle sürüm seçersiniz: PostgreSQL için postgres:18 veya postgres:17, MySQL için mysql:8.4 (LTS) ya da mysql:9 (innovation) gibi. Üretimde ana sürümü sabitlemek, beklenmedik yükseltmeleri önler.

latest etiketini kullanmak güvenli mi?

Geliştirme ve deneme için sorun değil, ama üretim için önerilmez. latest bir gün ana sürüm atlayabilir ve yeniden başlatmada uyumsuzluk çıkarabilir. Üretimde her zaman postgres:18 gibi belirli bir etiket kullanın.

Veritabanı portunu dışarı açmam şart mı?

Hayır. Veritabanına yalnızca aynı Docker ağındaki uygulama erişiyorsa portu hiç yayınlamayın; konteynerler birbirine servis adıyla erişir. Dışarıdan bağlantı gerekiyorsa portu yalnızca yerele bağlayın (-p 127.0.0.1:5432:5432) ve firewall ile sınırlandırın.

Dışarıdan istemciyle nasıl bağlanırım?

Port yayınlanmışsa istemcinizden SUNUCU_IP:5432 (PostgreSQL) veya SUNUCU_IP:3306 (MySQL) adresiyle, kullanıcı adı ve parolayı vererek bağlanırsınız. Güvenlik için erişimi belirli IP’lerle kısıtlamanız önerilir.

Üretimde Docker içinde veritabanı çalıştırmak doğru mu?

Doğru, ancak disipline bağlı. Kalıcı volume, düzenli yedek, kaynak sınırı ve sürüm sabitlemesi yaparsanız üretimde sorunsuz çalışır. Bu kurallar gözardı edilirse veri kaybı riski doğar.

MariaDB de aynı şekilde mi kurulur?

Evet. Resmi mariadb imajı MySQL ile neredeyse aynı mantıkla çalışır; mariadb:lts imajını kullanır ve MARIADB_ROOT_PASSWORD gibi MariaDB önekli ortam değişkenlerini verirsiniz. Veri yine /var/lib/mysql yolunda tutulur.

Yedeği nasıl alırım?

PostgreSQL için docker exec pg-db pg_dump, MySQL için docker exec mysql-db mysqldump komutlarıyla mantıksal dump alırsınız. Bu komutları bir cron işiyle günlük çalıştırmak, üretim için önerilen yaklaşımdır.

İki veritabanını aynı sunucuda çalıştırabilir miyim?

Evet. Her veritabanı kendi konteynerinde, kendi volume’üyle izole çalışır. Tek dikkat edilecek nokta yeterli RAM ve disk olması; Docker Compose ile ikisini tek dosyada tanımlamak en düzenli yöntemdir.

Veritabanı Konteynerleri İçin Doğru Sunucu

PostgreSQL ve MySQL konteynerleriniz için NVMe SSD’li, ayrılmış kaynaklı, İzmir’deki kendi veri merkezimizden düşük gecikmeli VPS ve bulut sunucu çözümleri. Günlük yedekleme, 7/24 Türkçe destek ve 14 gün para iade garantisiyle.

VPS/Sunucu Çözümlerini İncele →

Türkiye'nin En Çok Tavsiye Edilen Domain, Hosting ve Bulut Servis Sağlayıcısı
İnternet sitesi Alastyr İnternet Sitesi
Yazı oluşturuldu 481

Benzer yazılar

Aramak istediğinizi üstte yazmaya başlayın ve aramak için enter tuşuna basın. İptal için ESC tuşuna basın.

Üste dön