Modern web geliştirme süreçlerinde karşılaşan en büyük zorluklardan biri, tutarlı ve izole edilmiş geliştirme ortamları oluşturmaktır. Peki, Laravel projenizi Nginx ve MySQL ile Docker Compose kullanarak nasıl hızlıca ayağa kaldırabilir ve bu karmaşıklığı ortadan kaldırabilirsiniz? Bu rehber, size adım adım bir Laravel uygulamasını Docker konteynerlerinde sorunsuz bir şekilde çalıştırmanın tüm detaylarını sunuyor.
Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmalıyız?
Günümüz web geliştirme dünyasında, projelerin karmaşıklığı arttıkça, geliştirme ortamlarının yönetimi de bir o kadar zorlaşmaktadır. Farklı geliştiricilerin farklı işletim sistemleri veya yazılım versiyonları kullanması, “Benim bilgisayarımda çalışıyordu!” sendromuna yol açarak zaman kaybına ve moral bozukluğuna neden olabilir. İşte tam bu noktada Docker Compose devreye giriyor ve bu problemleri kökten çözüyor. Docker Compose, birden fazla Docker konteynerini tanımlayan ve çalıştıran bir araçtır. Bu sayede, Laravel uygulamanız için gerekli olan PHP-FPM, Nginx web sunucusu ve MySQL veritabanı gibi tüm servisleri tek bir yapılandırma dosyası (docker-compose.yml) ile kolayca yönetebilirsiniz.
Docker Compose kullanmanın en büyük avantajlarından biri, izolasyon sağlamasıdır. Her servis kendi bağımsız konteynerinde çalışır, bu da bağımlılık çakışmalarını ortadan kaldırır. Örneğin, projeniz bir PHP 8.1 sürümüne ihtiyaç duyarken, başka bir projeniz PHP 7.4 kullanıyor olabilir. Docker sayesinde her iki projeyi de aynı makinede, birbirine karışmadan çalıştırabilirsiniz. Ayrıca, taşınabilirlik de kritik bir faktördür. Geliştirme ortamınızı tanımlayan docker-compose.yml dosyası, projenizle birlikte versiyon kontrol sistemine (Git gibi) dahil edilebilir. Bu, yeni bir geliştiricinin projeye katıldığında veya mevcut bir projenin farklı bir makineye taşınması gerektiğinde, ortam kurulumunu dakikalar içinde tamamlamasını sağlar. Sadece Docker ve Docker Compose yüklü olması yeterlidir; geriye kalan her şey yapılandırma dosyasında tanımlıdır.
Bir diğer önemli fayda ise kolay kurulum ve yönetimdir. Karmaşık sanal makineler kurmak veya işletim sisteminize PHP, Nginx, MySQL gibi yazılımları manuel olarak yüklemek yerine, sadece birkaç komutla tüm ortamı ayağa kaldırabilirsiniz. Bu, özellikle yeni başlayanlar veya hızlı prototipleme yapmak isteyenler için büyük bir kolaylıktır. Geliştirme ve üretim ortamları arasında tutarlılık sağlaması da Docker Compose’u vazgeçilmez kılar. Yerel ortamınızda çalışan bir uygulamanın, üretim sunucusunda da aynı şekilde davranacağından emin olabilirsiniz, çünkü her iki ortam da aynı Docker imajlarını ve yapılandırmalarını kullanır. Bu tutarlılık, dağıtım süreçlerini basitleştirir ve “canlıda patlama” riskini azaltır. Dolayısıyla, Docker Compose ile Laravel, Nginx ve MySQL kurulumu yapmak, geliştirici verimliliğini artırmanın, dağıtım süreçlerini hızlandırmanın ve ekip içinde uyumlu bir çalışma ortamı yaratmanın anahtarıdır.
Docker Compose Projemizi Başlatmak İçin İlk Adımlar Nelerdir?
Docker Compose ile bir Laravel projesi kurmaya başlamadan önce, sisteminizde bazı temel gereksinimlerin karşılandığından emin olmalıyız. İlk ve en önemli adım, tabii ki Docker Desktop’ın kurulu olmasıdır. Docker Desktop, Docker Engine, Docker CLI, Docker Compose ve Kubernetes’i tek bir pakette sunarak hem Windows hem de macOS kullanıcıları için kurulumu oldukça basitleştirir. Linux kullanıcıları ise Docker Engine ve Docker Compose’u ayrı ayrı kurabilirler. Kurulum tamamlandıktan sonra, terminalinizde docker --version ve docker compose version komutlarını çalıştırarak her şeyin doğru bir şekilde yüklendiğini kontrol edebilirsiniz.
Şimdi projemiz için bir çalışma alanı oluşturalım. Genellikle, projenin tüm dosyalarını barındıracak ana bir dizin oluşturmak en iyi yaklaşımdır. Bu dizin içerisinde Laravel uygulamamızın kodları, Docker Compose yapılandırma dosyamız ve diğer yardımcı dosyalar yer alacaktır. Örneğin, ana dizini laravel-docker-app olarak adlandırabiliriz:
mkdir laravel-docker-app
cd laravel-docker-app
Bu dizinin içine girdikten sonra, Laravel projemizi oluşturabiliriz. Laravel’i doğrudan Docker konteynerleri içinde kurmak yerine, çoğu zaman yerel makinede Composer aracılığıyla kurmak daha pratik olabilir. Bu, Docker imajına Composer’ı dahil etme karmaşıklığını ortadan kaldırır ve projenin hızlıca başlatılmasını sağlar. Eğer Composer kurulu değilse, öncelikle onu kurmanız gerekecektir. Ardından, aşağıdaki komutla yeni bir Laravel projesi oluşturabiliriz:
composer create-project laravel/laravel .
Bu komut, mevcut dizine yeni bir Laravel projesi kuracaktır. Laravel’in tüm bağımlılıklarını indirmesi biraz zaman alabilir. Proje kurulumu tamamlandıktan sonra, ana dizinimiz artık Laravel’in tüm çekirdek dosyalarını içerecektir. Daha sonra, Docker Compose’un kalbi olan docker-compose.yml dosyasını oluşturacağız. Bu dosya, tüm servislerimizi (Nginx, PHP-FPM, MySQL) ve bunların birbirleriyle nasıl etkileşime gireceğini tanımlayacağımız yerdir. Dosyayı ana dizinimizde aşağıdaki gibi oluşturabiliriz:
touch docker-compose.yml
Bu dosyanın içine yazacağımız yapılandırmalar, Docker’a hangi imajları kullanacağını, hangi portları açacağını, hangi dizinleri bağlayacağını ve servislerin birbirleriyle nasıl iletişim kuracağını söyleyecektir. İlk adımlarda bu dosyanın boş olması normaldir; sonraki adımlarda her servisi tek tek bu dosyaya ekleyeceğiz. Bu temel kurulum adımları, projemizin Dockerize edilmesi için sağlam bir zemin hazırlar ve bizi daha karmaşık yapılandırmalara geçiş için hazırlar.
Docker Compose ile MySQL Servisi Nasıl Yapılandırılır?
Uygulamamızın veri depolama ihtiyacını karşılamak için bir MySQL veritabanına ihtiyacımız var. Docker Compose sayesinde, MySQL veritabanını ayrı bir konteyner olarak kolayca ayağa kaldırabiliriz. Bu, veritabanı yönetimini basitleştirir ve ana sistemimizden izole eder. docker-compose.yml dosyamızı açarak MySQL servisini tanımlamaya başlayalım. İlk olarak, bir servis adı belirleyeceğiz, genellikle “db” veya “mysql” gibi isimler tercih edilir. Daha sonra, Docker Hub’dan çekeceğimiz MySQL imajını belirtmeliyiz. Genellikle en son kararlı sürümü kullanmak iyi bir tercihtir, örneğin mysql:8.0 gibi.
MySQL konteynerinin doğru şekilde çalışabilmesi için bazı ortam değişkenlerine ihtiyacı vardır. Bu değişkenler, veritabanının ilk kurulumunda root şifresini, oluşturulacak varsayılan veritabanını ve bir kullanıcı adı ile şifresini belirlememizi sağlar. Bu sayede, Laravel uygulamamızın veritabanına bağlanabilmesi için gerekli kimlik bilgilerini önceden tanımlamış oluruz. İşte docker-compose.yml dosyasında MySQL servisi için temel bir yapılandırma örneği:
version: '3.8'
services:
db:
image: mysql:8.0
container_name: mysql_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password_here
MYSQL_DATABASE: laravel_db
MYSQL_USER: laravel_user
MYSQL_PASSWORD: laravel_password
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pyour_root_password_here"]
timeout: 20s
retries: 10
interval: 10s
volumes:
db_data:
driver: local
Yukarıdaki yapılandırmada MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER ve MYSQL_PASSWORD değerlerini kendi tercihinize göre değiştirmeyi unutmayın. Bu bilgiler, Laravel projenizin .env dosyasındaki veritabanı bağlantı ayarlarıyla eşleşmelidir. ports: - "3306:3306" satırı, host makinenizin 3306 portunu, MySQL konteynerinin 3306 portuna yönlendirir. Bu sayede, isterseniz yerel makinenizdeki bir veritabanı yönetim aracı (örneğin DBeaver veya MySQL Workbench) ile de Docker içindeki veritabanına bağlanabilirsiniz.
Veri kalıcılığı, bir veritabanı konteyneri için hayati öneme sahiptir. Konteynerler geçicidir; eğer konteyneri silerseniz, içindeki tüm veriler de kaybolur. Bu durumu önlemek için Docker volumes kullanırız. volumes: - db_data:/var/lib/mysql satırı, host makinenizde (Docker tarafından yönetilen) db_data adında bir volume oluşturur ve bu volume’ü MySQL konteynerinin verilerini depoladığı /var/lib/mysql dizinine bağlar. Bu sayede, konteyner silinse bile verileriniz db_data volume’ünde güvende kalır ve yeni bir MySQL konteyneri bu volume’ü kullanarak kaldığı yerden devam edebilir. Son olarak, healthcheck kısmı, veritabanı servisinin gerçekten çalışır durumda olup olmadığını kontrol etmek için kullanılır. Bu, diğer servislerin (örneğin PHP-FPM) veritabanına bağlanmaya çalışmadan önce veritabanının hazır olmasını sağlar ve servisler arası bağımlılık yönetiminde önemli bir rol oynar.
Nginx Web Sunucusu Nasıl Entegre Edilir ve Yapılandırılır?
Laravel uygulamamızın internet üzerinden erişilebilir olması için bir web sunucusuna ihtiyacımız var. Nginx, yüksek performanslı ve hafif yapısıyla modern web uygulamaları için popüler bir seçimdir. Docker Compose ile Nginx’i de kolayca bir konteyner olarak yapılandırabiliriz. docker-compose.yml dosyamıza Nginx servisini ekleyerek başlayalım. Servis adı olarak genellikle “nginx” veya “web” kullanılır. Nginx imajı için nginx:stable-alpine gibi hafif ve kararlı bir sürümü tercih edebiliriz. Bu, konteyner boyutunu küçültür ve kaynak tüketimini azaltır.
Nginx’in Laravel projemizi doğru bir şekilde sunabilmesi için özel bir yapılandırma dosyasına ihtiyacı vardır. Bu yapılandırma dosyası, Nginx’e hangi portu dinleyeceğini, kök dizinin nerede olduğunu ve PHP-FPM ile nasıl iletişim kuracağını söyler. Genellikle bu dosyayı projemizin ana dizininde nginx/default.conf gibi bir yolda oluştururuz. İçeriği aşağıdaki gibi olabilir:
# nginx/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html/public; # Laravel'in public dizini
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php index.html index.htm;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000; # PHP-FPM servisine yönlendirme
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
}
Bu yapılandırma dosyasında dikkat etmemiz gereken en önemli kısım root /var/www/html/public; satırıdır. Bu, Nginx’in Laravel uygulamasının public dizinini web kökü olarak kullanmasını sağlar. Ayrıca, fastcgi_pass php:9000; satırı, PHP dosyalarını işlemek için isteği “php” adındaki servise (yani PHP-FPM konteynerimize) 9000 portundan yönlendirir. Bu, Docker Compose’un servis isimlerini otomatik olarak DNS olarak çözümlemesi sayesinde mümkün olur.
Şimdi docker-compose.yml dosyamıza Nginx servisini ekleyelim:
version: '3.8'
services:
# ... (db servisi burada) ...
nginx:
image: nginx:stable-alpine
container_name: nginx_web
restart: always
ports:
- "80:80" # Host'un 80 portunu konteynerin 80 portuna yönlendir
volumes:
- ./:/var/www/html # Proje kodlarımızı konteynere bağla
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # Nginx yapılandırmamızı bağla
depends_on:
- php # Nginx'in başlamadan önce PHP-FPM'in hazır olmasını bekle
# ... (php servisi aşağıda eklenecek) ...
ports: - "80:80" satırı, host makinenizin 80 portunu (varsayılan HTTP portu) Nginx konteynerinin 80 portuna yönlendirir. Bu sayede tarayıcınızdan http://localhost adresine giderek uygulamanıza erişebilirsiniz. volumes bölümünde iki önemli bağlama işlemi yapıyoruz: ./:/var/www/html ile projemizin tüm kodlarını Nginx konteynerinin /var/www/html dizinine bağlıyoruz. Bu, geliştirme sırasında kodlarımızda yaptığımız değişikliklerin anında konteyner içinde de görünmesini sağlar. İkinci bağlama ise ./nginx/default.conf:/etc/nginx/conf.d/default.conf ile özel Nginx yapılandırma dosyamızı konteynerin ilgili dizinine kopyalar. Son olarak, depends_on: - php ifadesi, Nginx servisinin PHP-FPM servisi başlamadan önce başlatılmamasını sağlar, bu da servisler arası doğru başlatma sırasını garanti eder.
Laravel Uygulaması İçin PHP-FPM Servisi Nasıl Kurulur ve Bağlanır?
Laravel, bir PHP framework’ü olduğu için PHP çalışma zamanına ihtiyaç duyar. Web sunucusu olan Nginx, PHP kodunu doğrudan yorumlayamaz; bunun yerine PHP-FPM (FastCGI Process Manager) ile iletişim kurar. PHP-FPM, PHP kodunu işleyen ve Nginx’e sonucu geri döndüren bir aracıdır. Docker Compose ile PHP-FPM servisini de ayrı bir konteyner olarak kolayca yapılandırabiliriz. docker-compose.yml dosyamıza “php” adında yeni bir servis ekleyelim.
PHP imajı olarak, projenizin gereksinimlerine uygun bir PHP sürümünü seçmelisiniz. Örneğin, php:8.2-fpm-alpine gibi bir imaj, hem modern bir PHP sürümü sunar hem de Alpine Linux tabanlı olduğu için oldukça hafiftir. Ancak, Laravel gibi framework’ler genellikle bazı PHP uzantılarına ihtiyaç duyar (pdo_mysql, mbstring, gd, bcmath, exif vb.). Bu uzantıları doğrudan Docker Hub’dan çekilen temel PHP imajına eklemek için özel bir Dockerfile oluşturmak en iyi yöntemdir. Projemizin ana dizininde bir Dockerfile (veya php.Dockerfile) oluşturalım:
# Dockerfile
FROM php:8.2-fpm-alpine
# Gerekli bağımlılıkları ve PHP uzantılarını yükle
RUN apk add --no-cache \
autoconf \
g++ \
make \
libzip-dev \
libpng-dev \
jpeg-dev \
libwebp-dev \
freetype-dev \
icu-dev \
git \
nodejs \
npm \
&& docker-php-ext-install -j$(nproc) pdo_mysql mbstring exif pcntl bcmath gd intl opcache \
&& docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
&& rm -rf /var/cache/apk/*
# Composer'ı kur
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
EXPOSE 9000
Bu Dockerfile, temel PHP-FPM imajını alır, Laravel için gerekli olan çeşitli PHP uzantılarını yükler ve ayrıca Composer’ı da konteyner içine kurar. WORKDIR /var/www/html komutu, konteyner içindeki çalışma dizinini belirler. Şimdi bu Dockerfile‘ı kullanarak docker-compose.yml dosyamızda PHP servisini tanımlayalım:
version: '3.8'
services:
# ... (db ve nginx servisleri burada) ...
php:
build:
context: .
dockerfile: Dockerfile # Yukarıdaki Dockerfile'ı kullan
container_name: php_app
restart: always
volumes:
- ./:/var/www/html # Proje kodlarımızı konteynere bağla
ports:
- "9000:9000" # Sadece PHP-FPM'in dışarıdan erişimini kontrol etmek için
depends_on:
- db # PHP-FPM'in başlamadan önce veritabanının hazır olmasını bekle
environment:
# Laravel .env dosyasındaki değerler için varsayılanlar veya geçersiz kılmalar
DB_CONNECTION: mysql
DB_HOST: db # Veritabanı servisinin adı
DB_PORT: 3306
DB_DATABASE: laravel_db
DB_USERNAME: laravel_user
DB_PASSWORD: laravel_password
PHP servisi için build: context: . dockerfile: Dockerfile satırları, Docker Compose’a bu servisin imajını oluşturmak için mevcut dizindeki (.) Dockerfile dosyasını kullanmasını söyler. volumes: - ./:/var/www/html satırı, projemizin tüm kodlarını PHP-FPM konteynerinin /var/www/html dizinine bağlar. Bu, geliştirme sırasında kodlarımızda yaptığımız değişikliklerin anında PHP konteynerinde de yansımasını sağlar.
depends_on: - db ifadesi, PHP-FPM servisinin MySQL veritabanı servisi başlamadan önce başlatılmamasını sağlar. Bu, PHP uygulamasının veritabanı bağlantısı kurmaya çalışmadan önce veritabanının hazır olmasını garanti eder. environment bölümü ise, Laravel’in .env dosyasındaki bazı değerleri doğrudan konteyner ortam değişkenleri olarak ayarlamamıza olanak tanır. Özellikle veritabanı bağlantı bilgileri gibi hassas verileri bu şekilde yönetmek, uygulamanın farklı ortamlarda (geliştirme, test, üretim) kolayca uyarlanmasını sağlar. DB_HOST: db ifadesi, PHP-FPM’in MySQL servisine “db” adıyla erişmesini sağlar, çünkü Docker Compose servis adlarını otomatik olarak iç ağ DNS’i olarak kaydeder. Bu yapılandırma ile artık Laravel uygulamanızın kodlarını işleyecek PHP-FPM servisi hazır hale gelmiş olur ve Nginx ile sorunsuz bir şekilde iletişim kurabilir.
Uygulamayı Çalıştırma ve İlk Testler: Her Şey Yolunda mı?
Şimdiye kadar tüm servislerimizi (MySQL, Nginx, PHP-FPM) docker-compose.yml dosyamızda tanımladık ve gerekli yapılandırmaları yaptık. Artık uygulamamızı Docker konteynerlerinde ayağa kaldırmanın ve her şeyin düzgün çalışıp çalışmadığını test etmenin zamanı geldi. Bu aşama, tüm parçaların bir araya geldiği ve projemizin canlandığı noktadır. Terminalinizi açın ve projenizin ana dizinine gidin (docker-compose.yml dosyasının bulunduğu yer). Ardından aşağıdaki komutu çalıştırın:
docker compose up -d
Bu komut, docker-compose.yml dosyasını okuyacak, tanımlanan tüm servisler için Docker imajlarını (eğer yerelde yoksa Docker Hub’dan çekerek) oluşturacak veya çekecek ve bu servisleri arka planda (-d parametresi sayesinde “detached” modda) çalıştıracaktır. İlk çalıştırmada imajların indirilmesi biraz zaman alabilir. İşlem tamamlandığında, terminalinizde çalışan servislerin isimlerini göreceksiniz. Konteynerlerin durumunu kontrol etmek için docker compose ps komutunu kullanabilirsiniz. Tüm servislerin durumunun “Up” olması gerekir.
Konteynerler çalışmaya başladıktan sonra, Laravel uygulamamızın veritabanı şemasını oluşturmamız ve belki de bazı başlangıç verilerini eklememiz gerekebilir. Bu işlemleri de Docker konteyneri içinden yapmalıyız. PHP-FPM konteynerimiz içinde Artisan komutlarını çalıştırmak için aşağıdaki komutu kullanabiliriz:
docker compose exec php php artisan migrate
docker compose exec php php artisan db:seed # Eğer seed dosyalarınız varsa
docker compose exec php komutu, “php” adındaki servisin konteyneri içinde bir komut çalıştırmamızı sağlar. php artisan migrate veritabanı migrasyonlarını çalıştırarak tabloları oluşturur, php artisan db:seed ise örnek verileri veritabanına ekler. Bu komutların başarıyla çalışması, PHP-FPM konteynerinin MySQL konteyneri ile sorunsuz bir şekilde iletişim kurabildiğini gösterir.
Tüm servisler çalışıyor ve veritabanı ayarları yapıldıktan sonra, uygulamamıza tarayıcıdan erişebiliriz. Nginx servisini 80 numaralı porta yönlendirdiğimiz için, web tarayıcınızı açın ve adres çubuğuna http://localhost yazın. Laravel’in hoş geldiniz sayfasını görmeniz gerekir. Eğer Laravel’in varsayılan sayfasını görüyorsanız, tebrikler! Laravel uygulamanız, Nginx ve MySQL ile Docker Compose üzerinde başarıyla çalışıyor demektir. Eğer bir sorunla karşılaşırsanız, ilk olarak konteyner loglarını kontrol etmek iyi bir başlangıç noktasıdır. Örneğin, Nginx konteynerinin loglarını görmek için docker compose logs nginx komutunu kullanabilirsiniz. Bu, olası yapılandırma hatalarını veya çalışma zamanı sorunlarını tespit etmenize yardımcı olacaktır.
storage/logs/laravel.log) da PHP konteyneri içinde incelemeyi unutmayın.
Geliştirme sürecinde yaptığınız kod değişikliklerinin otomatik olarak yansıdığından emin olmak için, tarayıcınızı yenileyerek değişiklikleri kontrol edin. volumes bağlaması sayesinde, host makinenizde yaptığınız kod değişiklikleri anında konteyner içinde de görünür olacaktır. Bu, geliştirme akışınızı hızlandırır ve Docker’ın sunduğu en büyük kolaylıklardan biridir. Uygulamayı durdurmak istediğinizde, projenizin ana dizininde docker compose down komutunu kullanabilirsiniz. Bu komut, tüm servisleri durdurur ve konteynerleri siler. Ancak, veritabanı verileriniz db_data volume’ünde güvende kalacaktır.
Gelişmiş Yapılandırmalar ve Optimizasyon İpuçları Nelerdir?
Temel kurulumu başarıyla tamamladıktan sonra, Docker Compose ile Laravel geliştirme ortamınızı daha verimli, güvenli ve performanslı hale getirmek için bazı gelişmiş yapılandırmalara ve optimizasyon ipuçlarına göz atabiliriz. Bu bölümde, deneyimli kullanıcıların iş akışlarını iyileştirecek ve projelerini bir sonraki seviyeye taşıyacak pratik bilgiler bulacaksınız.
Laravel .env Dosyasının Docker Compose ile Entegrasyonu
Laravel, ortam değişkenlerini yönetmek için .env dosyasını kullanır. Docker Compose’da ise bu değişkenleri doğrudan docker-compose.yml içindeki environment bölümünde veya bir .env dosyası aracılığıyla yönetebiliriz. En iyi uygulama, hassas bilgileri (veritabanı şifreleri, API anahtarları vb.) doğrudan docker-compose.yml içine yazmaktan kaçınmaktır. Bunun yerine, ana dizininizde bir .env dosyası oluşturup Docker Compose’un bu dosyayı otomatik olarak okumasını sağlayabilirsiniz. Docker Compose, docker-compose.yml dosyasının bulunduğu dizindeki .env dosyasını otomatik olarak yükler.
# .env (proje ana dizininde)
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_password
APP_NAME="My Docker Laravel App"
APP_ENV=local
APP_KEY=base64:YOUR_GENERATED_APP_KEY_HERE
Daha sonra docker-compose.yml dosyanızda PHP servisi altında bu değişkenlere referans verebilirsiniz:
services:
php:
# ...
environment:
DB_CONNECTION: ${DB_CONNECTION}
DB_HOST: ${DB_HOST}
DB_PORT: ${DB_PORT}
DB_DATABASE: ${DB_DATABASE}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
APP_KEY: ${APP_KEY}
APP_ENV: ${APP_ENV}
# ...
Bu yaklaşım, ortam değişkenlerini merkezi bir yerden yönetmenizi ve hassas bilgileri docker-compose.yml dosyasından ayırmanızı sağlar. Ayrıca, farklı ortamlar (geliştirme, test, üretim) için farklı .env dosyaları kullanarak kolayca geçiş yapabilirsiniz.
Composer ve Artisan Komutlarını Docker İçinde Çalıştırma
Projenizin bağımlılıklarını yönetmek veya Laravel’in Artisan komutlarını çalıştırmak için her zaman PHP-FPM konteyneri içine girmelisiniz. Daha önce docker compose exec php php artisan migrate örneğini görmüştük. Composer için de benzer bir yaklaşım izleyebilirsiniz:
docker compose exec php composer install
docker compose exec php composer update
docker compose exec php php artisan cache:clear
docker compose exec php php artisan config:clear
Bu yöntem, Composer ve Artisan’ın konteynerin izole edilmiş ortamında çalışmasını sağlar ve host makinenizdeki PHP veya Composer kurulumuyla çakışma riskini ortadan kaldırır.
Özel Dockerfile ile PHP İmajını Özelleştirme
Yukarıda bahsettiğimiz gibi, PHP imajınızı özelleştirmek için bir Dockerfile kullanmak, uygulamanızın gereksinimlerine tam olarak uyan bir ortam oluşturmanızı sağlar. Sadece gerekli uzantıları eklemekle kalmaz, aynı zamanda özel PHP ayarlarını (php.ini) da yapılandırabilirsiniz. Örneğin, Laravel için bellek limitini artırmak veya zaman aşımı ayarlarını değiştirmek isteyebilirsiniz. Bunun için php/custom.ini gibi bir dosya oluşturup Dockerfile içinde kopyalayabilirsiniz:
# php/custom.ini
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
# Dockerfile
FROM php:8.2-fpm-alpine
# ... (uzantı kurulumları) ...
COPY php/custom.ini /usr/local/etc/php/conf.d/custom.ini
# ...
Caching Servisleri (Redis/Memcached) Ekleme
Laravel uygulamalarının performansını artırmak için genellikle Redis veya Memcached gibi caching servisleri kullanılır. Bu servisleri de Docker Compose ile kolayca projenize entegre edebilirsiniz:
version: '3.8'
services:
# ... diğer servisler ...
redis:
image: redis:alpine
container_name: redis_cache
restart: always
ports:
- "6379:6379"
volumes:
- redis_data:/data # Veri kalıcılığı için
volumes:
# ... diğer volume'ler ...
redis_data:
driver: local
Ardından Laravel’in .env dosyasında REDIS_HOST=redis olarak ayarlayarak uygulamanızın Redis servisine bağlanmasını sağlayabilirsiniz. Benzer şekilde, Memcached için de bir servis tanımlayabilirsiniz.
HTTPS Yapılandırması ve Güvenlik
Geliştirme ortamında genellikle HTTP kullanılırken, üretimde HTTPS olmazsa olmazdır. Docker Compose ile Nginx’i HTTPS için yapılandırmak mümkündür. Let’s Encrypt gibi hizmetlerle otomatik sertifika sağlamak için certbot gibi ek konteynerler kullanabilirsiniz. Geliştirme ortamında ise, kendinden imzalı (self-signed) sertifikalar oluşturarak HTTPS’i test edebilirsiniz. Bu, Nginx yapılandırmanızda ek server blokları ve SSL sertifikası yollarını belirtmeyi gerektirir.
Uzman İpucu: Üretim ortamında Docker Compose'u doğrudan kullanmak yerine, Kubernetes gibi daha gelişmiş orkestrasyon araçlarını değerlendirmeyi düşünebilirsiniz. Docker Compose, özellikle geliştirme ve küçük ölçekli dağıtımlar için mükemmeldir. Ancak, güvenlik için ortam değişkenlerini Docker Secrets veya Kubernetes Secrets ile yönetmek çok daha güvenlidir.
Bu gelişmiş yapılandırmalar ve ipuçları, Docker Compose ile Laravel geliştirme deneyiminizi daha profesyonel ve sorunsuz hale getirecektir. Projenizin büyüklüğüne ve gereksinimlerine göre bu teknikleri uygulayarak, daha sağlam ve yönetilebilir bir geliştirme ortamı oluşturabilirsiniz.
Sonuç: Docker Compose ile Laravel Geliştirmenin Geleceği
Bu kapsamlı rehber boyunca, Laravel projenizi Nginx ve MySQL ile Docker Compose kullanarak nasıl baştan sona kuracağınızı, yapılandıracağınızı ve yöneteceğinizi adım adım öğrendik. Docker Compose’un sunduğu izolasyon, taşınabilirlik ve kolay yönetim gibi temel avantajlardan başlayarak, MySQL, Nginx ve PHP-FPM servislerini ayrı ayrı nasıl tanımlayacağımızı, veri kalıcılığı için volume’leri nasıl kullanacağımızı ve uygulamamızı nasıl çalıştırıp test edeceğimizi detaylandırdık. Ayrıca, ortam değişkenlerinin yönetimi, özel Dockerfile’lar, caching servislerinin entegrasyonu ve güvenlik gibi gelişmiş konulara da değinerek, projenizi daha profesyonel bir seviyeye taşıyacak ipuçları sunduk.
Docker Compose, özellikle geliştirme ortamlarının standartlaştırılması, yeni ekip üyelerinin hızlıca projeye dahil edilmesi ve farklı projeler arasında geçiş yaparken yaşanan karmaşıklığın azaltılması konusunda paha biçilmez bir araçtır. Geliştirici verimliliğini artırır, “benim makinemde çalışıyordu” sorunlarını ortadan kaldırır ve geliştirme ile üretim ortamları arasında tutarlılık sağlayarak dağıtım süreçlerini kolaylaştırır. Modern web geliştirme pratiklerinin vazgeçilmezi haline gelen kapsayıcı teknolojileri, Laravel gibi popüler framework’lerle birleştiğinde, geliştiricilere sınırsız esneklik ve güç sunar.
Gelecekte, kapsayıcı teknolojilerinin web geliştirme ekosistemindeki rolü daha da artacak. Mikroservis mimarileri, sunucusuz bilişim ve CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) süreçlerinde Docker ve Docker Compose gibi araçlar merkezi bir yer tutmaya devam edecek. Bu rehberde edindiğiniz bilgilerle, sadece mevcut projenizi değil, gelecekteki tüm web projelerinizi de daha modern, sürdürülebilir ve ölçeklenebilir bir şekilde geliştirebileceksiniz. Şimdi öğrendiklerinizi kendi projelerinizde uygulama zamanı!
Sıkça Sorulan Sorular (SSS)
-
S: Docker Compose kullanmak performansımı etkiler mi?
C: Geliştirme ortamında, özellikle macOS ve Windows’ta Docker Desktop’ın sanallaştırma katmanı nedeniyle yerel kurulumlara göre hafif bir performans düşüşü yaşanabilir. Ancak, bu genellikle göz ardı edilebilir düzeydedir ve Docker’ın sunduğu avantajlar bu küçük dezavantajı fazlasıyla telafi eder. Linux’ta ise performans farkı neredeyse hiç yoktur.
-
S: Laravel’in .env dosyasındaki APP_KEY’i nasıl oluşturabilirim?
C:
docker compose exec php php artisan key:generatekomutunu çalıştırarak APP_KEY’i otomatik olarak oluşturabilirsiniz. Bu komut, Laravel projenizin.envdosyasını güncelleyecektir. -
S: Veritabanı verilerimi yedeklemek için ne yapmalıyım?
C: MySQL veritabanı verileriniz
db_dataadındaki Docker volume’ünde saklanır. Bu volume’ü yedeklemek içindocker volume inspect db_datakomutuyla fiziksel konumunu bulup manuel olarak kopyalayabilir veyamysqldumpgibi araçları PHP konteyneri içinden çalıştırarak veritabanı yedeği alabilirsiniz. -
S: Nginx veya PHP-FPM yapılandırmamda değişiklik yaptığımda ne yapmalıyım?
C: Nginx yapılandırmanızda (
nginx/default.conf) değişiklik yaptıysanız, Nginx konteynerini yeniden başlatmanız gerekir:docker compose restart nginx. Eğer PHP-FPM içinDockerfileveyaphp/custom.inigibi dosyalarda değişiklik yaptıysanız, imajı yeniden oluşturmanız ve servisi yeniden başlatmanız gerekir:docker compose build php && docker compose restart php. -
S: Docker Compose ile birden fazla Laravel projesini aynı anda çalıştırabilir miyim?
C: Evet, her Laravel projesi için ayrı bir dizin ve kendi
docker-compose.ymldosyası oluşturarak birden fazla projeyi aynı anda çalıştırabilirsiniz. Her projenin kendi servisleri ve portları farklı olacağı için çakışma yaşanmaz. Örneğin, bir projenin Nginx’ini 80 portuna, diğerini 8080 portuna yönlendirebilirsiniz.
