Ömer Kaymak
EN
Hakkımda Hizmetler Portfolyo Blog İletişim Projenizi Konuşalım
Blog / laravel-uygulamalarini-docker-ile-guvenli-uretim-ortamina-tasima
DevOps

Laravel Uygulamalarını Docker ile Güvenli Üretim Ortamına Taşıma

Ö
Ömer Kaymak
kaymak.dev
21 Haziran 2026 8 dk okuma

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 .dockerignore dosyası 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ı: .env dosyanızda veya Docker Compose environment kı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: storage ve bootstrap/cache dizinlerinin www-data kullanıcısı tarafından yazılabilir olduğundan emin olun. Dockerfile içinde bunu hallettik.

Adım 3: Üretim Ortamı İçin Optimizasyonlar

  • Küçük İmajlar: alpine tabanlı 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:cache komutları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 root olmayan bir kullanıcı ile çalıştırmak güvenlik açısından önemlidir. Dockerfile iç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 -f komutu 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!

Ö
Ömer Kaymak
Full-Stack & AI Engineer · kaymak.dev

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.