PHP Academy · Oppitunti

Docker Compose paikallisiin ympäristöihin

Ajakaa PHP:tä, tietokantaa ja välimuistia yhdessä paikallisesti.

Oppitunti 3/413 vaihetta

Docker Compose paikallisiin ympäristöihin on ilmainen PHP Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu PHP Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PHP Academy-kurssilla on yhteensä 4 oppituntia.

Paikalliset pinot Composella

Oikeat PHP-sovellukset eivät ole koskaan vain PHP:tä — ne tarvitsevat tietokannan, välimuistin ja joskus myös jonon sekä sähköpostien sieppaajan. Docker Compose määrittää nämä kaikki palveluiksi yhteen tiedostoon ja liittää ne yhteiseen verkkoon, jotta ne voivat tavoittaa toisensa nimillä.

Tässä oppitunnissa rakennetaan täydellinen paikallinen pino: PHP-FPM + nginx + MySQL + Redis sekä taltiot, healthcheckit ja riippuvuuksien järjestys.

Palvelurakenne

Compose-tiedosto luettelee palvelut kohdassa services:. Jokainen palvelu voidaan buildata Dockerfilestä tai hakea valmiina image-nä. Compose luo oletusverkon, jossa jokainen palvelu on tavoitettavissa avaimensa perusteella — PHP-sovellus yhdistää MySQL:ään isäntänimellä db, ei nimellä localhost.

services:
  app:
    build:
      context: .
      target: dev          # multi-stage dev target
    volumes:
      - ./:/app            # live code mount
    depends_on:
      db:
        condition: service_healthy
  db:
    image: mysql:8.4
  redis:
    image: redis:7-alpine

nginx FPM:n edessä

FPM käyttää FastCGI:tä portissa 9000, ei HTTP:tä. nginx päättää HTTP-yhteydet ja välittää .php-pyynnöt osoitteeseen app:9000. nginx-määritys viittaa PHP-palveluun sen Compose-nimellä.

# docker/nginx/default.conf
server {
  listen 80;
  root /app/public;
  index index.php;

  location / {
    try_files $uri /index.php?$query_string;
  }

  location ~ \.php$ {
    fastcgi_pass app:9000;       # service name from compose
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

Web-palvelun kytkeminen

nginx-palvelu liittää saman koodin (jotta SCRIPT_FILENAME voidaan ratkaista) ja määritystiedoston, julkaisee portin 80 ja riippuu app-palvelusta. Molemmat jakavat hakemiston /app, jotta polut täsmäävät FastCGI-yhteyden molemmilla puolilla.

services:
  web:
    image: nginx:1.27-alpine
    ports:
      - "8080:80"
    volumes:
      - ./:/app:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

Pysyvät taltiot

Säiliöiden tiedostojärjestelmät ovat tilapäisiä. Nimetyt taltiot säilyttävät tietokantatiedostot docker compose down -komennon jälkeenkin. Bind mountit (./:/app) synkronoivat isännän koodin reaaliajassa kehitystä varten. Käyttäkää nimettyjä taltioita tilallisiin tietoihin ja bind mountteja lähdekoodiin.

services:
  db:
    image: mysql:8.4
    environment:
      MYSQL_DATABASE: app
      MYSQL_USER: app
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: rootsecret
    volumes:
      - dbdata:/var/lib/mysql

volumes:
  dbdata:        # survives `down`, removed only by `down -v`

Healthcheckit ja depends_on

depends_on yksin odottaa vain, että säiliö käynnistyy, ei sitä, että MySQL hyväksyy yhteyksiä. Lisätkää healthcheck ja käyttäkää ehtoa condition: service_healthy, jotta sovellus odottaa, kunnes tietokanta on todella valmis.

services:
  db:
    image: mysql:8.4
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-prootsecret"]
      interval: 5s
      timeout: 3s
      retries: 10
  app:
    build: .
    depends_on:
      db:
        condition: service_healthy   # waits for healthcheck pass

Ympäristö ja .env

Compose lataa automaattisesti samassa hakemistossa olevan .env-tiedoston muuttujien interpolointia varten, ja sovelluksen määritykset välitetään kohteiden environment tai env_file kautta. Älkää tallentako salaisuuksia versionhallintaan vietävään Compose-tiedostoon, vaan viitatkaa muuttujiin.

services:
  app:
    build: .
    env_file:
      - .env
    environment:
      DATABASE_URL: "mysql://app:secret@db:3306/app"
      REDIS_URL: "redis://redis:6379"
# .env (gitignored) provides ${...} substitutions
#   MYSQL_PASSWORD=secret

Yhteyden muodostaminen PHP:stä

Verkon sisällä isäntänimet ovat palveluiden nimiä. PHP-koodinne yhdistää suoraan palveluihin db ja redis. Tämä katkelma jäsentää DSN:n samalla tavalla kuin määrityskerros ja näyttää, miten Compose-palvelun nimi siirtyy yhteysmerkkijonoon.

<?php
$dsn = 'mysql://app:secret@db:3306/app';
$p = parse_url($dsn);

printf("driver: %s\n", $p['scheme']);
printf("host:   %s\n", $p['host']);   // 'db' resolves via compose DNS
printf("port:   %d\n", $p['port']);
printf("db:     %s\n", ltrim($p['path'], '/'));

$pdoDsn = sprintf('mysql:host=%s;port=%d;dbname=%s', $p['host'], $p['port'], ltrim($p['path'], '/'));
echo $pdoDsn . PHP_EOL;
?>

Xdebug paikalliseen kehitykseen

Liittäkää Xdebug-määritykset vain paikallisesti (kohteen dev buildin kautta). Asettakaa client_host osoittamaan isännän osoitteeseen host.docker.internal, jotta debugger voi tavoittaa isännällä toimivan IDE:n. Älkää koskaan toimittako Xdebugia tuotantoon — se heikentää suorituskykyä merkittävästi.

; docker/php/xdebug.ini  (mounted only in dev)
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003

Kertaluonteisten komentojen suorittaminen

docker compose run käynnistää väliaikaisen säiliön migraatioita, testejä tai Composeria varten, kun taas exec suoritetaan jo käynnissä olevan palvelun sisällä. Käyttäkää tehtäviin komentoa run --rm, jotta kertakäyttöinen säiliö siivotaan pois.

# Run migrations against the running db
docker compose exec app php bin/console doctrine:migrations:migrate

# One-off: install deps without a long-lived container
docker compose run --rm app composer install

# Tail logs of just the web service
docker compose logs -f web

Ohitustiedostot

Compose yhdistää tiedostot docker-compose.yml ja docker-compose.override.yml automaattisesti. Pitäkää tuotantoa vastaavat oletukset perustiedostossa ja sijoittakaa vain kehitykseen tarkoitetut taltiot, portit ja Xdebug ohitustiedostoon — näin CI käyttää perustiedostoa ja kehittäjät saavat lisäominaisuudet automaattisesti.

# docker-compose.override.yml (auto-merged, dev only)
services:
  app:
    volumes:
      - ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini:ro
    environment:
      APP_ENV: dev
# CI runs: docker compose -f docker-compose.yml up  (no override)

Pikatarkistus

Miksi pelkkä depends_on: [db] ei riitä ennen migraatioiden suorittamista?

Kertaus

Kokositte Composella paikallisen pinon: PHP-FPM nginxin takana (FastCGI osoitteeseen app:9000), MySQL ja Redis tavoitettavissa palvelun nimellä, nimetyt taltiot pysyvyyttä varten, depends_on-käynnistyksen terveysrajoitteena toimivat healthcheckit, ympäristömuuttujiin perustuvat määritykset, Xdebug vain kehitykseen tarkoitetussa ohituksessa sekä kertaluonteiset komennot komennoilla run/exec.

Muistakaa: palveluiden nimet toimivat DNS-isäntäniminä, ohitustiedostot pitävät kehityksen lisäasetukset poissa CI:stä ja healthcheckit ovat luotettavampia kuin naiivi käynnistysjärjestys.

Aloita maksutta

Opi PHP tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
49
Oppitunnit
195

Usein kysytyt kysymykset

Onko oppitunti ”Docker Compose paikallisiin ympäristöihin” ilmainen?

Kyllä – oppitunnin ”Docker Compose paikallisiin ympäristöihin” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko PHP Academy-kurssin, päivitä CoddyKit PROhon. PHP Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Docker Compose paikallisiin ympäristöihin”?

Ajakaa PHP:tä, tietokantaa ja välimuistia yhdessä paikallisesti. Harjoittelet PHP Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni PHP Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin PHP Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Docker Compose paikallisiin ympäristöihin”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä PHP Academy-oppitunnilla?

Kyllä. Jokainen PHP Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. PHP-sovelluksen kontittaminen
  2. Monivaiheiset koontiversiot ja optimointi
  3. Docker Compose paikallisiin ympäristöihin
  4. CI/CD GitHub Actionsilla
← Takaisin: PHP Academy