Laravel Uygulamalarını Docker ile Güvenli Üretim Ortamına Taşıma
Laravel Uygulamalarını Docker ile Güvenli Üretim Ortamına Taşıma Rehberi
Laravel, modern web uygulamaları geliştirmek için tercih edilen güçlü bir PHP framework'üdür. Geliştirme ortamında mükemmel bir deneyim sunsa da, uygulamaları üretim ortamına taşımak ve orada stabil bir şekilde çalıştırmak, çoğu zaman özel bir uzmanlık gerektirir. İşte tam bu noktada Docker devreye giriyor. Docker, uygulamalarınızı ve bağımlılıklarını izole edilmiş, taşınabilir konteynerler içinde paketleyerek, "benim bilgisayarımda çalışıyordu" sorununu ortadan kaldırır ve üretim dağıtım süreçlerinizi basitleştirir.
Bu rehberde, Laravel uygulamalarınızı Docker kullanarak güvenli ve ölçeklenebilir bir üretim ortamına nasıl taşıyacağınızı adım adım inceleyeceğiz. Ömer Kaymak olarak, Laravel, SaaS geliştirme ve DevOps süreçlerindeki tecrübelerimle, bu karmaşık süreci sizin için anlaşılır kılmayı hedefliyorum.
Neden Docker ile Laravel Üretim Ortamı?
Docker'ın Laravel projeleriniz için sunduğu başlıca avantajlar şunlardır:
- Tutarlılık: Geliştirme, test ve üretim ortamlarının aynı olmasını sağlar. Bu, beklenmedik hataları en aza indirir.
- İzolasyon: Her servis (Nginx, PHP-FPM, Veritabanı vb.) kendi konteynerinde çalışır. Bu, bağımlılık çakışmalarını engeller ve güvenlik sağlar.
- Taşınabilirlik: Docker imajları, herhangi bir Docker yüklü sunucuda çalışabilir. Bu, bulut sağlayıcıları arasında geçişi kolaylaştırır.
- Ölçeklenebilirlik: İhtiyaç duyduğunuzda servislerinizi yatayda kolayca ölçeklendirebilirsiniz.
- Kolay Yönetim: Uygulama dağıtımı ve güncellemeleri standartlaştırılmış süreçlerle daha kolay hale gelir.
Temel Gereksinimler
Bu rehberden en iyi şekilde faydalanmak için temel düzeyde Docker ve Laravel bilgisine sahip olmanız yeterlidir.
Adım 1: Temel Docker Yapılandırması
Laravel uygulamanız için Nginx, PHP-FPM ve bir veritabanı (MySQL veya PostgreSQL) içeren bir Docker Compose yapısı oluşturacağız.
Dockerfile (PHP-FPM için)
Uygulamanızın PHP ortamını tanımlayan bir Dockerfile oluşturalım. Üretim ortamı için çok aşamalı (multi-stage) build kullanmak, nihai imaj boyutunu küçülterek dağıtım hızını artırır ve güvenlik risklerini azaltır.
# Base Stage (Build Environment)
FROM composer:2 AS composer_build
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
# Development/Production Stage (PHP-FPM)
FROM php:8.2-fpm-alpine AS production_php
WORKDIR /var/www/html
# Gerekli PHP uzantılarını yükle
RUN apk add --no-cache \
libzip-dev \
libpng-dev \
jpeg-dev \
postgresql-dev \
mysql-client \
oniguruma-dev \
icu-dev \
&& docker-php-ext-configure gd --with-jpeg --with-freetype \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql zip exif pcntl bcmath opcache intl
# Composer bağımlılıklarını build aşamasından kopyala
COPY --from=composer_build /app/vendor /var/www/html/vendor
# Uygulama kodunu kopyala
COPY . /var/www/html
# Ortam değişkenleri için .env dosyasını kopyala (üretim için uygun olanı)
# Genellikle CI/CD sürecinde veya dağıtım sırasında kopyalanır/oluşturulur.
# COPY .env.production /var/www/html/.env
# Laravel optimizasyonları
RUN php artisan optimize:clear \
&& php artisan config:cache \
&& php artisan route:cache \
&& php artisan view:cache
# Depolama izinlerini ayarla
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache \
&& chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]
Nginx Yapılandırması (nginx.conf)
Nginx sunucunuz için basit bir yapılandırma dosyası:
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Docker Compose Dosyası (docker-compose.yml)
Uygulamanızın servislerini (Nginx, PHP, Veritabanı, Redis) bir araya getiren docker-compose.yml dosyası:
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: laravel_nginx
ports:
- "80:80"
volumes:
- .:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- app-network
php:
build:
context: .
dockerfile: Dockerfile
target: production_php # Üretim aşamasını hedefle
container_name: laravel_php
volumes:
- .:/var/www/html
networks:
- app-network
environment:
# .env dosyasındaki değişkenleri burada veya bir .env dosyası ile tanımlayın
# Örnek:
# APP_ENV: production
# DB_CONNECTION: mysql
# DB_HOST: mysql
# DB_PORT: 3306
# DB_DATABASE: laravel
# DB_USERNAME: root
# DB_PASSWORD: password
# REDIS_HOST: redis
# CACHE_DRIVER: redis
# SESSION_DRIVER: redis
# QUEUE_CONNECTION: redis
# ... diğer Laravel değişkenleri
env_file:
- .env # Bu dosyanın üretim ortamına özel olduğundan emin olun
mysql:
image: mysql:8.0
container_name: laravel_mysql
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: laravel
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
redis:
image: redis:alpine
container_name: laravel_redis
ports:
- "6379:6379"
networks:
- app-network
volumes:
dbdata:
networks:
app-network:
driver: bridge
.env Dosyası Yönetimi
Üretim ortamında .env dosyasını doğrudan git'e eklemeyin. Güvenlik ve esneklik için ortam değişkenlerini Docker Compose dosyasında tanımlayabilir veya CI/CD süreçlerinizde dinamik olarak oluşturabilirsiniz. env_file: .env kullanımı, .env dosyasının sunucuda manuel olarak veya otomatize bir süreçle oluşturulmasını gerektirir.
Adım 2: Laravel Projesini Docker İçin Hazırlama
-
.dockerignore: Projenizin kök dizininde bir.dockerignoredosyası oluşturarak, Docker imajına gereksiz dosyaların (örn.node_modules,.git,vendor- eğer multi-stage build kullanılıyorsa) dahil edilmesini engelleyin. Bu, imaj boyutunu küçültür..git .env vendor/ node_modules/ .DS_Store npm-debug.log -
Veritabanı Bağlantıları:
.envdosyanızda veya Docker Composeenvironmentkısmında veritabanı host'unu servis ismi olarak ayarlayın (örn.DB_HOST=mysql). -
Önbellek, Oturum ve Kuyruk Sürücüleri: Üretim ortamında Redis gibi daha performanslı sürücüleri kullanmayı düşünebilirsiniz (örn.
CACHE_DRIVER=redis,SESSION_DRIVER=redis,QUEUE_CONNECTION=redis). -
Depolama İzinleri:
storagevebootstrap/cachedizinlerininwww-datakullanıcısı tarafından yazılabilir olduğundan emin olun.Dockerfileiçinde bunu hallettik.
Adım 3: Üretim Ortamı İçin Optimizasyonlar
- Küçük İmajlar:
alpinetabanlı imajlar kullanarak imaj boyutunu önemli ölçüde küçültün. - Çok Aşamalı Build (Multi-stage Builds): Yukarıdaki
Dockerfileörneğinde olduğu gibi, build ve çalışma ortamlarını ayırarak final imajına sadece gerekli bağımlılıkları dahil edin. - Laravel Optimizasyonları:
php artisan config:cache,route:cache,view:cachekomutlarını üretim dağıtımının bir parçası olarak çalıştırın. - Log Yönetimi: Laravel loglarını
stdout'a yönlendirin (APP_LOG=stderr). Bu, Docker'ın kendi log toplama mekanizmalarıyla entegrasyonu kolaylaştırır. - Güvenlik: Konteynerleri
rootolmayan bir kullanıcı ile çalıştırmak güvenlik açısından önemlidir.Dockerfileiçinde kullanıcı tanımlaması yapabilirsiniz (USER www-data).
Adım 4: Dağıtım Stratejileri
Temel bir dağıtım için, sunucunuzda Docker ve Docker Compose yüklü olduktan sonra, projenizi sunucuya aktarıp şu komutları çalıştırabilirsiniz:
docker compose build
docker compose up -d
Daha gelişmiş üretim dağıtımları için CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hatları (örn. GitLab CI, GitHub Actions, Jenkins) kullanmak, süreci otomatikleştirir ve hata riskini azaltır. Büyük ölçekli uygulamalar için Kubernetes veya Docker Swarm gibi konteyner orkestrasyon araçları, yönetimi ve ölçeklemeyi daha da kolaylaştırır.
Adım 5: İzleme ve Yönetim
Uygulamanız üretimde çalışmaya başladığında, performansını ve sağlığını izlemek kritik öneme sahiptir.
- Log Takibi:
docker compose logs -fkomutu ile konteyner loglarını anlık olarak takip edebilirsiniz. Daha gelişmiş çözümler için ELK Stack (Elasticsearch, Logstash, Kibana) veya Grafana Loki gibi araçları entegre edebilirsiniz. - Sağlık Kontrolleri: Docker'ın sağlık kontrollerini (HEALTHCHECK) kullanarak konteynerlerinizin gerçekten çalışır durumda olup olmadığını doğrulayabilirsiniz.
- Güncelleme Stratejileri: Uygulama güncellemelerini sıfır kesintiyle yapmak için rolling update gibi stratejiler uygulayın.
Sonuç
Laravel uygulamalarınızı Docker ile üretim ortamına dağıtmak, modern DevOps pratiklerinin vazgeçilmez bir parçasıdır. Bu rehberde sunduğumuz adımları takip ederek, uygulamanız için tutarlı, güvenli ve ölçeklenebilir bir altyapı oluşturabilirsiniz. Docker, geliştirme ve üretim arasındaki köprüyü kurarak, yazılım geliştirme süreçlerinizi çok daha verimli hale getirir.
Laravel, Docker, SaaS geliştirme, AI entegrasyonları veya n8n otomasyonu konularında daha fazla desteğe veya danışmanlığa ihtiyacınız varsa, Ömer Kaymak olarak size yardımcı olmaktan memnuniyet duyarım. İşletmenizin dijital dönüşüm yolculuğunda yanınızda olmak için sabırsızlanıyorum.
İletişime geçmek ve projelerinizi konuşmak için hemen kaymak.dev/iletisim adresini ziyaret edin!
9 yıllık yazılım deneyimiyle web, mobil ve AI çözümleri geliştiriyor. Laravel, Vue, n8n ve AI entegrasyonu üzerine yazılar yazıyor.