Docker Compose paikallisiin ympäristöihin
Ajakaa PHP:tä, tietokantaa ja välimuistia yhdessä paikallisesti.
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-alpinenginx 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:
- appPysyvä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 passYmpä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=secretYhteyden 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=9003Kertaluonteisten 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 webOhitustiedostot
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.
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
- PHP-sovelluksen kontittaminen
- Monivaiheiset koontiversiot ja optimointi
- Docker Compose paikallisiin ympäristöihin
- CI/CD GitHub Actionsilla