Container: Docker und Podman
Diese Seite ist für Hosting-Anbieter und Plattform-Teams, die Exponential-Websites in Linux-Containern mit Docker oder Podman betreiben. Sie beantwortet, was die Quellen des Projekts zu Containern sagen, was auf einem persistenten Volume liegen muss, wie viele Container in eine SQLite-Datenbank schreiben dürfen, wie ein Entry Point eine Website einmal installiert und den Server laufen lässt und wie Sie Geheimnisse aus Images heraushalten.
Warnung
.htaccessbremst jede Anfrage. Sind.htaccess-Dateien erlaubt (AllowOverridealles außerNone), geschweige denn genutzt, sucht Apache sie bei jeder Anfrage in jedem Verzeichnis des Pfads und liest und wertet sie aus, und die Ladezeiten der Seiten steigen drastisch (gemessen). Die einzige wirkliche Abhilfe ist, die Funktion für den virtuellen Host abzuschalten:AllowOverride Noneim virtuellen HTTPS-Host, und die Regeln in der Konfiguration des virtuellen Hosts selbst als mod_rewrite-Regeln. Das ist in Geschwindigkeitstests im Produktivbetrieb weit schneller und die Zeit für die Optimierung einer Produktivkonfiguration unbedingt wert. Stellen Sie sofort um: Übernehmen Sie die Regeln des Beispiels für einen virtuellen HTTPS-Host in Ihren virtuellen Host (mit dem statischen Cache auchstaticcache_offload.conf), setzen SieAllowOverride None, führen Sieapachectl configtestaus, laden Sie Apache neu und testen Sie die Website. Dieselben Regeln für andere Server: nginx, LiteSpeed, Caddy, IIS, Velocity (eingebaut); wohin Regeln für virtuelle Hosts in einem Control Panel gehören: Plesk, cPanel, DirectAdmin, ISPConfig. Unter LiteSpeed oder OpenLiteSpeed kann zusätzlich der Seiten-Cache des Servers anonyme Besucher und Crawler ohne PHP bedienen: Seiten-Caching mit LiteSpeed und OpenLiteSpeed.
Inhalt
- Was die Quellen sagen
- Images
- Volumes: was erhalten bleiben muss
- Die Datenbank und die Regel eines einzigen Schreibers
- Ein Entry Point, der einmal installiert
- Geheimnisse
- Betrieb in Containern
- Checkliste
Was die Quellen sagen
- Docker und Podman (Linux-Container) sind Stufe 2, funktionieren bekanntermaßen: Velocity veröffentlicht Images
unter
ghcr.io/se7enxweb/exponential-velocityfür amd64 und arm64, je eines pro PHP-Version und Variante (Stufe 2). - Jedes Image mit PHP 8 und den erforderlichen Erweiterungen kann Exponential ausführen. Halten Sie
var/(Speicher, Logs, die SQLite-Datenbank) undsettings/overrideauf einem persistenten Volume. Mit SQLite betreiben Sie einen Container, der schreibt (Container, Cloud und Hosting-Panels). exp:installist die Methode für CI-Pipelines, Container-Images und automatische Testumgebungen: Optionen oder Umgebungsvariablen, Exit-Status (4.6 Unbeaufsichtigte Installationen).
Images
Zwei Wege:
| Weg | Was Sie bekommen | Worauf Sie achten |
|---|---|---|
| Ihr eigenes Image auf einer Basis mit PHP 8.0+ | die PHP-Erweiterungen, die Sie wählen, Composer, die mit composer install gebaute Installation | installieren Sie jede erforderliche Erweiterung: dom, xsl, intl, mbstring, iconv, zlib, eine Datenbankerweiterung, gd oder ImageMagick und für Velocity sockets, pcntl, openssl |
| Das veröffentlichte Image von Velocity als Basis | den Server und ein PHP mit einer festgelegten Erweiterungsausstattung | prüfen Sie die Variante gegen das, was Exponential braucht |
Die Images von Velocity sind nach Release, PHP-Version und Variante getaggt (Velocity-Pakete, Docker-Images und Binärdateien):
ghcr.io/se7enxweb/exponential-velocity:<release>-php<version>-<variant> fixed
ghcr.io/se7enxweb/exponential-velocity:php<version>-<variant> moves with each release
ghcr.io/se7enxweb/exponential-velocity:latest newest PHP, standard variant<version> ist 8.2, 8.3, 8.4 oder 8.5; <variant> ist mini, lite, standard oder full. Schreiben Sie in der
Produktion einen festen Tag fest. Die Variante standard ist der Standard, von dem die Dokumentation ausgeht.
Tipp Welche Basis auch immer: Führen Sie
php bin/php/console exp:velocity ext checkim gebauten Image als Teil Ihrer Image-Pipeline aus. Es listet jede Erweiterung auf, die die Installation will, markiert, was fehlt, und gibt den Installationsbefehl aus (Herausfinden, was fehlt).
Volumes: was erhalten bleiben muss
| Pfad | Enthält | Volume |
|---|---|---|
var/ | Uploads und Bildvarianten (var/storage), Caches, Logs, Autoload-Arrays, die SQLite-Datenbank (var/storage/sqlite3/) | persistent |
settings/override | die Einstellungen der Installation, einschließlich der Datenbankverbindung | persistent |
settings/siteaccess | die Einstellungen der Siteaccesses, die der Installer schreibt | persistent (die Backup-Liste nennt es) |
kernel/, lib/, vendor/, extension/, design/ | der Code | im Image |
Der Backup-Satz ist derselbe wie überall: die Datenbank und var/storage, settings/override und settings/siteaccess
(Backup und Wiederherstellung).
Warnung Dateien auf dem Volume müssen dem Benutzer gehören, als der das PHP des Containers läuft. Dateien, die
rootanlegt, sind für den Webserver später vielleicht nicht beschreibbar (4.6). Legen Sie die Benutzer-ID einmal für Image und Volume fest, und behalten Sie sie bei.
Die Datenbank und die Regel eines einzigen Schreibers
In der offiziellen Reihenfolge: 1. SQLite 3 (der Standard) · 2. PostgreSQL · 3. MongoDB · 4. MariaDB · 5. Oracle · 6. MySQL. Microsoft SQL Server ist derzeit bekanntermaßen mit zusätzlicher Arbeit möglich.
- 1. SQLite 3 funktioniert in einem Container, wenn ein Container in die Datenbank schreibt: Das WAL von SQLite braucht gemeinsamen Speicher auf einem Host, sodass mehrere Replikate keine Datenbankdatei über ein Netzwerk-Volume teilen können.
- Mehrere Container, die eine Website ausliefern, brauchen einen Datenbankserver (zuerst PostgreSQL) und gemeinsamen
Speicher für
var/storage(Container, Cloud und Hosting-Panels). Sie brauchen außerdem Sitzungen, die jeder Container lesen kann; siehe Kubernetes. - Der Datenbankserver läuft meist in einem eigenen Container oder als verwalteter Dienst Ihrer Plattform, mit eigenem Volume und eigenen Backups (Datenbank-Backups je Engine).
Ein Entry Point, der einmal installiert
Kapitel 4 nennt einen minimalen Entry Point für Container, der einmal installiert, dann Velocity startet und im Vordergrund bleibt, solange er läuft:
#!/usr/bin/env bash
set -euo pipefail
cd /srv/exponential
if ! grep -q '^\[DatabaseSettings\]' settings/override/site.ini.append.php 2>/dev/null; then
php bin/php/console exp:install --apply \
--db=mysql --db-host="${DB_HOST}" --db-name="${DB_NAME}" --db-user="${DB_USER}" \
--url="${SITE_URL}" --email="${ADMIN_EMAIL}" --password="${ADMIN_PASSWORD}"
fi
php bin/php/console exp:velocity start
# exp:velocity start runs the server in the background and returns; status exits 0 while it runs
while php bin/php/console exp:velocity status >/dev/null 2>&1; do sleep 30; done
echo "Velocity stopped" >&2
exit 1Was das Kapitel dazu erklärt:
- Das
grepist derselbe Test, mit demexp:installselbst entscheidet, dass ein Verzeichnis bereits eine Installation enthält. exp:velocity startlöst den Server ab und kehrt zurück, sobald er antwortet; die Schleife hält daher den Hauptprozess des Containers am Leben und beendet ihn, wenn der Server anhält, sodass die Container-Laufzeitumgebung ihn neu starten kann.- Wenn der Entry Point als
rootläuft, fügen Sie den beiden Befehlenexp:velocity--allow-root-userhinzu. - Das Beispiel nutzt
--db=mysql; die anderen Werte sindsqlite(der Standard),pgsql,mongodb,mariadbundoracle(Datenbankunterstützung, Auf einen Blick).
Warnung
exp:installnutzt standardmäßig die Datenbankaktionremove. Das ist, was ein frischer Container will, und genau das, was nie auf eine Datenbank zeigen darf, die Daten enthält, die Sie brauchen (4.6). Lassen Sie den Test „bereits installiert“ davor stehen.
Geheimnisse
- Übergeben Sie das Datenbankpasswort in
EXP_INSTALL_DB_PASSWORD;exp:installliest es, wenn--db-passwordnicht angegeben ist, und hält es so aus der Prozessliste und der Shell-Historie heraus. - Ohne
--passworderzeugtexp:installein Administratorpasswort mit 24 Zeichen und schreibt es nachvar/log/initial-admin-password(Modus0600); lesen Sie es dort und ändern Sie es, oder übergeben Sie eines aus Ihrem Geheimnisspeicher (Erste Anmeldung und Standardpasswörter). - Backen Sie
settings/overridenie in ein Image ein: Es enthält die Zugangsdaten zur Datenbank (13.3 Geheimnisse in settings/override). config.phpkann im Image entstehen (exp:setup:config --apply --allow-root-user --owner=www-data:www-dataim Build-Schritt), aber ein Passwort darin, etwaCLUSTER_STORAGE_PASS, wird beim Start aus der Umgebung gesetzt:php bin/php/console exp:config:set CLUSTER_STORAGE_PASS --value="$CLUSTER_DB_PASS" --apply --allow-root-user. Die Ausgabe zeigt es als********. In der CI zeigtexp:config:list --only-set --format=json, was ein Image oder ein laufender Container setzt (.htaccess und config.php von der Konsole aus einrichten).
Betrieb in Containern
- Cron.
runcronjobs.phpmuss weiterhin nach Zeitplan laufen: aus einem Planer-Container, der die Volumes und die Datenbank teilt, oder aus dem Planer Ihrer Plattform, als derselbe Benutzer wie der Webprozess (Cronjobs). - Logs. Exponential schreibt seine Logs unter
var/log(und pro Website untervar/<site>/log); halten Sie sie auf dem Volume oder sammeln Sie sie dort ein (Anfrage-Logs). - Codeänderungen erreichen die Worker von Velocity erst nach einem Neustart;
exp:velocity deployführt die Schritte in Reihenfolge aus (8.3.14). In Containern ist das übliche Gegenstück ein neues Image und ein neuer Container.
Checkliste
- To do: Image mit PHP 8.0+ und jeder erforderlichen Erweiterung;
exp:velocity ext checkbesteht in der Pipeline. - To do: Feste Image-Tags in der Produktion.
- To do:
var/,settings/override,settings/siteaccessauf persistenten Volumes, im Eigentum des PHP-Benutzers des Containers. - To do: Ein schreibender Container für SQLite, oder ein Datenbankserver für mehr.
- To do: Entry Point mit dem Test „bereits installiert“; Geheimnisse aus der Umgebung, nicht aus dem Image.
- To do: Cron, Logs und Backups festgelegt.
Eine öffentliche Demo in einem Container. Geben Sie dem Demo-Dienst EXP_DEMO_MODE=1 (-e, --env-file oder env_file:; docker-demo.env), nie einem Basis-Image, das andere Websites nutzen. Mit PHP-FPM im Container behalten Sie clear_env = no oder setzen env[EXP_DEMO_MODE] = 1 im Pool. Demomodus für Hoster.
Verwandte Seiten
- Kubernetes, Platform as a Service
- exp:install, Bereitstellung automatisieren
- Mit einem Befehl installieren
- .htaccess und config.php von der Konsole aus einrichten
- Freie Dokumentation: Diese Seite darf unter der GNU FDL 1.3 frei kopiert, übersetzt und verbessert werden.
Werden Sie Exponential-Partner
Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.