Makale Başlıkları
- Neden Docker ile Veritabanı Çalıştırılır?
- Güncel Sürümler ve Doğru İmaj Etiketi Seçimi
- PostgreSQL Konteyneri Kurulumu
- MySQL Konteyneri Kurulumu
- Veri Kalıcılığı: Volume mı, Bind Mount mı?
- Güvenlik: En Sık Yapılan Hata Portu Açmak
- Docker Compose ile Düzenli Kurulum
- Yedekleme ve Geri Yükleme
- Üretim İçin Pratik Öneriler
- Sıkça Sorulan Sorular
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:
| 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
.envdosyası veya gizli yönetimi (secret) ile geçirin; aksi halde paroladocker inspectve süreç listesinde görünür. - Sunucu seviyesinde firewall (örneğin
ufwya dafirewalld) 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:
latestyerinepostgres:18,mysql:8.4gibi etiketler kullanın; beklenmedik ana sürüm atlamalarını önler. - Kaynak sınırı koyun: Compose’da
deploy.resources.limitsveya--memoryile veritabanının tüm RAM’i tüketmesini engelleyin. - Yapılandırmayı dışarı alın: Özel ayarları (örneğin
postgresql.confveyamy.cnf) bir dosya olarak mount edin; imaja gömmeyin. - İzleme ekleyin: En azından
docker statsve 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.



