Lokální vývoj
Jak vytvořit Docker prostředí pro PHP, nginx a PostgreSQL?
Tři služby, jeden příkaz na spuštění a stejné prostředí pro celý tým.
Co spolu postavíme
PHP běží zvlášť. nginx zvlášť. Databáze také.
Docker Compose popíše tři spolupracující služby v jednom souboru. PHP zpracuje kód, nginx přijme webový požadavek a PostgreSQL uloží data.
Není to produkční šablona pro všechno. Je to čistý a dobře čitelný základ pro lokální vývoj PHP aplikace.
Připrav si
Co musíš mít předem
Když ještě Docker nemáš, začni nejdřív instalačním návodem.
- Docker Desktop nebo Docker Engine s Compose pluginem.
- Adresář PHP projektu. Ukázka předpokládá vstupní soubor public/index.php; Symfony ho už má.
- Volný port 8080. Databázový port 5432 zveřejni jen tehdy, když ho opravdu potřebuješ z počítače.
- Textový editor. Konfigurační soubory patří do Git repozitáře, hesla ne.
Krok za krokem
Přidej tři malé konfigurační soubory
V kořeni projektu vytvoř compose.yaml, Dockerfile a docker/nginx/default.conf. Pak do nich vlož následující obsah.
1. compose.yaml
- Popíše tři služby: PHP, nginx a databázi.
- Název služby php pak nginx použije jako interní adresu.
- Heslo je jen pro lokální ukázku. Do produkce patří do bezpečné konfigurace.
services:
php:
build: .
volumes:
- .:/var/www/html
depends_on:
db:
condition: service_healthy
nginx:
image: nginx:alpine
ports:
- "127.0.0.1:8080:80"
volumes:
- .:/var/www/html:ro
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- php
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: change-me
ports:
- "127.0.0.1:5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 5s
timeout: 3s
retries: 10
volumes:
postgres_data: Dokumentace Docker Compose 2. Dockerfile pro PHP
- Tento image obsahuje PHP-FPM a ovladač pro PostgreSQL.
- Verzi PHP vždy slaď s projektem. Pokud používáš Composer, přidej ho později podle potřeby.
FROM php:8.4-fpm-alpine
RUN docker-php-ext-install pdo_pgsql
WORKDIR /var/www/html Oficiální PHP image 3. Konfigurace nginx
- Ulož ji do docker/nginx/default.conf.
- nginx pošle PHP soubory službě php na portu 9000.
- Příklad čeká veřejný vstup aplikace v adresáři public.
server {
listen 80;
server_name _;
root /var/www/html/public;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
} Dokumentace nginx Spusť a ověř
Teď nech Docker udělat práci
Příkazy spusť z kořene projektu, kde leží compose.yaml.
-
Sestav a spusť služby
Poprvé se stáhnou image a sestaví PHP image. Parametr -d nechá služby běžet na pozadí.
docker compose up --build -d -
Zkontroluj stav
U všech tří služeb hledej stav running. Když některá hned skončí, podívej se do jejích logů.
docker compose ps -
Otevři aplikaci
V prohlížeči otevři http://localhost:8080. U Symfony by se měla zobrazit aplikace nebo její výchozí stránka.
docker compose logs --tail=50 nginx
Časté zádrhele
Když to neběží napoprvé
Port 8080 nebo 5432 už někdo používá
Port změň na levé straně v compose.yaml, například na "127.0.0.1:8081:80". Port služby vpravo nech beze změny.
nginx vrací 502 Bad Gateway
Služba php nejspíš neběží nebo se image nesestavil. Zkontroluj její log a ověř, že v konfiguraci nginx zůstalo fastcgi_pass php:9000.
docker compose logs --tail=80 php Aplikace se nepřipojí k databázi
PostgreSQL není uvnitř Docker sítě na localhost. V konfiguraci aplikace použij host db, uživatele app, databázi app a heslo z compose.yaml.
Chci začít s prázdnou databází
Docker volume drží data i po zastavení služeb. Následující příkaz proto smaže lokální databázová data. Použij ho jen tehdy, když je opravdu můžeš zahodit.
docker compose down --volumes Hotovo
Máš opakovatelné lokální prostředí.
Docker drží popis prostředí v kódu. Další krok je přidat Composer, proměnné prostředí a migrace podle konkrétní aplikace.