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:
FROM php:8.2-fpm-alpine AS base
WORKDIR /var/www/html
RUN apk add --no-cache \
git \
curl \
libpng-dev \
libxml2-dev \
zip \
unzip \
nodejs \
npm
RUN docker-php-ext-install \
pdo \
pdo_mysql \
mbstring \
exif \
pcntl \
bcmath \
gd
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . .
RUN composer install --no-dev --optimize-autoloader
RUN npm install && npm run build
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
EXPOSE 9000
CMD ["php-fpm"]
Docker Compose Yapılandırması
Geliştirme ortamı için Docker Compose kullanarak tüm servisleri bir arada yönetelim:
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:
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ı:
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:
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:
#!/bin/bash
docker-compose pull
docker-compose up -d
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
docker-compose restart queue-worker
docker system prune -af
Monitoring ve Logging
Production ortamında container'ların izlenmesi için Docker Compose'a monitoring servisleri ekleyebilirsiniz:
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
docker-compose logs -f
docker-compose logs -f app
docker-compose logs --tail=100 app
Container İçine Bağlanma
docker-compose exec app /bin/sh
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!