Praktický návod

Jak nasazovat PHP aplikaci pomocí Dockeru

Sestav jednou neměnný image, otestuj ho a stejný digest povyš přes prostředí až do produkce.

30 minut · Docker deployment

Nejdřív stručně

Kontejner je release artefakt

Docker image má obsahovat přesnou verzi kódu, PHP extensions a produkčních dependencies. Konfigurace prostředí a tajné údaje přicházejí až při spuštění.

Deploy nepřepisuje soubory uvnitř běžícího kontejneru. Spustí nový immutable image, ověří readiness a teprve potom odstraní předchozí verzi, kterou lze stále použít pro rollback.

Připrav si

Odděl build od provozu

Build potřebuje Composer a kompilátory; runtime pouze soubory a knihovny nutné ke spuštění.

  • Dockerfile a .dockerignore uložené s aplikací, commitnutý composer.lock a reprodukovatelný CI build.
  • Registry s immutable tagem nebo digestem a řízeným přístupem pro deploy.
  • Runtime úložiště konfigurace a secrets, které se nekopírují do image ani build logu.
  • Strategii pro databázové migrace, health check, rolling update a návrat na předchozí release.

Kroky 1 až 3

Postav malý a předvídatelný image

Každá vrstva má jasný účel a produkční stage neobsahuje nástroje potřebné jen pro build.

1. Použij multi-stage Dockerfile

  1. Builder stage vezme Composer z explicitní verze, nejdřív kopíruje composer.json a composer.lock a instaluje přesně zamčené dependencies.
  2. Potom přidá zdrojový kód a vytvoří optimalizovaný autoload i statická aktiva. Testy a analýzu spusť ještě před publikací image.
  3. Runtime stage vychází z podporované konkrétní PHP base image, obsahuje jen potřebné extensions, aplikaci a vendor z builderu.
  4. Nastav neprivilegovaného USER, vlastnictví souborů, WORKDIR a exec-form CMD. Zapisovatelné cesty omez na cache a runtime data.
COPY --from=vendor /app/vendor /app/vendor
Oficiální Docker dokumentace k multi-stage buildům

2. Drž image immutable a bez tajemství

  1. Image označ commit SHA nebo release verzí a při deploy použij digest. Nepřepisuj význam tagu latest.
  2. Hesla, tokeny a certifikáty nedávej do ARG, ENV ani COPY. Připoj je za běhu přes secret store s nejmenším nutným oprávněním.
  3. Konfiguraci validuj při startu a chybějící povinnou hodnotu odmítni. Loguj strukturovaně na stdout a stderr bez osobních a tajných dat.
  4. Uploady, session a dlouhodobá data drž mimo container filesystem v object storage, databázi nebo spravovaném volume.
docker build --pull -t registry.example/app:$GIT_SHA .
Oficiální Docker build best practices

3. Nasazuj health checkem a kompatibilní migrací

  1. Migraci spusť jako jednorázový release job a navrhni ji kompatibilně se starou i novou verzí během rolling update.
  2. Liveness kontroluje zaseknutý proces; readiness závislosti nutné pro obsluhu requestu. Nedělej z obou drahý dotaz přes celý systém.
  3. Nové kontejnery začnou dostávat provoz až po readiness. Při ukončení přestanou přijímat requesty a dokončí rozpracovanou práci v grace period.
  4. Rollback vrací předchozí digest. Pokud migrace není zpětně kompatibilní, samotný návrat image nestačí a potřebuje předem připravený plán.
docker image inspect registry.example/app@sha256:...
Oficiální Dockerfile HEALTHCHECK reference

Krok 4

Ověř image jako černou skříňku

Release musí startovat na čistém hostu jen z image, runtime konfigurace a deklarovaných služeb.

  1. Sestav bez lokálního vendor

    Image vznikne z čistého checkoutu a composer.lock; v runtime neobsahuje Composer, testy ani build secrets.

    docker build --no-cache -t app:test .
  2. Spusť jako neprivilegovaný uživatel

    Aplikace obslouží smoke test a zapisuje jen do deklarovaných cest.

    docker run --rm --read-only app:test php -v
  3. Proveď cvičný rollback

    Po neúspěšné readiness se provoz nepřepne; předchozí digest znovu naběhne s kompatibilním schématem.

Když to zlobí

Nejčastější chyby

Image je obrovský

Odděl builder a runtime stage, zmenši build context přes .dockerignore a nekopíruj dev dependencies ani cache.

docker image history app:test
Build cache nereaguje na composer.lock správně

Kopíruj manifesty před zdrojovým kódem a instaluj dependencies v samostatné vrstvě.

Kontejner funguje jen jako root

Oprav ownership během buildu a explicitně vytvoř zapisovatelné runtime adresáře; nesnižuj bezpečnost celého procesu.

Rollback po migraci selže

Použij expand–migrate–contract a odlož destruktivní změnu až po odpojení starého kódu.

Hotovo

Release je reprodukovatelný a vratný.

Produkční image je malý, immutable a bez secrets; nasazení pracuje s readiness, kompatibilní migrací a ověřeným rollbackem.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.