Zurück zum Blog

WordPress mit Docker Compose installieren

Wie installieren Sie WordPress mit Docker Compose? MariaDB- und WordPress-Container, Passwörter in .env, Nginx und SSL, Upload-Limits, Backup und Updates.

Nodesty-Team5 Min. LesezeitServer
Der Schriftzug WordPress on Docker mit Compose, MariaDB und Volumes auf dunklem Nodesty-Hintergrund

WordPress mit Docker Compose zu installieren bedeutet, WordPress und die Datenbank als zwei Container zu betreiben, die in einer einzigen Datei definiert sind. Sie müssen auf dem Server weder PHP noch einen Webserver oder eine Datenbank installieren; alles kommt aus offiziellen Images. Sie können auf demselben Server mehrere Websites voneinander isoliert betreiben und eine Website auf einen neuen Server umziehen, indem Sie ihren Ordner und ihre Daten kopieren.

In dieser Anleitung erklären wir, wie Sie WordPress und MariaDB mit Docker Compose installieren, Passwörter sicher speichern, Nginx und SSL davorschalten, Upload-Limits einstellen sowie Backups und Updates durchführen. Ist Docker noch nicht installiert, folgen Sie zuerst unserer Anleitung Docker installieren.

Ordnerstruktur

Legen Sie einen Ordner für die Website an:

mkdir -p ~/seiten/ihredomain && cd ~/seiten/ihredomain

In diesem Ordner liegen drei Dateien: compose.yaml, .env und uploads.ini.

Schritt 1: Passwörter in die .env schreiben

Statt die Passwörter direkt in die Compose-Datei zu schreiben, speichern Sie sie in einer eigenen Datei .env:

DB_PASSWORD=ein-langes-zufaelliges-passwort
DB_ROOT_PASSWORD=ein-anderes-langes-zufaelliges-passwort

Zufällige Passwörter erzeugen Sie mit dem Befehl openssl rand -base64 24. Schützen Sie die Datei so, dass nur Sie sie lesen können: chmod 600 .env. Wenn Sie diesen Ordner in einem Git-Repository verwalten, nehmen Sie die Datei .env in die .gitignore auf.

Schritt 2: 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: Die MariaDB-Datenbank. Die Daten liegen im Volume db; sie gehen auch dann nicht verloren, wenn der Container gelöscht wird.
  • wordpress: Das offizielle WordPress-Image (einschließlich PHP und Apache). WordPress-Dateien, Uploads und Plugins liegen im Volume wp.
  • 127.0.0.1:8080:80: Öffnet WordPress nur für den Server selbst. Der Zugriff von außen erfolgt über Nginx davor. Dass von Docker veröffentlichte Ports die Firewall umgehen können, erklären wir in unserer Anleitung Docker installieren.
  • WORDPRESS_CONFIG_EXTRA: Sorgt dafür, dass WordPress richtig erkennt, wenn Nginx davor HTTPS verwendet; andernfalls kann es zu Weiterleitungsschleifen kommen. In der Compose-Datei wird das Zeichen $ als $$ geschrieben.
  • Der Datenbankport wird nicht veröffentlicht. WordPress erreicht die Datenbank unter dem Namen db über das interne Netzwerk von Docker; die Datenbank wird überhaupt nicht nach außen geöffnet.

Schritt 3: Upload-Limits

Die Datei uploads.ini legt die Upload- und Speichergrenzen von PHP fest:

upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 120

Wofür diese Einstellungen gut sind, erklären wir in unserer Anleitung PHP-Version ändern.

Schritt 4: Starten

docker compose up -d
docker compose ps

Beide Container müssen den Status running haben. Beim ersten Start dauert die Vorbereitung der Datenbank einige Sekunden.

Schritt 5: Nginx und SSL

Schalten Sie auf dem Server Nginx als Reverse Proxy vor den WordPress-Container. /etc/nginx/sites-available/ihredomain.de:

server {
    listen 80;
    listen [::]:80;
    server_name ihredomain.de www.ihredomain.de;
    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;
    }
}

Aktivieren Sie die Website und holen Sie sich mit Certbot ein SSL-Zertifikat:

sudo ln -s /etc/nginx/sites-available/ihredomain.de /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d ihredomain.de -d www.ihredomain.de

client_max_body_size muss dem Upload-Limit in der Datei uploads.ini entsprechen; andernfalls bricht Nginx große Uploads mit dem Fehler 413 ab. Öffnen Sie anschließend die Adresse https://ihredomain.de und schließen Sie den Installationsassistenten von WordPress ab. Details zu Nginx und SSL finden Sie in unserer Anleitung Nginx installieren.

Backup

Ein Backup einer WordPress-Website besteht aus zwei Teilen: der Datenbank und den Dateien.

Datenbank:

docker compose exec -T db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" wordpress' > db-$(date +%F).sql

Dateien (Volume wp):

docker run --rm -v ihredomain_wp:/data -v "$(pwd)":/backup alpine \
  tar -czf /backup/wp-$(date +%F).tar.gz -C /data .

Die Namen der Volumes beginnen mit Ihrem Ordnernamen (etwa ihredomain_wp); den vollständigen Namen sehen Sie mit docker volume ls. Wie Sie Backups mit Cron automatisieren und an einem vom Server unabhängigen Ort aufbewahren, erklären wir in unserer Anleitung Server Backup.

Updates

  • WordPress, Plugins und Themes: Da die Dateien im Volume liegen, werden sie wie gewohnt im Adminbereich aktualisiert.
  • Images (PHP, Apache, MariaDB): Aktualisieren Sie die Images regelmäßig, um Systempakete und Sicherheitskorrekturen zu erhalten:
    docker compose pull
    docker compose up -d
    

    Ein Update des Images überschreibt Ihre WordPress-Dateien nicht. Erstellen Sie unbedingt ein Datenbank-Backup, bevor Sie die Hauptversion von MariaDB wechseln.

Mehrere Websites

Legen Sie für jede Website in einem eigenen Ordner eine eigene compose.yaml an und geben Sie jeder einen anderen lokalen Port (127.0.0.1:8081:80, 127.0.0.1:8082:80 …). Nginx davor leitet jede Domain an den richtigen Port weiter. Wenn jede Website ihren eigenen Datenbank-Container hat, wirkt sich ein Problem auf einer Website nicht auf die anderen aus.

WordPress mit Docker bei Nodesty

Die Pakete AMD Ryzen 9 9950X vServer von Nodesty erzeugen PHP-Seiten dank hoher Single-Core-Leistung schnell; mit vollem Root-Zugang betreiben Sie Docker, Nginx und mehrere WordPress-Websites auf demselben Server. NVMe-Speicher, DDoS-Schutz durch nShield und kostenlose tägliche Backups mit 7 Tagen Aufbewahrung sind im Paket enthalten. Wenn Sie ohne Serververwaltung nur eine WordPress-Website veröffentlichen möchten, sind unsere Webhosting-Pakete mit LiteSpeed die praktischere Wahl; die Installation erklären wir in unserer Anleitung WordPress installieren.

Häufig gestellte Fragen

Docker oder Webhosting für WordPress?

Wenn Sie nur eine WordPress-Website veröffentlichen möchten, ist Webhosting einfacher; Serververwaltung, Updates und Sicherheit übernimmt der Anbieter. Wenn Sie auf demselben Server mehrere Websites oder andere Dienste betreiben, die Umgebung vollständig kontrollieren und Websites leicht umziehen möchten, gibt Ihnen Docker mehr Flexibilität.

Muss ich beim WordPress-Update den Container austauschen?

Da die WordPress-Dateien in einem Volume liegen, aktualisieren Sie Core, Plugins und Themes wie gewohnt im Adminbereich. Ein Update des Images erneuert die PHP-Version und die Systempakete; Ihre WordPress-Dateien werden dabei nicht überschrieben.

Kann ich mehrere WordPress-Websites auf demselben Server betreiben?

Ja. Legen Sie für jede Website einen eigenen Ordner und eine eigene compose.yaml an und geben Sie jeder einen anderen lokalen Port. Nginx davor leitet die Anfrage anhand der Domain an den richtigen Container weiter. Wenn jede Website ihren eigenen Datenbank-Container hat, sind die Websites voneinander isoliert.

Ich erhalte den Fehler Error establishing a database connection. Warum?

Der WordPress-Container kann sich nicht mit der Datenbank verbinden. Prüfen Sie mit docker compose ps, ob der Datenbank-Container läuft, stellen Sie sicher, dass die Passwörter aus der .env in beiden Containern gleich sind, und warten Sie bei der ersten Installation einige Sekunden, bis die Datenbank bereit ist.

Ich habe das Passwort in der .env geändert, aber es funktioniert nicht. Warum?

Das MariaDB-Image legt Benutzer und Passwort nur fest, wenn die Datenbank zum ersten Mal erstellt wird. Gibt es das Datenbank-Volume bereits, wirkt sich die Änderung in der .env nicht auf den vorhandenen Benutzer aus. Sie müssen das Passwort in der Datenbank selbst ändern oder bei einer neuen Installation das Volume löschen.

Wo liegen meine hochgeladenen Dateien und Plugins?

Alle Dateien von WordPress, einschließlich Uploads und Plugins, liegen im Volume wp, das in der Compose-Datei definiert ist. Selbst wenn Sie den Container löschen und neu erstellen, gehen Ihre Dateien nicht verloren, solange das Volume bestehen bleibt.

Nodesty

Über den Autor

Nodesty-Team · Infrastruktur und Support

Das Nodesty-Team betreibt unsere Server, unser Netzwerk und unseren DDoS-Schutz im Alltag und beantwortet Support-Anfragen rund um die Uhr. Diese Ratgeber entstehen aus dieser Arbeit.

Verwandte Artikel

Starte deinen Server jetzt.

Erstellen, wachsen und skalieren Sie Ihre Projekte grenzenlos auf der Premium-Infrastruktur von Nodesty.

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