Docker ile PHP Geliştirme Ortamı Kurulumu
Neden Docker ile PHP Geliştirme Ortamı?
Geleneksel PHP geliştirme ortamlarında XAMPP, WAMP veya MAMP gibi araçlar kullanılırdı. Ancak bu araçlar farklı işletim sistemlerinde tutarsız davranışlara yol açabilir, ekip içinde "benim bilgisayarımda çalışıyor" sorununu beraberinde getirir. Docker, uygulamanızı ve tüm bağımlılıklarını izole konteynerler içinde çalıştırarak bu sorunları tamamen ortadan kaldırır.
Docker ile PHP geliştirme ortamı kurmanın başlıca avantajları şunlardır:
- Tutarlılık: Geliştirme, test ve üretim ortamları birebir aynı olur.
- İzolasyon: Her proje kendi PHP sürümü, eklentileri ve veritabanıyla çalışabilir.
- Taşınabilirlik: Tek bir komutla ortamı ayağa kaldırabilirsiniz.
- Ekip uyumu: Yeni bir geliştirici projeye dakikalar içinde dahil olabilir.
Gerekli Araçlar
Başlamadan önce sisteminizde aşağıdaki araçların kurulu olması gerekir:
- Docker Engine: Konteynerleri çalıştıran ana motor.
- Docker Compose: Birden fazla konteyneri tanımlayıp yönetmenizi sağlayan orkestrasyon aracı.
Docker'ın kurulu olduğunu doğrulamak için terminalde şu komutları çalıştırın:
docker --version
docker compose version
Proje Dizin Yapısı
Öncelikle düzenli bir proje yapısı oluşturalım:
my-php-project/
├── docker/
│ ├── nginx/
│ │ └── default.conf
│ └── php/
│ └── Dockerfile
├── src/
│ └── index.php
├── docker-compose.yml
└── .env
Bu yapıda docker/ klasörü konteyner yapılandırmalarını, src/ klasörü ise PHP kaynak kodlarımızı barındırır.
Docker Compose ile Servisleri Tanımlama
Projemizin temelini oluşturan docker-compose.yml dosyasını oluşturalım. Bu dosya PHP, Nginx ve MySQL servislerini bir arada tanımlar:
version: '3.8'
services:
php:
build:
context: .
dockerfile: docker/php/Dockerfile
container_name: php-app
volumes:
- ./src:/var/www/html
networks:
- app-network
depends_on:
- mysql
nginx:
image: nginx:alpine
container_name: nginx-server
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- app-network
mysql:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
Bu yapılandırmada üç temel servis tanımladık: PHP-FPM uygulama sunucusu, Nginx web sunucusu ve MySQL veritabanı. Servisler app-network adlı bir bridge ağı üzerinden birbirleriyle iletişim kurar.
PHP Dockerfile Yapılandırması
PHP konteynerimizi özelleştirmek için docker/php/Dockerfile dosyasını oluşturalım:
FROM php:8.3-fpm
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip \
libzip-dev \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
COPY --from=composer:latest /usr/local/bin/composer /usr/local/bin/composer
RUN groupadd -g 1000 appuser && \
useradd -u 1000 -g appuser -m appuser
WORKDIR /var/www/html
USER appuser
Bu Dockerfile'da dikkat edilmesi gereken önemli noktalar:
- php:8.3-fpm imajını temel alıyoruz. FPM (FastCGI Process Manager), Nginx ile birlikte kullanıma uygundur.
- docker-php-ext-install komutuyla sık kullanılan PHP eklentilerini yüklüyoruz.
- Composer'ı multi-stage build yöntemiyle resmi imajından kopyalıyoruz.
- Güvenlik için root yerine özel bir kullanıcı oluşturup konteyneri bu kullanıcıyla çalıştırıyoruz.
Nginx Yapılandırması
docker/nginx/default.conf dosyasını oluşturun:
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
}
Bu konfigürasyonda Nginx, gelen PHP isteklerini fastcgi_pass php:9000 satırıyla PHP-FPM konteynerine yönlendirir. Docker Compose sayesinde servis adı olan php, otomatik olarak doğru IP adresine çözümlenir.
Ortam Değişkenleri
Proje kök dizininde .env dosyasını oluşturun:
DB_ROOT_PASSWORD=root_sifreniz
DB_DATABASE=app_db
DB_USER=app_user
DB_PASSWORD=app_sifreniz
Önemli: Bu dosyayı .gitignore dosyanıza eklemeyi unutmayın. Hassas bilgilerin versiyon kontrol sistemine girmesi güvenlik açığı oluşturur.
Test PHP Dosyası
src/index.php dosyasını oluşturarak ortamın düzgün çalışıp çalışmadığını test edebilirsiniz:
<?php
echo "<h1>Docker PHP Ortamı Çalışıyor!</h1>";
echo "<p>PHP Sürümü: " . phpversion() . "</p>";
// Veritabanı bağlantı testi
try {
$pdo = new PDO(
'mysql:host=mysql;dbname=' . getenv('DB_DATABASE'),
getenv('DB_USER'),
getenv('DB_PASSWORD')
);
echo "<p style='color:green'>Veritabanı bağlantısı başarılı!</p>";
} catch (PDOException $e) {
echo "<p style='color:red'>Veritabanı hatası: " . $e->getMessage() . "</p>";
}
phpinfo();
Ortamı Başlatma
Tüm dosyaları oluşturduktan sonra proje dizininde aşağıdaki komutu çalıştırarak ortamı ayağa kaldırabilirsiniz:
docker compose up -d --build
-d parametresi konteynerleri arka planda çalıştırır, --build ise Dockerfile'daki değişikliklerin uygulanmasını sağlar. İlk çalıştırmada imajların indirilmesi birkaç dakika sürebilir.
Konteyner durumlarını kontrol etmek için:
docker compose ps
Tarayıcınızda http://localhost:8080 adresini açarak PHP uygulamanızın çalıştığını doğrulayabilirsiniz.
Sık Kullanılan Docker Compose Komutları
docker compose up -d— Servisleri arka planda başlatır.docker compose down— Tüm servisleri durdurur ve konteynerleri siler.docker compose logs -f php— PHP konteynerinin loglarını canlı takip eder.docker compose exec php bash— PHP konteynerine terminal bağlantısı açar.docker compose exec php composer install— Konteyner içinde Composer çalıştırır.docker compose down -v— Servisleri durdurur ve veri hacimlerini de siler (dikkatli kullanın).
Xdebug Entegrasyonu
Hata ayıklama için Xdebug eklemek istiyorsanız, Dockerfile'a şu satırları ekleyin:
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY docker/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
Ardından docker/php/xdebug.ini dosyasını oluşturun:
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
Bu ayarlar, VS Code veya PhpStorm gibi IDE'lerle kesme noktası (breakpoint) tabanlı hata ayıklama yapmanızı sağlar.
Laravel veya Symfony ile Kullanım
Bu ortamı bir Laravel projesiyle kullanmak için PHP konteynerine girip projeyi oluşturabilirsiniz:
docker compose exec php composer create-project laravel/laravel .
Laravel kullanırken Nginx konfigürasyonundaki root değerini /var/www/html/public olarak güncellemeyi ve .env dosyasındaki veritabanı host değerini mysql (servis adı) olarak ayarlamayı unutmayın.
Performans İpuçları
- macOS ve Windows kullanıcıları: Volume mount'lar bu sistemlerde yavaş olabilir. Docker Desktop ayarlarından VirtioFS dosya paylaşım motorunu etkinleştirin.
- .dockerignore dosyası: Build bağlamından gereksiz dosyaları çıkarmak için
vendor/,node_modules/ve.git/dizinlerini ekleyin. - Katman önbellekleme: Dockerfile'da sık değişen komutları alta, nadir değişenleri üste yazarak Docker'ın önbellek mekanizmasından faydalanın.
- Alpine imajları: Daha küçük konteyner boyutları için
php:8.3-fpm-alpineimajını tercih edebilirsiniz, ancak bazı eklenti kurulumları farklılık gösterebilir.
Sonuç
Docker ile PHP geliştirme ortamı kurmak, başlangıçta biraz yapılandırma gerektirse de uzun vadede büyük kolaylık sağlar. Projenizi taşırken veya yeni bir ekip arkadaşı dahil olduğunda tek bir docker compose up komutuyla tüm ortam hazır hale gelir. Bu rehberdeki yapılandırmayı temel alarak projenizin ihtiyaçlarına göre Redis, Mailhog, phpMyAdmin gibi ek servisler ekleyebilir ve ortamınızı genişletebilirsiniz.