PHP-sovelluksen kontittaminen
Kirjoittakaa tuotantokäyttöön valmis PHP Dockerfile.
PHP-sovelluksen kontittaminen on ilmainen PHP Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu PHP Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PHP Academy-kurssilla on yhteensä 4 oppituntia.
Miksi PHP kannattaa kontittaa
PHP:n julkaiseminen toistettavasti tarkoittaa täsmällisen tulkin version, laajennusten ja käyttöjärjestelmän kirjastojen lukitsemista koodin rinnalle. Docker-image antaa jokaiselle ympäristölle — kannettavalle, CI:lle ja tuotannolle — saman php -v-tulosteen ja saman ext-*-laajennusjoukon.
Tässä oppitunnissa rakennetaan tuotantovalmis image: PHP-FPM, vain tarvittavat laajennukset, säädetyt asetukset, ei-root-käyttäjä ja terveystarkistus.
FPM vai Apache-pohja
PHP:n virallisista imageista on useita variantteja. nginxin tai traefikin takana toimivaan tuotantoweb-sovellukseen kannattaa valita php:8.3-fpm-alpine (pieni) tai php:8.3-fpm (Debian, glibc — vähemmän yllätyksiä natiivikirjastojen kanssa).
cli— workerit, jonot ja cronfpm— FastCGI-prosessinhallinta, yhdistetään nginxiinapache— mukana tuleva Apache, kätevä mutta raskaampi
Lukitkaa aliversio. Älkää koskaan käyttäkö tuotannossa :latest-tagia.
# 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.Laajennusten asentaminen
Älkää koskaan suorittako näissä imageissa komentoa apt install php-xxx — käyttäkää mukana tulevia apuohjelmia docker-php-ext-install, docker-php-ext-configure ja pecl. install-php-extensions-skripti (mlocati) on käytännössä vakiintunut oikotie, joka hakee oikeat kehitysheaderit puolestanne.
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 imagessa
Kopioikaa Composerin binaari sen virallisesta imagesta sen sijaan, että lataisitte asennusohjelman curlilla. Suorittakaa tuotantoa varten composer install valitsimilla --no-dev ja --optimize-autoloader, ja kopioikaa ensin vain composer.json/composer.lock, jotta riippuvuuskerros voidaan välimuistittaa lähdekoodin muutoksista riippumatta.
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-authoritativephp.ini:n säätäminen
Perusimage sisältää mallit php.ini-production ja php.ini-development. Ottakaa tuotantomalli käyttöön ja lisätkää sitten omat ohituksenne conf.d-hakemistoon — hakemisto yhdistetään viimeisenä, joten sen asetukset voittavat.
Tuotannon keskeiset arvot ovat opcache.enable=1, opcache.validate_timestamps=0 (imagessa oleva muuttumaton koodi) ja järkevä 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.iniOPcache: ohitustiedosto
Tämä on tuotannon suurin yksittäinen suorituskykyhyöty. Kun validate_timestamps=0 on käytössä, PHP ei tarkista tiedostoja stat-kutsulla jokaisen pyynnön yhteydessä — mutta se tarkoittaa, että image TÄYTYY rakentaa uudelleen muutosten julkaisemiseksi (juuri näin muuttumattomien konttien kanssa pitääkin toimia).
; 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-dataSuoritus ei-root-käyttäjänä
Image määrittelee jo käyttäjän www-data. FPM:n ajaminen root-käyttäjänä kasvattaa hyökkäyspinta-alaa tarpeettomasti. Asettakaa kirjoitettavien polkujen (välimuisti ja lokit) omistajuus ja vaihtakaa käyttäjä komennolla USER ennen komentoa CMD.
Sitooko FPM:n pääprosessi silti etuoikeutettuja portteja? Ei — FPM kuuntelee porttia 9000 (etuoikeuttamaton), joten ei-root-käyttäjän käyttö on suoraviivaista.
# 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"]Terveystarkistukset
Orkestrointityökalut tarvitsevat merkin siitä, että FPM on oikeasti käynnissä, eivät vain tietoa prosessin olemassaolosta. cgi-fcgi voi pingata FPM:n /status- tai /ping-päätepistettä. Ottakaa ensin käyttöön pm.status_path ja ping.path FPM:n poolissa.
# 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 1Dockerfilen kokoaminen
Tässä on yhtenäinen, tuotantokäyttöön tarkoitettu yksivaiheinen Dockerfile. Seuraavassa oppitunnissa jaamme sen monivaiheiseksi, jotta build-työkalut jäävät pois. Huomioikaa järjestys: riippuvuudet → määritykset → lähdekoodi → autoload → käyttäjän vaihto.
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"]Koontiversion tarkistaminen
Kun build on valmis, tehkää nopea järkevyystarkistus siitä, mitä imageen todella päätyi: PHP-versio, ladatut laajennukset ja se, että OPcachen validointi on poissa käytöstä. Lyhyt CLI-komentosarja vahvistaa ajonaikaisen sopimuksen, josta sovelluksenne riippuu.
<?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'));
?>Build-kontekstin siistiminen
.dockerignore pitää build-kontekstin pienenä ja estää salaisuuksien sekä vendor-kansion turpoamisen vuotamisen imageen ja välimuistin rikkoutumisen. Jättäkää pois vendor, versionhallinnan tiedostot, ympäristötiedostot ja paikalliset työkalut.
# .dockerignore
.git
.gitignore
vendor/
node_modules/
.env
.env.*
tests/
*.md
docker-compose*.yml
storage/logs/*
var/cache/*Pikatarkistus
Miksi opcache.validate_timestamps=0 asetetaan tuotantokuvaan?
Kertaus
Rakensitte tuotantokäyttöön tarkoitetun PHP-FPM-imagen: versiolukittu 8.3-fpm-alpine-pohja, vain tarvittavat laajennukset installer-skriptillä asennettuina, Composer ja välimuistitetut riippuvuudet omassa kerroksessaan, tuotannon php.ini aktivoituna yhdessä OPcache-ohituksen kanssa, käyttäjäksi vaihdettuna www-data ja lisättynä FPM:n healthcheck.
Keskeiset toimintatavat: lukitkaa versiot, välimuistittakaa riippuvuuskerros, suorittakaa ohjelmat ei-root-käyttäjänä, poistakaa aikaleimojen validointi käytöstä ja pitäkää build-konteksti pienenä .dockerignore-tiedoston avulla.
Opi PHP tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 49
- Oppitunnit
- 195
Usein kysytyt kysymykset
Onko oppitunti ”PHP-sovelluksen kontittaminen” ilmainen?
Kyllä – oppitunnin ”PHP-sovelluksen kontittaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko PHP Academy-kurssin, päivitä CoddyKit PROhon. PHP Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”PHP-sovelluksen kontittaminen”?
Kirjoittakaa tuotantokäyttöön valmis PHP Dockerfile. Harjoittelet PHP Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni PHP Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin PHP Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”PHP-sovelluksen kontittaminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä PHP Academy-oppitunnilla?
Kyllä. Jokainen PHP Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- PHP-sovelluksen kontittaminen
- Monivaiheiset koontiversiot ja optimointi
- Docker Compose paikallisiin ympäristöihin
- CI/CD GitHub Actionsilla