Stručne: Aktualizácia image PHP Docker je proti PHP2Shell povinnosťou a nestane sa sama od seba. Musíte image s opravenou verziou PHP znova zostaviť alebo stiahnuť, každý kontajner z neho vytvoriť nanovo a overiť, že v bežiacom kontajneri beží 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35. Obyčajný reštart kontajnera nestačí.
Prečo kontajnery nie sú automaticky bezpečné
Image Docker je zmrazená momentka. PHP v ňom zostáva na stave, ktorý malo pri zostavovaní, aj keď sú na hostiteľovi už dávno nasadené aktualizácie. Aktualizácia balíka na hostiteľskom systéme nemení na PHP v kontajneri nič.
K tomu pribúdajú typické pasce: image zostavené pred mesiacmi a odvtedy nedotknuté, základné image s pevným tagom ako php:8.3.35-fpm, lokálne cache, ktoré pri zostavovaní opätovne použijú starý základný image, a kontajnery, ktoré sa síce reštartovali, ale nikdy nevytvorili nanovo. Dotknuté sú všetky spôsoby prevádzky bežné v kontajneroch: PHP-FPM, Apache s mod_php a FrankenPHP.
K tomu pribúda otázka zodpovednosti. V mnohých firmách image raz zostavila agentúra alebo vývojár, prevádzkuje ho však interné IT alebo poskytovateľ hostingu. Potom sa nikto necíti zodpovedný za stav PHP v image. Preto najprv objasnite, kto image zostavuje, kde leží Dockerfile a kto smie nasadzovať nové image.
Overenie verzie PHP v kontajneri
Skontrolujte bežiaci kontajner, nielen Dockerfile. Príkazy sú čisto čítacie.
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.CreatedAt}}"
docker exec <container> php -v
docker exec <container> php -i | grep -E "^PHP Version|Server API"
docker image inspect <image> --format "{{.Created}}"
Ak image používa distribučné balíky namiesto oficiálnych zostavení PHP, skontrolujte stav balíka v kontajneri. Názvy balíkov sa líšia podľa základnej distribúcie:
docker exec <container> sh -c "apt policy php8.3-fpm 2>/dev/null || apk info -v 2>/dev/null | grep php"
Pri distribučných balíkoch môže byť nasadený backport, aj keď číslo verzie zostáva staré. Potom rozhoduje changelog balíka. Oficiálne image PHP naopak prinášajú PHP zvyčajne samy skompilované; tam je rozhodujúcou hodnotou číslo verzie z php -v. Ako rozpoznať backporty, popisuje stránka Správne overenie verzie a stavu záplat PHP.
Aktualizácia image PHP Docker: zostaviť znova a nasadiť
Vlastný image na základe image PHP: základný image stiahnuť znova a zostaviť bez cache.
docker build --pull --no-cache -t meine-app:2026-10-25 .
docker run --rm meine-app:2026-10-25 php -v # pred nasadením skontrolovať verziu
S Docker Compose: image stiahnuť, resp. zostaviť a kontajnery vytvoriť nanovo.
docker compose pull
docker compose build --pull --no-cache
docker compose up -d --force-recreate
Potom znova skontrolujte pomocou docker exec <container> php -v, či beží nová verzia. Ak má kontajner v Dockerfile pevný tag verzie, napríklad FROM php:8.3.35-fpm, musíte tag zvýšiť. Tag na vetvu, ako php:8.3-fpm, dostáva nové stavy záplat, ale iba ak image stiahnete znova.
Predchádzajúci image majte pripravený, kým nie je nová verzia otestovaná. Pri chybe tak môžete prejsť späť bez toho, aby aplikácia dlho zostala offline. Starý image však opäť obsahuje zraniteľné PHP; cesta späť je preto obhájiteľná len krátko a s prechodnými opatreniami.
Kto používa Kubernetes, nasadzuje nový image cez Deployment. Podrobnosti nájdete na stránke Záplatovanie PHP v Kubernetes. Pre image FrankenPHP platí rovnaký postup; upozornenia k spôsobu prevádzky nájdete na stránke Zabezpečenie FrankenPHP.
Nezabudnite na vedľajšie kontajnery: cron a queue workery, administrátorské nástroje alebo staging prostredia často používajú ten istý image PHP, bežia však vo vlastných kontajneroch. Každý z nich sa musí vytvoriť nanovo.
Prechodné opatrenia v kontajneri
Ak aktualizácia ešte nejde, prechodné opatrenia php.net platia aj v kontajneri. Nie sú úplnou ochranou. Hranica pamäte patrí pritom ku kontajneru, pretože php.net ju odporúča cez kontajner alebo cgroup, nie cez RLIMIT_AS alebo RLIMIT_DATA:
; napr. ako súbor v image: /usr/local/etc/php/conf.d/zz-uebergang.ini
memory_limit = -1
post_max_size = 8M
upload_max_filesize = 6M
session.upload_progress.enabled = 0
docker run --memory=1g ... # alebo v Compose: deploy.resources.limits.memory
Hodnotu prispôsobte svojej aplikácii. Dbajte na to, aby aplikácia nemohla memory_limit sama prepísať; pri PHP-FPM na to nastavte hodnoty v poole pomocou php_admin_value. Nová konfigurácia zaberie až po vytvorení kontajnera nanovo alebo jeho reštarte; súvislosti k reštartu nájdete na stránke Reštart PHP-FPM a všetkých workerov.
Aby to nabudúce išlo rýchlejšie
- Image zostavovať pravidelne a automaticky, nielen pri zmenách kódu.
- Používať základné image s tagom vetvy a zostavený stav verzionovať dátumom alebo digestom.
- Image pred nasadením nechať skontrolovať na známe zraniteľnosti a kontajnery prevádzkovať bez práv root.
- Viesť inventár, ktoré kontajnery používajú ktorý image.
Ako konkrétne pomáha PHP SOS?
- Zaznamenať stav: Preveríme všetky bežiace kontajnery, ich image a verzie PHP, aj vedľajšie kontajnery a staging.
- Zostaviť znova a nasadiť: Cez službu záplatovania PHP zostavíme image s opravenou verziou a kontajnery riadene vytvoríme nanovo.
- Zabezpečiť prechod, kde aktualizácia závisí od aplikácie: hodnoty z php.net, hranica pamäte na kontajneri.
- Trvalo sledovať: S security monitoringom máme na očiach stavy image a nápadné správanie kontajnerov.
Časté otázky
Stačí docker restart po aktualizácii?
Nie. docker restart spustí kontajner znova s tým istým, starým image. Musíte zostaviť alebo stiahnuť nový image a vytvoriť z neho kontajner nanovo, napríklad pomocou docker compose up -d --force-recreate.
Obsahuje oficiálny image PHP už opravenú verziu?
Najlepšie to preveríte priamo: stiahnite image znova a spustite v ňom php -v. Očakáva sa 8.5.12, 8.4.27, 8.3.36 alebo 8.2.35. Ak image ukazuje staršie číslo, ešte nie je aktualizovaný alebo pochádza z cache.
Je PHP v kontajneri menej ohrozené než na hostiteľovi?
Samotná zraniteľnosť pôsobí v kontajneri rovnako. Dobre zostavený kontajner môže obmedziť následky vlámania, napríklad používateľom bez práv root a súborovým systémom chráneným proti zápisu. Záplatu to nenahrádza.