Konte||||trenger en PHP-applikasjon
Skriv en produksjonsklar PHP Dockerfile.
Konte||||trenger en PHP-applikasjon er en gratis leksjon i PHP Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i PHP Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i PHP Academy inneholder totalt 4 leksjoner.
Hvorfor containerisere PHP
Å levere PHP reproduserbart betyr å låse den eksakte versjonen av PHP-fortolkeren, utvidelsene og operativsystembibliotekene sammen med koden. Et Docker-image gir alle miljøer – utviklermaskinen, CI og produksjon – samme php -v og samme sett med ext-*.
I denne leksjonen bygger vi et produksjonsklart image: PHP-FPM, bare utvidelsene De trenger, finjusterte konfigurasjoner, en ikke-root-bruker og en helsesjekk.
FPM kontra Apache som base
De offisielle PHP-imagene finnes i flere varianter. For en produksjonswebapp bak nginx/traefik bør De foretrekke php:8.3-fpm-alpine (lite) eller php:8.3-fpm (Debian, glibc – færre overraskelser med native biblioteker).
cli— arbeidere, køer og cronfpm— FastCGI-prosessbehandler, brukes sammen med nginxapache— Apache inkludert, praktisk, men tyngre
Lås minorversjonen. Bruk aldri :latest i produksjon.
# Base image choice in your Dockerfile
FROM php:8.3-fpm-alpine AS base
# Why alpine? ~30MB base vs ~140MB Debian.
# Tradeoff: musl libc, occasional native-extension friction.Installere utvidelser
Installer aldri apt install php-xxx i disse imagene – bruk de medfølgende hjelpeverktøyene docker-php-ext-install, docker-php-ext-configure og pecl. Skriptet install-php-extensions (mlocati) er den de facto-snarveien som henter de riktige utviklingsheader-filene for Dem.
FROM php:8.3-fpm-alpine
# Grab the helper that resolves build deps automatically
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions \
pdo_mysql \
opcache \
intl \
zip \
redis \
bcmathComposer i containerbildet
Kopier Composer-binærfilen fra det offisielle imaget i stedet for å bruke curl til å hente et installasjonsprogram. Kjør composer install med --no-dev og --optimize-autoloader for produksjon, og kopier bare composer.json/composer.lock først, slik at avhengighetslaget hurtigbufres uavhengig av endringer i kildekoden.
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
# Cache-friendly: deps layer invalidates only when lock changes
COPY composer.json composer.lock ./
RUN composer install \
--no-dev \
--no-scripts \
--no-autoloader \
--prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritativeFinjustere php.ini
Basisimaget leveres med malene php.ini-production og php.ini-development. Aktiver produksjonsmalen, og legg deretter egne overstyringer i conf.d – den katalogen flettes inn sist, så innstillingene der vinner.
Viktige produksjonsverdier: opcache.enable=1, opcache.validate_timestamps=0 (uforanderlig kode i imaget) og en fornuftig memory_limit.
# Activate production ini
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# Custom overrides win because conf.d loads last
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/zz-app.iniOverstyringsfilen for OPcache
Dette er den klart største gevinsten i produksjon. Med validate_timestamps=0 gjør PHP aldri stat-kall på filer ved hver forespørsel – men det betyr at bildet MÅ bygges på nytt for å distribuere endringer (akkurat det vi ønsker med uforanderlige containere).
; docker/php/zz-app.ini
memory_limit = 256M
expose_php = Off
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 0
opcache.preload = /app/preload.php
opcache.preload_user = www-dataKjør som en ikke-root-bruker
Imaget definerer allerede www-data. Å kjøre FPM som root øker angrepsflaten unødvendig. Angi eierskap for skrivbare stier (cache, logger), og bytt bruker med USER før CMD.
Binder FPM-masterprosessen fortsatt til privilegerte porter? Nei – FPM lytter på 9000 (uten privilegier), så det er enkelt å kjøre som ikke-root.
# Make runtime-writable dirs owned by the runtime user
RUN chown -R www-data:www-data /app/var /app/storage 2>/dev/null || true
USER www-data
EXPOSE 9000
CMD ["php-fpm"]Helsesjekker
Orkestreringsverktøy trenger et signal om at FPM faktisk er i live, ikke bare at prosessen finnes. cgi-fcgi kan pinge FPMs /status- eller /ping-endepunkt. Aktiver pm.status_path og ping.path i FPM-poolen først.
# In www.conf pool config:
; ping.path = /ping
; ping.response = pong
# Dockerfile HEALTHCHECK using cgi-fcgi
RUN install-php-extensions @composer >/dev/null 2>&1 || true
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET \
cgi-fcgi -bind -connect 127.0.0.1:9000 || exit 1Sette sammen Dockerfile
Her er en sammenhengende Dockerfile for produksjon med ett trinn. I neste leksjon deler vi den opp i flere trinn for å fjerne bygge verktøy. Legg merke til rekkefølgen: avhengigheter → konfigurasjon → kildekode → autoload → bytte av bruker.
FROM php:8.3-fpm-alpine
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions pdo_mysql opcache intl zip redis
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /app
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY docker/php/zz-app.ini $PHP_INI_DIR/conf.d/
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
COPY . .
RUN composer dump-autoload --optimize --classmap-authoritative && \
chown -R www-data:www-data /app/var
USER www-data
EXPOSE 9000
CMD ["php-fpm"]Verifisere bygget
Etter byggingen bør du kontrollere hva som faktisk havnet i imaget: PHP-versjonen, innlastede utvidelser og at validering av OPcache er deaktivert. Et raskt CLI-skript bekrefter kjøretidskontrakten appen din er avhengig av.
<?php
// Run inside the container: php verify.php
echo 'PHP ' . PHP_VERSION . PHP_EOL;
$required = ['pdo_mysql', 'opcache', 'intl', 'zip'];
foreach ($required as $ext) {
printf("%-12s %s\n", $ext, extension_loaded($ext) ? 'OK' : 'MISSING');
}
var_dump((bool) ini_get('opcache.enable'));
?>Hygiene for byggkonteksten
En .dockerignore holder byggkonteksten liten og hindrer at hemmeligheter og overflødige vendor-filer lekker inn i imaget og ødelegger cachen. Utelat vendor, VCS, miljøfiler og lokale verktøy.
# .dockerignore
.git
.gitignore
vendor/
node_modules/
.env
.env.*
tests/
*.md
docker-compose*.yml
storage/logs/*
var/cache/*Hurtigsjekk
Hvorfor setter man opcache.validate_timestamps=0 i et produksjonsimage?
Oppsummering
Du bygde et PHP-FPM-image for produksjon: en versjonslåst 8.3-fpm-alpine-base, installerte bare nødvendige utvidelser via installasjonsskriptet, kopierte Composer og cachede avhengigheter i hvert sitt lag, aktiverte produksjonsversjonen av php.ini med en OPcache-overstyring, byttet til www-data og la til en helsesjekk for FPM.
Viktige vaner: lås versjoner, cache avhengighetslaget, kjør som en ikke-root-bruker, deaktiver tidsstempelvalidering og hold byggkonteksten liten med .dockerignore.
Lær deg PHP med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 49
- Leksjoner
- 195
Ofte stilte spørsmål
Er leksjonen «Konte||||trenger en PHP-applikasjon» gratis?
Ja – hele teksten i «Konte||||trenger en PHP-applikasjon» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av PHP Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i PHP Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Konte||||trenger en PHP-applikasjon»?
Skriv en produksjonsklar PHP Dockerfile. Du øver på PHP Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med PHP Academy?
Ingen tidligere erfaring er nødvendig. PHP Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Konte||||trenger en PHP-applikasjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne PHP Academy-leksjonen?
Ja. Alle PHP Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Konte||||trenger en PHP-applikasjon
- Bygg med flere trinn og optimalisering
- Docker Compose for lokale stacker
- CI/CD med GitHub Actions