🐳
+
🚀
+
⚙️

Docker ile Laravel Projesi Dağıtımı

Modern DevOps pratikleri ile Laravel uygulamalarınızı Docker container'ları kullanarak güvenli ve ölçeklenebilir şekilde dağıtın

Modern yazılım geliştirmede containerization ve CI/CD pipeline'ları, uygulamaların güvenilir şekilde dağıtılması için vazgeçilmez hale gelmiştir. Bu kapsamlı rehberde, Laravel projelerinizi Docker ile nasıl containerize edeceğinizi ve otomatik dağıtım süreçleri kuracağınızı öğreneceksiniz.

Docker ile Laravel Geliştirmenin Avantajları

Docker, Laravel projeleriniz için tutarlı ve taşınabilir geliştirme ortamları sağlar. Bu yaklaşımın başlıca avantajları şunlardır:

🔄
Tutarlı Ortamlar

Geliştirme, test ve prodüksiyon ortamları arasında tam uyumluluk sağlar

Hızlı Dağıtım

Container'lar sayesinde saniyeler içinde uygulama dağıtımı yapabilirsiniz

🛡️
İzolasyon

Uygulamalar birbirinden izole çalışır, güvenlik ve kararlılık artar

Laravel Dockerfile Oluşturma

İlk adım olarak Laravel uygulamamız için optimize edilmiş bir Dockerfile oluşturacağız:

# Multi-stage build için PHP 8.2 FPM base image kullan FROM php:8.2-fpm-alpine AS base # Çalışma dizini ayarla WORKDIR /var/www/html # Sistem bağımlılıklarını yükle RUN apk add --no-cache \ git \ curl \ libpng-dev \ libxml2-dev \ zip \ unzip \ nodejs \ npm # PHP extension'larını yükle RUN docker-php-ext-install \ pdo \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd # Composer kurulumu COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Laravel dosyalarını kopyala COPY . . # Composer dependencies RUN composer install --no-dev --optimize-autoloader # NPM dependencies ve build RUN npm install && npm run build # Dosya izinlerini ayarla RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 /var/www/html/storage \ && chmod -R 755 /var/www/html/bootstrap/cache # Port ayarı EXPOSE 9000 # Container başlatma komutu CMD ["php-fpm"]

Docker Compose Yapılandırması

Geliştirme ortamı için Docker Compose kullanarak tüm servisleri bir arada yönetelim:

# docker-compose.yml version: '3.8' services: app: build: context: . dockerfile: Dockerfile ports: - "9000:9000" volumes: - ./:/var/www/html - /var/www/html/vendor - /var/www/html/node_modules networks: - laravel-network depends_on: - mysql - redis nginx: image: nginx:alpine ports: - "80:80" volumes: - ./:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf networks: - laravel-network depends_on: - app mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: laravel MYSQL_USER: laravel MYSQL_PASSWORD: secret volumes: - mysql-data:/var/lib/mysql networks: - laravel-network redis: image: redis:alpine networks: - laravel-network networks: laravel-network: driver: bridge volumes: mysql-data:

CI/CD Pipeline Kurulumu

Şimdi GitHub Actions kullanarak otomatik dağıtım süreçlerini kuracağız. Bu pipeline kod değişikliklerinde otomatik olarak test, build ve deploy işlemlerini gerçekleştirecek:

📥
Source Code

GitHub repository'den kod çekme

🔨
Build

Docker image oluşturma ve dependencies kurulum

🧪
Test

Unit testler ve code quality kontrolleri

🚀
Deploy

Production sunucusuna otomatik deployment

GitHub Actions Workflow

Laravel projemiz için GitHub Actions workflow dosyası oluşturalım:

# .github/workflows/deploy.yml name: Laravel Docker CI/CD on: push: branches: [main, develop] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: mbstring, xml, ctype, iconv, intl, pdo_mysql - name: Cache Composer Dependencies uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - name: Install Dependencies run: composer install --no-progress --prefer-dist --optimize-autoloader - name: Copy Environment File run: cp .env.example .env - name: Generate Application Key run: php artisan key:generate - name: Run Tests run: php artisan test build-and-deploy: needs: test runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - name: Checkout Code uses: actions/checkout@v3 - name: Build Docker Image run: | docker build -t laravel-app . docker tag laravel-app ${{ secrets.DOCKER_REGISTRY }}/laravel-app:latest - name: Push to Registry run: | echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin ${{ secrets.DOCKER_REGISTRY }} docker push ${{ secrets.DOCKER_REGISTRY }}/laravel-app:latest - name: Deploy to Server uses: appleboy/ssh-action@v0.1.7 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} script: | docker pull ${{ secrets.DOCKER_REGISTRY }}/laravel-app:latest docker-compose -f /path/to/production/docker-compose.yml up -d docker system prune -af

Production Docker Compose

Production ortamı için optimize edilmiş Docker Compose yapılandırması:

# docker-compose.prod.yml version: '3.8' services: app: image: ${DOCKER_REGISTRY}/laravel-app:latest restart: unless-stopped environment: - APP_ENV=production - APP_DEBUG=false - DB_HOST=mysql - DB_DATABASE=${DB_DATABASE} - DB_USERNAME=${DB_USERNAME} - DB_PASSWORD=${DB_PASSWORD} networks: - laravel-network depends_on: - mysql - redis nginx: image: nginx:alpine restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./docker/nginx/prod.conf:/etc/nginx/conf.d/default.conf - ./docker/ssl:/etc/ssl/certs networks: - laravel-network depends_on: - app mysql: image: mysql:8.0 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_DATABASE: ${DB_DATABASE} MYSQL_USER: ${DB_USERNAME} MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - mysql-data:/var/lib/mysql - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf networks: - laravel-network redis: image: redis:alpine restart: unless-stopped command: redis-server --appendonly yes volumes: - redis-data:/data networks: - laravel-network networks: laravel-network: driver: bridge volumes: mysql-data: redis-data:

Nginx Yapılandırması

Laravel için optimize edilmiş Nginx konfigürasyonu:

# docker/nginx/default.conf server { listen 80; server_name localhost; root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass app:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; fastcgi_read_timeout 300; } location ~ /\.ht { deny all; } location ~* \.(css|js|gif|ico|jpeg|jpg|png|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; } }

Environment Variables ve Secrets

Güvenli deployment için environment variable'lar ve secret'ların yönetimi:

GitHub Secrets Ayarlama

Repository Settings > Secrets and Variables > Actions kısmından aşağıdaki secret'ları ekleyin:

  • DOCKER_REGISTRY: Docker registry URL'i
  • DOCKER_USERNAME: Docker registry kullanıcı adı
  • DOCKER_PASSWORD: Docker registry şifresi
  • SERVER_HOST: Production sunucu IP adresi
  • SERVER_USER: SSH kullanıcı adı
  • SERVER_SSH_KEY: SSH private key

Database Migration ve Seeding

Production deployment sırasında database işlemlerini otomatik yapmak için:

# deployment-script.sh #!/bin/bash # Container'ı güncelle docker-compose pull docker-compose up -d # Migration ve cache temizleme docker-compose exec -T app php artisan migrate --force docker-compose exec -T app php artisan config:cache docker-compose exec -T app php artisan route:cache docker-compose exec -T app php artisan view:cache # Queue worker'ları yeniden başlat docker-compose restart queue-worker # Eski image'leri temizle docker system prune -af

Monitoring ve Logging

Production ortamında container'ların izlenmesi için Docker Compose'a monitoring servisleri ekleyebilirsiniz:

# monitoring eklentisi prometheus: image: prom/prometheus ports: - "9090:9090" volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana-data:/var/lib/grafana

Güvenlik Best Practices

Güvenlik Önemli Noktalar

  • Production image'lerinde --no-dev flag'ini kullanın
  • Sensitive bilgileri environment variable olarak geçirin
  • Root kullanıcı yerine dedicated user kullanın
  • Image'lerde sadece gerekli port'ları expose edin
  • Docker secrets kullanarak sensitive data yönetin

Performance Optimizasyonu

Laravel Docker container'larının performansını artırmak için:

Performance Checklist

  • Multi-stage Docker build kullanın
  • PHP OPcache'i aktifleştirin
  • Redis cache driver kullanın
  • Asset'leri CDN'e taşıyın
  • Database connection pooling yapılandırın
  • Container resource limits belirleyin

Troubleshooting

Sık karşılaşılan sorunlar ve çözümleri:

Container Loglarını İnceleme

# Tüm servislerin loglarını göster docker-compose logs -f # Sadece app container'ının loglarını göster docker-compose logs -f app # Son 100 satırı göster docker-compose logs --tail=100 app

Container İçine Bağlanma

# App container'ına shell ile bağlan docker-compose exec app /bin/sh # Laravel komutlarını çalıştır docker-compose exec app php artisan migrate:status docker-compose exec app php artisan queue:work

Sonuç

Docker ile Laravel deployment'ı, modern web geliştirmede standardı haline gelmiştir. Bu rehberle öğrendiğiniz teknikler sayesinde:

  • Tutarlı geliştirme ve production ortamları oluşturabilirsiniz
  • Otomatik CI/CD pipeline'ları ile güvenilir deploymentlar yapabilirsiniz
  • Ölçeklenebilir ve yönetilebilir uygulamalar geliştirebilirsiniz
  • DevOps best practice'lerini uygulayabilirsiniz

WebKodlama.net olarak, modern DevOps pratikleri ile Laravel projelerinizi bulutta güvenli ve performanslı şekilde yayınlamanıza yardımcı oluyoruz. Docker ve CI/CD konularında profesyonel destek almak için bizimle iletişime geçin!

Laravel Projenizi Buluta Taşımaya Hazır Mısınız?

Docker ve CI/CD ile modern deployment çözümleri için uzman ekibimizden destek alın!

Ücretsiz Danışmanlık