Docker Compose ile WordPress Kurulumu
Docker Compose ile WordPress nasıl kurulur? MariaDB ve WordPress konteynerleri, .env ile şifreler, Nginx ve SSL, yükleme sınırları, yedek ve güncelleme.

İçindekiler
Docker Compose ile WordPress kurulumu, WordPress'i ve veritabanını tek bir dosyada tanımlanan iki konteyner olarak çalıştırmaktır. Sunucuya PHP, web sunucusu ya da veritabanı kurmanız gerekmez; her şey resmî imajlardan gelir. Aynı sunucuda birden fazla siteyi birbirinden yalıtılmış şekilde çalıştırabilir, bir siteyi yeni sunucuya klasörünü ve verilerini kopyalayarak taşıyabilirsiniz.
Bu rehberde Docker Compose ile WordPress ve MariaDB kurulumunu, şifreleri güvenle saklamayı, önüne Nginx ve SSL koymayı, yükleme sınırlarını, yedekleme ve güncellemeyi anlatıyoruz. Docker kurulu değilse önce Docker kurulumu rehberimizi uygulayın.
Klasör yapısı
Site için bir klasör oluşturun:
mkdir -p ~/siteler/alanadiniz && cd ~/siteler/alanadiniz
Bu klasörde üç dosya olacak: compose.yaml, .env ve uploads.ini.
1. Adım: Şifreleri .env dosyasına yazın
Şifreleri compose dosyasına doğrudan yazmak yerine ayrı bir .env dosyasında tutun:
DB_PASSWORD=uzun-ve-rastgele-bir-sifre
DB_ROOT_PASSWORD=baska-uzun-ve-rastgele-bir-sifre
Rastgele şifre üretmek için openssl rand -base64 24 komutunu kullanabilirsiniz. Dosyayı yalnızca sizin okuyabileceğiniz şekilde koruyun: chmod 600 .env. Bu klasörü bir Git deposunda tutuyorsanız .env dosyasını .gitignore'a ekleyin.
2. Adım: compose.yaml
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db:/var/lib/mysql
wordpress:
image: wordpress:php8.3-apache
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_CONFIG_EXTRA: |
if (isset($$_SERVER['HTTP_X_FORWARDED_PROTO']) && $$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$$_SERVER['HTTPS'] = 'on';
}
ports:
- '127.0.0.1:8080:80'
volumes:
- wp:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
volumes:
db:
wp:
- db: MariaDB veritabanı. Veriler
dbvolume'unda tutulur; konteyner silinse bile kaybolmaz. - wordpress: Resmî WordPress imajı (PHP ve Apache dahil). WordPress dosyaları, yüklemeler ve eklentiler
wpvolume'unda tutulur. 127.0.0.1:8080:80: WordPress'i yalnızca sunucunun kendisine açar. Dışarıdan erişim, önündeki Nginx üzerinden olacak. Docker'ın yayınladığı portların güvenlik duvarını atlayabildiğini Docker kurulumu rehberimizde anlattık.WORDPRESS_CONFIG_EXTRA: WordPress'in, önündeki Nginx HTTPS kullandığında bunu doğru algılamasını sağlar; aksi hâlde yönlendirme döngüleri yaşanabilir. Compose dosyasında$karakteri$$olarak yazılır.- Veritabanı portu yayınlanmaz. WordPress veritabanına
dbadıyla Docker'ın iç ağı üzerinden ulaşır; veritabanı dışarıya hiç açılmaz.
3. Adım: Yükleme sınırları
uploads.ini dosyası PHP'nin yükleme ve bellek sınırlarını belirler:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 120
Bu ayarların ne işe yaradığını PHP sürümü değiştirme rehberimizde anlattık.
4. Adım: Başlatın
docker compose up -d
docker compose ps
İki konteyner de running durumunda olmalıdır. İlk açılışta veritabanının hazırlanması birkaç saniye sürer.
5. Adım: Nginx ve SSL
Sunucuda Nginx'i bir reverse proxy olarak WordPress konteynerinin önüne koyun. /etc/nginx/sites-available/alanadiniz.com:
server {
listen 80;
listen [::]:80;
server_name alanadiniz.com www.alanadiniz.com;
client_max_body_size 64M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Siteyi etkinleştirip Certbot ile SSL alın:
sudo ln -s /etc/nginx/sites-available/alanadiniz.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d alanadiniz.com -d www.alanadiniz.com
client_max_body_size, uploads.ini dosyasındaki yükleme sınırıyla aynı olmalıdır; aksi hâlde büyük yüklemeler Nginx'te 413 hatasıyla durur. Ardından https://alanadiniz.com adresini açıp WordPress kurulum sihirbazını tamamlayın. Nginx ve SSL'in ayrıntılarını Nginx kurulumu rehberimizde anlattık.
Yedekleme
Bir WordPress sitesinin yedeği iki parçadan oluşur: veritabanı ve dosyalar.
Veritabanı:
docker compose exec -T db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" wordpress' > db-$(date +%F).sql
Dosyalar (wp volume'u):
docker run --rm -v alanadiniz_wp:/data -v "$(pwd)":/yedek alpine \
tar -czf /yedek/wp-$(date +%F).tar.gz -C /data .
Volume'ların adı, klasör adınızla başlar (alanadiniz_wp gibi); tam adını docker volume ls ile görebilirsiniz. Yedekleri cron ile otomatikleştirmeyi ve sunucudan bağımsız bir yerde tutmayı Sunucu yedekleme rehberimizde anlattık.
Güncelleme
- WordPress, eklentiler ve temalar: Dosyalar volume'da tutulduğu için her zamanki gibi yönetim panelinden güncellenir.
- İmajlar (PHP, Apache, MariaDB): Sistem paketlerini ve güvenlik düzeltmelerini almak için imajları düzenli olarak güncelleyin:
docker compose pull docker compose up -d
İmajı güncellemek WordPress dosyalarınızın üzerine yazmaz. MariaDB'nin ana sürümünü değiştirmeden önce mutlaka veritabanı yedeği alın.
Birden fazla site
Her site için ayrı bir klasörde ayrı bir compose.yaml oluşturun ve her birine farklı bir yerel port verin (127.0.0.1:8081:80, 127.0.0.1:8082:80 ...). Önlerindeki Nginx, her alan adını doğru porta yönlendirir. Her sitenin kendi veritabanı konteynerinin olması, bir sitedeki sorunun diğerlerini etkilemesini önler.
Nodesty'de Docker ile WordPress
Nodesty AMD Ryzen 9 9950X VDS paketleri yüksek tek çekirdek hızıyla PHP sayfalarını hızlı oluşturur; tam root erişimiyle Docker, Nginx ve birden fazla WordPress sitesini aynı sunucuda çalıştırabilirsiniz. NVMe disk, nShield DDoS koruması ve 7 gün saklanan ücretsiz günlük yedekleme pakete dahildir. Sunucu yönetmeden yalnızca bir WordPress sitesi yayınlamak istiyorsanız LiteSpeed'li web hosting paketlerimiz daha pratik bir seçimdir; kurulumunu WordPress kurulumu rehberimizde anlattık.
Sıkça Sorulan Sorular
WordPress için Docker mı web hosting mi?
Yalnızca bir WordPress sitesi yayınlamak istiyorsanız web hosting daha kolaydır; sunucu yönetimi, güncellemeler ve güvenlik sağlayıcının işidir. Aynı sunucuda birden fazla site ya da başka servisler çalıştırmak, ortamı tamamen kontrol etmek ve siteleri kolayca taşımak istiyorsanız Docker esneklik kazandırır.
WordPress'i güncellerken konteyneri mi değiştirmeliyim?
WordPress dosyaları bir volume'da tutulduğu için çekirdek, eklenti ve tema güncellemelerini her zamanki gibi yönetim panelinden yaparsınız. İmajı güncellemek PHP sürümünü ve sistem paketlerini yeniler; WordPress dosyalarınızın üzerine yazmaz.
Birden fazla WordPress sitesini aynı sunucuda çalıştırabilir miyim?
Evet. Her site için ayrı bir klasör ve compose.yaml dosyası oluşturup her birine farklı bir yerel port verin. Önlerindeki Nginx, alan adına göre isteği doğru konteynere yönlendirir. Her sitenin kendi veritabanı konteyneri olması, sitelerin birbirinden yalıtılmasını sağlar.
Error establishing a database connection hatası alıyorum, neden?
WordPress konteyneri veritabanına bağlanamıyordur. Veritabanı konteynerinin çalıştığını docker compose ps ile kontrol edin, .env dosyasındaki şifrelerin iki konteynerde de aynı olduğundan emin olun ve ilk kurulumda veritabanının hazır olmasını birkaç saniye bekleyin.
Şifreyi .env dosyasında değiştirdim ama çalışmıyor, neden?
MariaDB imajı kullanıcıyı ve şifreyi yalnızca veritabanı ilk kez oluşturulurken ayarlar. Veritabanı volume'u zaten varsa .env dosyasındaki değişiklik mevcut kullanıcıyı etkilemez. Şifreyi veritabanı içinden değiştirmeniz ya da yeni bir kurulumda volume'u silmeniz gerekir.
Yüklediğim dosyalar ve eklentiler nerede duruyor?
WordPress'in bütün dosyaları, yüklemeler ve eklentiler dahil, compose dosyasında tanımlanan wp volume'unda durur. Konteyneri silip yeniden oluştursanız bile volume yerinde kaldığı sürece dosyalarınız kaybolmaz.
Yazar hakkında
Nodesty Ekibi · Altyapı ve Destek
Nodesty ekibi sunucularımızı, ağımızı ve DDoS korumamızı her gün işletir ve müşteri destek taleplerini 7/24 yanıtlar. Bu rehberler o deneyimden yazılır.
İlgili yazılar

Sunucu Saat Dilimi ve NTP: Linux Saat Ayarı Rehberi
Linux sunucuda saat dilimi ve NTP nasıl ayarlanır? timedatectl, UTC mi yerel saat mi, chrony ve timesyncd, cron, günlükler, 2FA ve Windows Server.

Ollama Kurulumu: Kendi Sunucunuzda Yapay Zeka Modeli Çalıştırma
Ollama ile kendi sunucunuzda yapay zeka modeli çalıştırma: kurulum, model ve RAM seçimi, API kullanımı, Open WebUI, güvenli erişim ve işlemci kullanımı.

Sunucu İzleme: Kaynakları, Servisleri ve Uyarıları Takip Etme
Sunucu izleme nasıl yapılır? Neleri izlemeli, Netdata ile anlık izleme, Uptime Kuma ile dış kontrol, Prometheus ve Grafana, uyarı eşikleri ve günlükler.