Veritabanı & DevOps

Docker ile PHP Geliştirme Ortamı Kurulumu

Fatih Algül
20.03.2026 294 görüntülenme

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:

  1. Docker Engine: Konteynerleri çalıştıran ana motor.
  2. 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-alpine imajı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.

Yazar Hakkında
Fatih Algül
TechSoft Solutions
Proje mi var?

Yazılım, IoT veya otomasyon konularında destek almak ister misiniz?

İletişime Geç