Yerel Yığınlar için Docker Compose
PHP'yi, bir veritabanını ve önbelleği yerel ortamda birlikte çalıştırın.
Yerel Yığınlar için Docker Compose, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Compose ile Yerel Yığınlar
Gerçek PHP uygulamaları hiçbir zaman yalnızca PHP'den ibaret değildir; bir veritabanına, önbelleğe, bazen bir kuyruğa ve e-posta yakalayıcıya ihtiyaç duyar. Docker Compose bunların tümünü tek bir dosyada hizmetler olarak tanımlar ve birbirlerine adlarıyla ulaşabilmeleri için ortak bir ağa bağlar.
Bu derste eksiksiz bir yerel yığın oluşturacağız: PHP-FPM + nginx + MySQL + Redis; buna birimler, sağlık denetimleri ve bağımlılık sıralaması da dahildir.
Hizmet İskeleti
Bir Compose dosyası hizmetleri services: altında listeler. Her hizmet bir Dockerfile'dan build edilebilir veya bir image çekebilir. Compose, her hizmete anahtarıyla ulaşılabilen varsayılan bir ağ oluşturur; PHP uygulamanız MySQL'e localhost üzerinden değil, db ana bilgisayarından bağlanır.
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-alpineFPM'nin Önünde nginx
FPM, HTTP üzerinden değil, 9000 numaralı bağlantı noktasında FastCGI konuşur. nginx, HTTP'yi sonlandırır ve .php isteklerini app:9000 adresine vekil olarak iletir. nginx yapılandırması, PHP hizmetine Compose adını kullanarak başvurur.
# 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 Hizmetini Bağlama
nginx hizmeti aynı kodu (SCRIPT_FILENAME değerini çözümlemek için) ve yapılandırmayı bağlar, 80 numaralı bağlantı noktasını yayımlar ve app hizmetine bağımlı olur. Her iki hizmet de /app yolunu paylaşır; böylece FastCGI'nin her iki tarafındaki yollar eşleşir.
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:
- appKalıcı Birimler
Kapsayıcı dosya sistemleri geçicidir. Adlandırılmış birimler, docker compose down sonrasında veritabanı dosyalarını korur. Bağlama birimleri (./:/app), geliştirme sırasında ana makinedeki kodu canlı olarak eşitler. Durum bilgisi taşıyan veriler için adlandırılmış birimler, kaynak kodu için bağlama birimleri kullanın.
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`Sağlık Denetimleri ve depends_on
depends_on tek başına yalnızca kapsayıcının başlamasını bekler; MySQL'in bağlantıları kabul etmesini beklemez. Bir healthcheck ekleyin ve uygulamanızın veritabanı gerçekten hazır olana kadar beklemesi için condition: service_healthy kullanın.
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 passOrtam ve .env
Compose, değişken araya ekleme işlemi için kardeş bir .env dosyasını otomatik olarak yükler; uygulama yapılandırmasını da environment veya env_file aracılığıyla iletirsiniz. Gizli bilgileri gönderilen Compose dosyasının dışında tutun; bunun yerine değişkenlere başvurun.
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=secretPHP'den Bağlanma
Ağ içinde ana bilgisayar adları hizmet adlarıdır. PHP kodunuz doğrudan db ve redis hizmetlerine bağlanır. Bu parçacık, bir yapılandırma katmanının yapacağı gibi bir DSN'yi ayrıştırır ve Compose hizmet adının bağlantı dizenize nasıl aktarıldığını gösterir.
<?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;
?>Yerel Geliştirme için Xdebug
Xdebug yapılandırmasını yalnızca yerel ortamda, dev derleme hedefi aracılığıyla bağlayın. Hata ayıklayıcının ana makinedeki IDE'nize ulaşabilmesi için client_host değerini host.docker.internal olarak ayarlayın. Xdebug'ı hiçbir zaman üretime göndermeyin; performansı ciddi biçimde düşürür.
; 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=9003Tek Seferlik Komutları Çalıştırma
docker compose run, geçişler, sınamalar veya Composer için geçici bir kapsayıcı başlatır; exec ise hâlihazırda çalışan bir hizmetin içinde çalışır. Görevler için run --rm kullanın; böylece geçici kapsayıcı temizlenir.
# 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 webGeçersiz Kılma Dosyaları
Compose, docker-compose.yml dosyasını docker-compose.override.yml ile otomatik olarak birleştirir. Üretim biçimindeki varsayılanları temel dosyada tutun; yalnızca geliştirmeye yönelik birimleri, bağlantı noktalarını ve Xdebug'ı geçersiz kılma dosyasına koyun. Böylece CI temel dosyayı kullanır, geliştiriciler de ek özelliklere kendiliğinden sahip olur.
# 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)Hızlı Kontrol
Geçişleri çalıştırmadan önce yalnızca depends_on: [db] kullanmak neden yetersizdir?
Özet
Compose ile bir yerel yığın oluşturdunuz: nginx arkasında PHP-FPM (app:9000 adresine FastCGI), hizmet adıyla erişilebilen MySQL ve Redis, kalıcılık için adlandırılmış birimler, depends_on işlemini koşullandıran sağlık denetimleri, env odaklı yapılandırma, yalnızca geliştirmeye yönelik geçersiz kılma dosyasında Xdebug ve run/exec aracılığıyla tek seferlik komutlar.
Unutmayın: hizmet adları DNS ana bilgisayar adlarıdır, geçersiz kılma dosyaları geliştirme eklerini CI dışında tutar ve sağlık denetimleri saf başlangıç sıralamasından daha güvenilirdir.
Sıkça Sorulan Sorular
“Yerel Yığınlar için Docker Compose” dersi ücretsiz mi?
Evet — “Yerel Yığınlar için Docker Compose” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Yerel Yığınlar için Docker Compose” dersinde ne öğreneceğim?
PHP'yi, bir veritabanını ve önbelleği yerel ortamda birlikte çalıştırın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Yerel Yığınlar için Docker Compose” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- PHP Uygulamasını Kapsayıcılaştırma
- Çok Aşamalı Derlemeler ve İyileştirme
- Yerel Yığınlar için Docker Compose
- GitHub Actions ile CI/CD