Blog’a Dön

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.

Nodesty Ekibi4 dk okumaSunucular
Koyu Nodesty arka planında WordPress on Docker yazısı ile Compose, MariaDB ve Volumes ifadeleri

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 db volume'unda tutulur; konteyner silinse bile kaybolmaz.
  • wordpress: Resmî WordPress imajı (PHP ve Apache dahil). WordPress dosyaları, yüklemeler ve eklentiler wp volume'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 db adı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.

Nodesty

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

Sunucunuzu şimdi başlatın.

Nodesty'nin üstün altyapısı ile projelerinizi özgürce inşa edin ve sınır tanımadan ölçeklendirin.

                                                                                                                                                                                                                            
                                                                                                                                                                                                                            
                                                                                                                                                                                                                            
                                                                                                                             ············································                                                   
                                                ··································································································..........···························                                     
                                       ················..........................................................................................................................··············                             
                                  ·············.................::::::::::::::::::::::::::::::::::::::::::::::....................:::::::::::::::::::::::::::::::::::::::................···········                        
                             ············................:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::............·········                     
                         ············.................:::::::::::::::::::::::::::::::::::::::::::::::::::------------::::::::::::::::::::::::::::::----------------:::::::::::::::::::::..........········                  
                    ············......................::::::::::::::::::::::::::::::::::::------------------------------------------------------------------------------------:::::::::::::.........········                
                ··········.............................................::::::::::::::::::-------------==========================================-----------------------------------:::::::::::........·······               
             ········..................:.....................................::::::::::--------=======+++++++++++++++++++++++++++++++++++++=========================------------------::::::::::.......·······              
           ······.........::::::::::::::::::::................................:::::::-----=====++++xxxxxx**************************xxxxxxxxx++++++++++++++===================------------::::::::.......·······             
          ·····.......:::::::::::::::::::::::::::.............................:::::----===+++xxx****%%%%&&&&&&#############&&&&&&&%%%%%*******xxxxxxxx++++++++++++++==============----------:::::::......······             
         ····......::::::::-------------:::::::::::..........................::::---===+++xx***%%%&&&####@@@@@@@@@@@@@@@@@@@@@@@@####&&&&&%%%%*******xxxxxxxxx+++++++++++++===========--------::::::......·····             
        ····.....:::::::--------------------:::::::::.......................::::---===++xxx**%%&&&###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###&&&&%%%%%********xxxxxxxxxxx++++++++++++========------::::::.....······            
        ····.....:::::--------------------------::::::::....................::::---===++xx***%%&&&####@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@###&&&&&%%%%%**********xxxxxxxxxxxxx+++++++++=======------:::::.....·····            
        ····....::::::-------=============---------:::::::::................:::::---===+++xx***%%%&&&#####@@@@@@@@@@@@@@@@@@@@@@@@@#####&&&&&%%%%%%*************xxxxxxxxxxxxxx+++++++++======-----:::::....·····            
         ····....:::::-------================---------:::::::::...............:::::----===++++xxx***%%%%&&&&&&#################&&&&&&%%%%%%%*******************xxxxxxxxxxxxxxxxx++++++++======----:::::....·····            
         ·····....:::::--------=================---------::::::::::..............:::::::-----====+++++xxxxxx**************************xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx++++++++=====-----::::....·····            
          ·····.....:::::--------=================----------:::::::::::.................:::::::::-------=============++++++++++++++++++++++++++++++++++++xxxxxxxxxxxxxxxxxxxxxxx++++++++======-----::::....·····            
            ·····.....:::::::----------===========-------------::::::::::::.........................::::::::::::::::::------------------=============+++++++++++++++++++++++++++++++++=======-----::::.....·····            
              ······......:::::::---------------------------------:::::::::::::........................................:::::::::::::::-----------============+++++++++++++++++++++========------:::::.....·····             
                 ······........:::::::::---------------------------:::::::::::::::::...........................................:::::::::::::------------=============================--------::::::.....······              
                    ·········.........:::::::::::::::-------------::::::::::::::::::::::::.......................................::::::::::::::::--------------------------------------::::::::......·······                
                          ··········............::::::::::::::::::::::::::::::::::::::::::::::::::................................::::::::::::::::::::::::::-------------:::::::::::::::.........········                   
                                  ············..................:::::::::::::::::::::::::::::::::::::::::::.........................:::::::::::::::::::::::::::::::::::::................···········                        
                                             ················.............................................................................................................·················                                 
                                                           ······················................................................................···························                                                
                                                                               ·········································································