PHP Academy · Oppitunti

PHP-sovelluksen kontittaminen

Kirjoittakaa tuotantokäyttöön valmis PHP Dockerfile.

Oppitunti 1/413 vaihetta

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 cron
  • fpm — FastCGI-prosessinhallinta, yhdistetään nginxiin
  • apache — 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 \
        bcmath

Composer 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-authoritative

php.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.ini

OPcache: 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-data

Suoritus 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 1

Dockerfilen 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.

Aloita maksutta

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

  1. PHP-sovelluksen kontittaminen
  2. Monivaiheiset koontiversiot ja optimointi
  3. Docker Compose paikallisiin ympäristöihin
  4. CI/CD GitHub Actionsilla
← Takaisin: PHP Academy