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.
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
- Builder stage vezme Composer z explicitní verze, nejdřív kopíruje composer.json a composer.lock a instaluje přesně zamčené dependencies.
- Potom přidá zdrojový kód a vytvoří optimalizovaný autoload i statická aktiva. Testy a analýzu spusť ještě před publikací image.
- Runtime stage vychází z podporované konkrétní PHP base image, obsahuje jen potřebné extensions, aplikaci a vendor z builderu.
- 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í
- Image označ commit SHA nebo release verzí a při deploy použij digest. Nepřepisuj význam tagu latest.
- 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.
- 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.
- 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í
- Migraci spusť jako jednorázový release job a navrhni ji kompatibilně se starou i novou verzí během rolling update.
- Liveness kontroluje zaseknutý proces; readiness závislosti nutné pro obsluhu requestu. Nedělej z obou drahý dotaz přes celý systém.
- 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.
- 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.
-
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 . -
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 -
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.