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.

20 minut · Docker Compose · PHP projekt

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

  1. Popíše tři služby: PHP, nginx a databázi.
  2. Název služby php pak nginx použije jako interní adresu.
  3. 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

  1. Tento image obsahuje PHP-FPM a ovladač pro PostgreSQL.
  2. 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

  1. Ulož ji do docker/nginx/default.conf.
  2. nginx pošle PHP soubory službě php na portu 9000.
  3. 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.

  1. 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
  2. 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
  3. 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.

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.