<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Wordpress &#8211; EIFBYTE</title>
	<atom:link href="https://eifbyte.de/category/wordpress/feed/" rel="self" type="application/rss+xml" />
	<link>https://eifbyte.de</link>
	<description>Ihr IT-Dienstleister für die Region Voreifel - spezialisiert auf Arztpraxen</description>
	<lastBuildDate>Sat, 17 Oct 2026 06:26:08 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://eifbyte.de/wp-content/uploads/2025/10/cropped-logo-farbe-32x32.png</url>
	<title>Wordpress &#8211; EIFBYTE</title>
	<link>https://eifbyte.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WordPress Docker: Best Practices und Schnellstart in 5 Minuten</title>
		<link>https://eifbyte.de/wordpress-docker-best-practices/</link>
					<comments>https://eifbyte.de/wordpress-docker-best-practices/#respond</comments>
		
		<dc:creator><![CDATA[Tayfun Özdemir]]></dc:creator>
		<pubDate>Sat, 17 Oct 2026 04:51:58 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Wordpress]]></category>
		<guid isPermaLink="false">https://eifbyte.de/?p=6308</guid>

					<description><![CDATA[WordPress mit Docker Compose in 5 Minuten aufsetzen und mit 10 Best Practices sicher betreiben: Versionen, Volumes, HTTPS, Backups und Updates.]]></description>
										<content:encoded><![CDATA[<div class="fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling" style="--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:20px;--awb-padding-bottom:10px;--awb-padding-top-small:64px;--awb-padding-right-small:0px;--awb-padding-bottom-small:64px;--awb-padding-left-small:0px;--awb-margin-top:0px;--awb-margin-bottom:0px;--awb-flex-wrap:wrap;" ><div class="fusion-builder-row fusion-row fusion-flex-align-items-stretch fusion-flex-content-wrap" style="max-width:1216.8px;margin-left: calc(-4% / 2 );margin-right: calc(-4% / 2 );"><div class="fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column" style="--awb-bg-blend:overlay;--awb-bg-size:cover;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;"><div class="fusion-column-wrapper fusion-flex-justify-content-flex-start fusion-content-layout-column"><div class="fusion-text fusion-text-1 fusion-text-no-margin" style="--awb-text-color:var(--awb-color7);--awb-margin-bottom:10px;"><p><strong>WordPress Docker</strong> ist die schnellste Art, eine WordPress-Seite reproduzierbar aufzusetzen: Eine Datei beschreibt Webserver, PHP und Datenbank, ein Befehl startet alles. Damit aus der schnellen Testumgebung ein stabiler Betrieb wird, braucht es aber ein paar Regeln. In diesem Beitrag zeigen wir den Schnellstart mit Docker Compose und die Best Practices, die wir selbst im Betrieb von Container-Umgebungen anwenden.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full" src="https://eifbyte.de/wp-content/uploads/2026/10/wordpress-docker-best-practices.webp" alt="WordPress Docker: Schnellstart und Best Practices mit Docker Compose" width="1920" height="600" /></p>
<h2>Warum WordPress Docker statt klassischer Installation?</h2>
<p>Bei einer klassischen Installation hängen PHP-Version, Webserver und Datenbank direkt am Betriebssystem. Jedes Update kann Nebenwirkungen haben, und die Testumgebung sieht selten genauso aus wie der Live-Server. Ein WordPress Docker Setup trennt das sauber:</p>
<ul>
<li><strong>Gleiche Umgebung überall:</strong> Laptop, Testserver und Produktion laufen mit denselben Images.</li>
<li><strong>Schneller Wechsel:</strong> Eine neue PHP-Version ist ein geänderter Image-Tag, kein Umbau des Servers.</li>
<li><strong>Klare Trennung:</strong> Programmcode steckt im Image, Ihre Daten liegen in Volumes. Das macht Backups und Umzüge planbar.</li>
<li><strong>Mehrere Seiten auf einem Server:</strong> Jede Seite bekommt eigene Container, ohne sich gegenseitig zu stören.</li>
</ul>
<h2>Schnellstart: WordPress Docker Compose in 5 Minuten</h2>
<p>Voraussetzung ist eine aktuelle Installation von Docker Engine mit dem Compose-Plugin (Befehl <code>docker compose</code>), unter Windows und macOS zum Beispiel über Docker Desktop. Wir nutzen das <a href="https://hub.docker.com/_/wordpress" target="_blank" rel="noopener">offizielle WordPress-Image</a> und das <a href="https://hub.docker.com/_/mariadb" target="_blank" rel="noopener">offizielle MariaDB-Image</a> von Docker Hub.</p>
<h3>Schritt 1: Passwörter in eine .env-Datei</h3>
<p>Legen Sie einen neuen Ordner an und darin die Datei <code>.env</code>. Docker Compose liest sie automatisch ein. Zufällige Passwörter erzeugen Sie zum Beispiel mit <code>openssl rand -base64 24</code>.</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">DB_PASSWORD=hier-ein-langes-zufallspasswort
DB_ROOT_PASSWORD=hier-ein-zweites-zufallspasswort</code></pre>
<h3>Schritt 2: PHP-Limits in uploads.ini</h3>
<p>Die Standardgrenze für Uploads ist für viele Themes und Bilder zu klein. Diese Datei hebt sie an:</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M</code></pre>
<h3>Schritt 3: Die compose.yaml</h3>
<p>Das ist das Herzstück Ihrer WordPress Docker Umgebung. Die Datei enthält bereits die wichtigsten Best Practices, die wir weiter unten erklären:</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">x-wp-db: &amp;wp-db
  WORDPRESS_DB_HOST: db
  WORDPRESS_DB_NAME: wordpress
  WORDPRESS_DB_USER: wordpress
  WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}

services:
  db:
    image: mariadb:11.4
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: wordpress
      MARIADB_USER: wordpress
      MARIADB_PASSWORD: ${DB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    image: wordpress:php8.3-apache
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment: *wp-db
    volumes:
      - wp_data:/var/www/html
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
    ports:
      - "8080:80"
    logging:
      options:
        max-size: "10m"
        max-file: "3"

  wpcli:
    image: wordpress:cli-php8.3
    user: "33:33"
    profiles: ["tools"]
    environment: *wp-db
    volumes:
      - wp_data:/var/www/html

volumes:
  db_data:
  wp_data:</code></pre>
<h3>Schritt 4: Starten</h3>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">mkdir wordpress-docker &amp;&amp; cd wordpress-docker
# .env, uploads.ini und compose.yaml anlegen (siehe oben)
docker compose up -d
docker compose ps</code></pre>
<p>Nach wenigen Sekunden ist WordPress unter <code>http://localhost:8080</code> erreichbar und zeigt den Installationsassistenten. Das war es schon: Ihre WordPress Docker Umgebung läuft.</p>
<h2>10 Best Practices für WordPress Docker im Betrieb</h2>
<h3>1. Image-Versionen fest pinnen</h3>
<p>Die wichtigste Regel für WordPress Docker im Live-Betrieb: Verwenden Sie nie <code>latest</code>. Sonst bekommen Sie beim nächsten <code>docker compose pull</code> unter Umständen eine neue PHP- oder Datenbank-Hauptversion, ohne es zu merken. Tags wie <code>wordpress:php8.3-apache</code> und <code>mariadb:11.4</code> halten die Hauptversion fest und liefern trotzdem Sicherheitsupdates.</p>
<h3>2. Passwörter nicht in die Compose-Datei schreiben</h3>
<p>Zugangsdaten gehören in die <code>.env</code>-Datei, und diese gehört in die <code>.gitignore</code>. Für höhere Ansprüche unterstützen beide offiziellen Images Docker Secrets: Variablen mit der Endung <code>_FILE</code>, zum Beispiel <code>WORDPRESS_DB_PASSWORD_FILE</code>, lesen das Passwort aus einer Datei statt aus der Umgebung.</p>
<h3>3. Daten in Volumes, nicht im Container</h3>
<p>Bei WordPress Docker gilt: Container sind austauschbar, Ihre Inhalte nicht. Die Datenbank liegt im Volume <code>db_data</code>, die WordPress-Dateien mit Uploads, Themes und Plugins in <code>wp_data</code>. Wichtig zu wissen: Das offizielle Image kopiert WordPress nur beim ersten Start in das leere Volume. Ein neueres Image aktualisiert danach PHP und Apache, den WordPress-Core aktualisieren Sie weiter über das Dashboard oder WP-CLI.</p>
<h3>4. Healthchecks statt Wartezeit</h3>
<p>Der häufigste Fehler beim ersten Start ist „Error establishing a database connection“, weil WordPress schneller hochfährt als die Datenbank. Der Healthcheck in der Compose-Datei und <code>condition: service_healthy</code> sorgen dafür, dass WordPress erst startet, wenn MariaDB wirklich bereit ist.</p>
<h3>5. Datenbank nie nach außen öffnen</h3>
<p>Der Dienst <code>db</code> hat bewusst keinen <code>ports</code>-Eintrag. WordPress erreicht die Datenbank über das interne Docker-Netzwerk unter dem Namen <code>db</code>. Ein offener Port 3306 im Internet ist eine der ersten Stellen, an denen automatisierte Angriffe ansetzen.</p>
<h3>6. HTTPS über einen Reverse Proxy</h3>
<p>Für den Live-Betrieb setzen Sie einen Reverse Proxy wie Caddy oder Traefik vor WordPress. Beide holen sich automatisch Let&#8217;s-Encrypt-Zertifikate. Mit Caddy reicht diese Konfiguration:</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">example.de {
    reverse_proxy wordpress:80
}</code></pre>
<p>Der Port <code>8080</code> am WordPress-Container entfällt dann, nur der Proxy lauscht auf 80 und 443. Das offizielle WordPress-Image wertet den Header <code>X-Forwarded-Proto</code> des Proxys aus, damit WordPress HTTPS korrekt erkennt und keine Weiterleitungsschleifen entstehen.</p>
<h3>7. WP-CLI als eigener Container</h3>
<p>Mit WP-CLI erledigen Sie Updates, Suchen-und-Ersetzen bei Domainwechseln und Wartungsaufgaben ohne Dashboard. Der Dienst <code>wpcli</code> in der Compose-Datei startet nur bei Bedarf (Profil <code>tools</code>). Die Angabe <code>user: "33:33"</code> verhindert Rechteprobleme, weil das CLI-Image sonst mit einer anderen Benutzer-ID schreibt als der Apache-Container.</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">docker compose run --rm wpcli wp core version
docker compose run --rm wpcli wp plugin update --all
docker compose run --rm wpcli wp search-replace 'http://localhost:8080' 'https://example.de'</code></pre>
<h3>8. Backups automatisieren und testen</h3>
<p>Ein WordPress Docker Backup besteht aus zwei Teilen: dem Datenbank-Dump und den Dateien im Volume. Beides lässt sich per Cronjob auf dem Host automatisieren. Legen Sie die Sicherungen außerhalb des Servers ab und spielen Sie regelmäßig eine Wiederherstellung durch. Ein Backup, das nie getestet wurde, ist nur eine Hoffnung.</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;"># Datenbank sichern
docker compose exec db sh -c 'mariadb-dump -u root -p"$MARIADB_ROOT_PASSWORD" wordpress' &gt; backup-$(date +%F).sql

# Dateien (Uploads, Themes, Plugins) sichern
docker run --rm -v wordpress-docker_wp_data:/data -v "$PWD":/backup alpine \
  tar czf /backup/wp-files-$(date +%F).tar.gz -C /data .</code></pre>
<p>Der Volume-Name setzt sich aus Ordnername und Volume zusammen. Mit <code>docker volume ls</code> sehen Sie den genauen Namen.</p>
<h3>9. Updates in einem festen Rhythmus</h3>
<p>Neue Images bringen Sicherheitsupdates für PHP, Apache und MariaDB. Drei Befehle reichen, am besten einmal pro Woche und vorher mit frischem Backup:</p>
<pre style="background: var(--awb-color6); color: #f8f9fa; padding: 16px 18px; border-radius: 6px; border-left: 3px solid var(--awb-color4); overflow-x: auto; font-size: 14px; line-height: 1.55; white-space: pre;"><code style="font-family: Consolas, Menlo, monospace; background: none; color: inherit;">docker compose pull
docker compose up -d
docker image prune -f</code></pre>
<p>Plugins und Themes aktualisieren Sie weiter in WordPress oder per WP-CLI. Die Docker-Images ersetzen keine WordPress-Updates.</p>
<h3>10. Logs begrenzen und überwachen</h3>
<p>Ohne Grenze wachsen Container-Logs, bis die Festplatte voll ist. Die Option <code>logging</code> in der Compose-Datei begrenzt das auf drei Dateien mit je 10 MB. Zusätzlich sollte ein Monitoring prüfen, ob die Seite erreichbar ist, das Zertifikat gültig bleibt und genügend Speicher frei ist. Ausführliche Grundlagen zu Compose finden Sie in der <a href="https://docs.docker.com/compose/" target="_blank" rel="noopener">Dokumentation von Docker</a>.</p>
<h2>WordPress Docker: Entwicklung und Produktion im Vergleich</h2>
<p>Dieselbe Compose-Datei taugt für beide Zwecke, mit ein paar Unterschieden:</p>
<table style="width: 100%; border-collapse: collapse; margin: 10px 0 20px;">
<thead>
<tr>
<th style="text-align: left; padding: 10px; border-bottom: 2px solid var(--awb-color4);">Thema</th>
<th style="text-align: left; padding: 10px; border-bottom: 2px solid var(--awb-color4);">Lokale Entwicklung</th>
<th style="text-align: left; padding: 10px; border-bottom: 2px solid var(--awb-color4);">Produktion</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Erreichbarkeit</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Port 8080 auf localhost</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Nur über Reverse Proxy mit HTTPS</td>
</tr>
<tr>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Passwörter</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">.env-Datei</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">.env mit strengen Rechten oder Docker Secrets</td>
</tr>
<tr>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Theme-Entwicklung</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Theme-Ordner als Bind-Mount einbinden</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Theme im Volume oder im eigenen Image</td>
</tr>
<tr>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Backups</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Optional</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Täglich, extern gelagert, Wiederherstellung getestet</td>
</tr>
<tr>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Debugging</td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);"><code>WORDPRESS_DEBUG: 1</code></td>
<td style="padding: 10px; border-bottom: 1px solid var(--awb-color3);">Aus, Fehler nur ins Log</td>
</tr>
</tbody>
</table>
<h2>Typische Fehler und schnelle Lösungen</h2>
<ul>
<li><strong>Seite leitet nach dem Umzug auf localhost um:</strong> Die alte Adresse steht noch in der Datenbank. Lösung: <code>wp search-replace</code> per WP-CLI, wie oben gezeigt.</li>
<li><strong>Uploads schlagen fehl:</strong> Meist fehlt die <code>uploads.ini</code>, oder sie wurde nach dem Start angelegt. Danach <code>docker compose up -d --force-recreate wordpress</code> ausführen.</li>
<li><strong>Plugins lassen sich nicht installieren:</strong> Dateirechte im Volume stimmen nicht. Die Dateien müssen dem Benutzer <code>www-data</code> (ID 33) gehören.</li>
<li><strong>Alle Daten weg nach <code>docker compose down -v</code>:</strong> Die Option <code>-v</code> löscht die Volumes. Im Alltag nur <code>docker compose down</code> verwenden.</li>
</ul>
<h2>Häufige Fragen zu WordPress Docker</h2>
<h3>Ist WordPress Docker für den Live-Betrieb geeignet?</h3>
<p>Ja, wenn die Best Practices umgesetzt sind: feste Versionen, HTTPS, geschlossene Datenbank, regelmäßige Updates und getestete Backups. Viele Hosting-Anbieter betreiben WordPress intern genau so.</p>
<h3>Apache- oder FPM-Image?</h3>
<p>Das Apache-Image ist der einfachste Einstieg, weil Webserver und PHP in einem Container laufen und .htaccess-Regeln von Plugins direkt funktionieren. Die FPM-Variante braucht zusätzlich einen Nginx-Container und lohnt sich vor allem bei hohem Traffic oder wenn Sie Nginx ohnehin einsetzen.</p>
<h3>Brauche ich für WordPress gleich Kubernetes?</h3>
<p>Für eine einzelne Seite oder ein paar Seiten nicht. Docker Compose auf einem gut gewarteten Server reicht hier völlig. Kubernetes lohnt sich, wenn viele Anwendungen hochverfügbar und automatisch skaliert laufen sollen. Warum Kubernetes-Betrieb und -Upgrades Erfahrung brauchen, lesen Sie in unserem Beitrag zum <a href="/kubernetes-release-v1-36-upgrade-support/">Kubernetes-Release v1.36</a>.</p>
<h3>Wie ziehe ich eine bestehende Seite in eine WordPress Docker Umgebung um?</h3>
<p>Sie exportieren die Datenbank und den Ordner <code>wp-content</code>, starten die Docker-Umgebung, importieren den Dump in den Datenbank-Container und kopieren <code>wp-content</code> in das Volume. Anschließend passen Sie die Adresse per <code>wp search-replace</code> an, falls sich die Domain ändert.</p>
<h2>WordPress Docker Betrieb ohne eigenen Aufwand</h2>
<p>Der Schnellstart ist in fünf Minuten erledigt. Der Aufwand steckt im laufenden Betrieb: Updates, Backups, Zertifikate, Monitoring und schnelle Hilfe, wenn doch etwas klemmt. Genau das übernehmen wir als <a href="/managed-it-services/">Managed IT-Services</a>, inklusive <a href="/it-sicherheit/">IT-Sicherheit</a> und Betreuung durch zertifizierte Kubernetes-Administratoren (CKA, CKS). Wer sich gar nicht selbst um Server kümmern möchte, findet bei uns passendes <a href="/managed-hosting/wordpress-hosting/">WordPress Hosting</a> mit Updates und Backups.</p>
<p><strong>Sie möchten WordPress mit Docker betreiben oder Ihre bestehende Seite umziehen?</strong> Wir prüfen Ihre Umgebung in einem kostenlosen Erstgespräch und zeigen Ihnen den einfachsten Weg. <a href="/kontakt/">Jetzt Kontakt aufnehmen</a> oder anrufen unter <a href="tel:+4922511297351">02251 1297351</a>.</p>
</div></div></div></div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://eifbyte.de/wordpress-docker-best-practices/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
