Takip et

Geliştirme Ortamı Kurulumu Neden Bu Kadar Zorlayıcı Olabilir?

Laravel, Nginx, MySQL: Docker Compose ile Kolay Kurulum Rehberi

Modern web geliştirme süreçlerinde, farklı bağımlılıkları ve servisleri bir araya getirmek sıklıkla karmaşık bir hal alabilir. Laravel, Nginx ve MySQL gibi popüler teknolojileri sorunsuz bir şekilde bir araya getirmek için Docker Compose, geliştiricilere güçlü ve tutarlı bir çözüm sunar. Bu rehber, sıfırdan başlayarak kendi geliştirme ortamınızı Docker Compose ile nasıl kuracağınızı adım adım açıklıyor.

Geliştirme Ortamı Kurulumu Neden Bu Kadar Zorlayıcı Olabilir?

Web geliştiricisi olarak, muhtemelen bir projenin kurulum aşamasında saatler harcadığınız durumlarla karşılaşmışsınızdır. Farklı işletim sistemlerinde çalışan ekip üyeleri, PHP versiyon uyumsuzlukları, veritabanı sürümlerinin çakışması veya Nginx gibi bir web sunucusunun doğru şekilde yapılandırılması gibi sorunlar, geliştirme sürecinin başlangıcında ciddi engeller oluşturabilir. Geleneksel yaklaşımlar, her geliştiricinin kendi makinesinde gerekli tüm yazılımları (PHP, Nginx, MySQL, Redis vb.) ayrı ayrı kurmasını gerektirir. Bu durum, “Benim makinemde çalışıyordu!” sendromuna yol açan tutarsız geliştirme ortamları yaratır.

Örneğin, bir projede PHP 7.4 kullanmanız gerekirken, başka bir projede PHP 8.1’e ihtiyaç duyabilirsiniz. Bu iki versiyonu aynı anda yönetmek, genellikle sanal makineler (VM) veya yerel kurulumlar arasında geçiş yapmakla uğraşmayı gerektirir ki bu da zaman alıcı ve hataya açık bir süreçtir. Ayrıca, her bir bağımlılığın (örneğin MySQL) farklı bir sürümünü kurmak veya yapılandırmak, özellikle yeni bir ekip üyesi projeye katıldığında ciddi bir öğrenme eğrisi ve kurulum süresi anlamına gelir. Bu tür zorluklar, geliştirme hızını düşürür ve ekip içinde gereksiz sürtüşmelere yol açabilir.

İşte tam da bu noktada, konteyner teknolojileri ve özellikle Docker Compose devreye giriyor. Docker Compose, tüm bu bağımlılıkları izole edilmiş, taşınabilir ve tutarlı bir ortamda bir araya getirme imkanı sunar. Böylece, her geliştiricinin aynı ortamda çalışmasını sağlayarak “benim makinemde çalışıyor” sorununu ortadan kaldırır. Bu rehberde, Laravel, Nginx ve MySQL’i Docker Compose ile nasıl entegre edeceğimizi adım adım öğrenecek, böylece geliştirme süreçlerinizi daha verimli ve sorunsuz hale getireceksiniz. Bu yaklaşım, sadece kurulumu kolaylaştırmakla kalmaz, aynı zamanda projenizin gelecekteki ölçeklenebilirliği ve bakımı için de sağlam bir temel oluşturur.

Temel Kavramlar: Docker, Docker Compose ve Konteynerleşme Nedir?

Docker ve Docker Compose, modern yazılım geliştirme dünyasında devrim yaratan araçlardır. Konteynerleşme, uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir birimler halinde paketlemeyi sağlayan bir teknolojidir. Geleneksel sanal makineler (VM) tüm bir işletim sistemini taklit ederken, Docker konteynerleri yalnızca uygulamanın çalışması için gerekli olan işletim sistemi katmanlarını paylaşır. Bu durum, konteynerleri çok daha hafif, hızlı ve verimli hale getirir. Bir konteyner, uygulamanızın çalışması için gereken tüm kod, çalışma zamanı, sistem araçları, sistem kütüphaneleri ve ayarları içeren standartlaştırılmış bir birimdir.

Docker, bu konteynerleri oluşturmak, dağıtmak ve yönetmek için kullanılan açık kaynaklı bir platformdur. Bir Dockerfile kullanarak, uygulamanızın nasıl oluşturulacağını ve hangi bağımlılıklara sahip olduğunu tanımlarsınız. Docker, bu Dockerfile‘ı kullanarak bir imaj oluşturur. İmajlar, konteynerlerin temelini oluşturan şablonlardır. Bir imajdan birden fazla konteyner çalıştırabilirsiniz. Bu sayede, uygulamanızın her ortamda (geliştirme, test, üretim) aynı şekilde davranmasını garanti altına alırsınız.

Peki, Docker Compose nedir? Çoğu modern uygulama tek bir hizmetten oluşmaz. Örneğin, bir Laravel uygulaması genellikle bir PHP-FPM servisi, bir Nginx web sunucusu ve bir MySQL veritabanı gerektirir. Bu farklı servislerin her birini ayrı ayrı Docker komutlarıyla yönetmek karmaşık olabilir. İşte bu noktada Docker Compose devreye girer. Docker Compose, çoklu konteyner Docker uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. Tek bir YAML dosyası (genellikle docker-compose.yml) kullanarak, uygulamanızın tüm servislerini, ağlarını ve depolama birimlerini (volumes) tanımlayabilirsiniz. Tek bir komutla (docker compose up), Compose dosyasında tanımlanan tüm servisleri başlatabilir, durdurabilir veya yeniden oluşturabilirsiniz.

Bu üçlü (Laravel, Nginx, MySQL) genellikle LEMP (Linux, Nginx, MySQL, PHP) yığınının bir parçasıdır. Nginx, hızlı ve yüksek performanslı bir web sunucusudur; gelen HTTP isteklerini karşılar ve bunları PHP-FPM’e yönlendirir. PHP-FPM (FastCGI Process Manager), PHP kodunu yorumlayan ve çalıştıran bir arayüzdür. MySQL ise uygulamanızın verilerini depolayan ilişkisel bir veritabanı sistemidir. Docker Compose ile bu bileşenlerin her birini kendi izole konteynerlerinde çalıştırabilir, böylece birbirleriyle çakışmadan ve daha güvenli bir şekilde iletişim kurmalarını sağlayabilirsiniz. Bu yapı, hem geliştirme ortamında tutarlılığı artırır hem de uygulamanızın dağıtımını basitleştirir.

Adım Adım Kurulum: Projemizi Dockerize Etmeye Başlıyoruz

Laravel, Nginx ve MySQL’i Docker Compose ile kurmak için öncelikle bilgisayarınızda Docker’ın kurulu olması gerekmektedir. Eğer kurulu değilse, işletim sisteminize uygun Docker Desktop (Windows ve macOS için) veya Docker Engine’i (Linux için) Docker’ın resmi web sitesinden indirip kurmanız gerekmektedir. Kurulum tamamlandıktan sonra, terminalinizde docker --version ve docker compose version komutlarını çalıştırarak Docker ve Docker Compose’un doğru şekilde yüklendiğinden emin olabilirsiniz. Bu adım, tüm sürecin temelini oluşturur ve sorunsuz bir başlangıç için kritik öneme sahiptir.

Kuruluma başlamadan önce, projemiz için bir klasör oluşturalım. Örneğin, laravel-docker adında bir klasör açabiliriz. Bu klasörün içinde, Docker Compose ile ilgili tüm dosyalarımızı ve Laravel projemizi barındıracağız. Temiz bir yapılandırma için, bu klasörün içinde aşağıdaki gibi bir dizin yapısı oluşturmak faydalı olacaktır:


laravel-docker/
├── docker-compose.yml
├── nginx/
│   └── default.conf
└── app/ (Laravel projemiz burada olacak)
    

Bu yapılandırma, hem düzenli bir görünüm sağlar hem de farklı servislerin ayarlarını kolayca yönetmenize olanak tanır. nginx klasörü, web sunucumuz Nginx’in yapılandırma dosyasını içerecekken, app klasörü ise Laravel projemizin tüm dosyalarını barındıracaktır. Şimdi, bu dosyaları adım adım oluşturalım ve her birinin ne işe yaradığını açıklayalım. Bu aşamada, her bir bileşenin kendi rolünü anlamak, olası sorunları gidermenize ve gelecekteki yapılandırmaları daha iyi yönetmenize yardımcı olacaktır.

Docker Compose Dosyamızı Oluşturma: docker-compose.yml

docker-compose.yml dosyası, uygulamanızın tüm servislerini tanımladığımız merkezi bir yapılandırma dosyasıdır. Bu dosya, Docker Compose’a hangi konteynerlerin çalıştırılacağını, nasıl yapılandırılacağını ve birbirleriyle nasıl iletişim kuracaklarını anlatır. Projemizin ana dizininde (laravel-docker/) bu dosyayı oluşturalım:


version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: laravel_app
    restart: always
    volumes:
      - ./app:/var/www/html
    networks:
      - laravel_network

  nginx:
    image: nginx:stable-alpine
    container_name: laravel_nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    networks:
      - laravel_network

  mysql:
    image: mysql:8.0
    container_name: laravel_mysql
    restart: always
    environment:
      MYSQL_DATABASE: laravel_db
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_password
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - laravel_network

volumes:
  mysql_data:

networks:
  laravel_network:
    driver: bridge
    

Bu dosyadaki anahtar bölümleri inceleyelim:

  • version: '3.8': Docker Compose dosyasının versiyonunu belirtir.
  • services: Uygulamamızın bağımsız servislerini tanımladığımız bölümdür: app (PHP-FPM), nginx ve mysql.
  • app servisi: Dockerfile‘dan oluşturulur, yerel ./app klasörünü konteyner içindeki /var/www/html‘e bağlar ve laravel_network ağına dahil olur.
  • nginx servisi: Resmi nginx:stable-alpine imajını kullanır, yerel 80. portu konteynerin 80. portuna yönlendirir ve Laravel projemize ile Nginx yapılandırma dosyasına erişim sağlar. app servisine bağımlıdır.
  • mysql servisi: Resmi mysql:8.0 imajını kullanır, ortam değişkenleri ile veritabanı ayarlarını yapar, verilerin kalıcılığı için mysql_data isimlendirilmiş bir volume kullanır ve yerel 3306. portu konteynerin 3306. portuna yönlendirir.
  • volumes: Tanımlanmış volume’ları listeler (mysql_data).
  • networks: Servislerin iletişim kurması için özel bir ağ tanımlarız (laravel_network).

Bu yapılandırma, tüm bileşenlerin izole bir ortamda sorunsuz bir şekilde çalışmasını ve birbirleriyle güvenli bir şekilde iletişim kurmasını sağlar. Özellikle volumes kullanımı, geliştirme sürecinde yaptığınız kod değişikliklerinin anında yansımasını ve veritabanı verilerinizin kalıcılığını garanti eder.

Nginx Konfigürasyonu: nginx/default.conf

Nginx, web sunucusu olarak görev yapacak ve gelen HTTP isteklerini PHP-FPM konteynerimize yönlendirecektir. Bu nedenle, Laravel projemiz için özel bir Nginx yapılandırması oluşturmamız gerekiyor. laravel-docker/nginx/ klasörünün içine default.conf adında bir dosya oluşturun ve aşağıdaki içeriği ekleyin:


server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
    

Bu yapılandırma dosyasındaki önemli noktalar şunlardır:

  • listen 80;: Nginx’in 80. portu dinlemesini sağlar.
  • root /var/www/html/public;: Laravel projemizin public dizinini web kök dizini olarak ayarlar.
  • location / { ... }: Gelen tüm istekleri Laravel’in index.php dosyasına yönlendirir.
  • location ~ \.php$ { ... }: PHP dosyalarına gelen istekleri app:9000 adresindeki PHP-FPM servisine yönlendirir. app, docker-compose.yml dosyamızda tanımladığımız PHP servisinin adıdır.

Bu Nginx yapılandırması, Laravel uygulamanızın HTTP isteklerini doğru şekilde işlemesini ve PHP kodunuzun PHP-FPM tarafından yürütülmesini sağlar. Güvenlik başlıkları da eklenerek temel güvenlik önlemleri alınmıştır.

PHP FPM İçin Dockerfile Oluşturma

PHP-FPM konteynerimiz için özel bir Dockerfile oluşturmamız gerekecek. Bu dosya, PHP’nin hangi sürümünü kullanacağımızı, hangi eklentilerin yükleneceğini ve Composer gibi ek araçların nasıl kurulacağını tanımlar. laravel-docker/ dizininin içine (docker-compose.yml ile aynı seviyede) Dockerfile adında bir dosya oluşturun ve aşağıdaki içeriği ekleyin:


FROM php:8.2-fpm-alpine

RUN apk add --no-cache \
    git \
    curl \
    libpng \
    libjpeg-turbo \
    libwebp \
    freetype \
    libzip \
    icu-dev \
    libpq \
    libxml2-dev \
    oniguruma-dev \
    openssl-dev \
    gmp-dev \
    zip \
    unzip \
    && docker-php-ext-install -j$(nproc) \
        pdo_mysql \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        intl \
        zip \
        gmp \
        opcache \
    && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
    && rm -rf /var/cache/apk/*

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

EXPOSE 9000
CMD ["php-fpm"]
    

Bu Dockerfile‘ı adım adım inceleyelim:

  • FROM php:8.2-fpm-alpine: Temel imaj olarak PHP 8.2 FPM’in Alpine Linux tabanlı sürümünü kullanırız.
  • RUN apk add --no-cache ...: Alpine Linux’un paket yöneticisi apk kullanarak gerekli sistem bağımlılıklarını yükleriz.
  • && docker-php-ext-install ...: Laravel için gerekli olan pdo_mysql, mbstring, gd, bcmath gibi PHP eklentilerini kurarız.
  • COPY --from=composer:latest /usr/bin/composer /usr/bin/composer: Composer’ı ayrı bir imajdan kopyalayarak kurarız.
  • WORKDIR /var/www/html: Konteyner içindeki çalışma dizinini Laravel projemizin bulunacağı yere ayarlarız.
  • EXPOSE 9000: PHP-FPM’in 9000 portunda dinleyeceğini belirtiriz.
  • CMD ["php-fpm"]: Konteyner başlatıldığında çalıştırılacak varsayılan komutu belirleriz.

Bu Dockerfile, Laravel projenizin ihtiyaç duyduğu tüm PHP bağımlılıklarını ve araçlarını içeren sağlam bir PHP-FPM ortamı sağlar. Geliştirme sürecinde ihtiyaç duyabileceğiniz ek PHP eklentileri olursa, bu dosyaya kolayca ekleyebilirsiniz.

Laravel Projemizi Hazırlama

Artık Docker Compose ve Nginx yapılandırmalarımız hazır olduğuna göre, Laravel projemizi oluşturabiliriz. Eğer mevcut bir Laravel projeniz varsa, onu laravel-docker/app/ dizinine taşıyabilirsiniz. Eğer sıfırdan bir proje oluşturacaksanız, aşağıdaki adımları izleyebilirsiniz. İlk olarak, laravel-docker dizinine gidin ve app klasörünü oluşturun:


mkdir app
    

Daha sonra, Docker Compose servislerini kullanarak Laravel projesini app klasörünün içine kuracağız. Bunun için docker compose run --rm app composer create-project laravel/laravel . komutunu kullanacağız. Bu komut, geçici olarak app servisini çalıştırır, Composer’ı kullanarak Laravel projesini oluşturur ve işlem bittikten sonra servisi durdurur ve siler:


docker compose run --rm app composer create-project laravel/laravel .
    

Bu komut, app klasörünün içine yeni bir Laravel projesi kuracaktır. Kurulum tamamlandıktan sonra, Laravel projenizin kök dizininde (laravel-docker/app/) bulunan .env dosyasını düzenlemeniz gerekecektir. Bu dosya, veritabanı bağlantı bilgilerini ve diğer ortam değişkenlerini içerir. .env dosyasını açın ve aşağıdaki satırları Docker Compose yapılandırmamızla eşleşecek şekilde güncelleyin:


DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_password
    

DB_HOST değerini mysql olarak ayarladığımıza dikkat edin. Bu, Docker Compose ağında MySQL servisimizin adıdır. Son olarak, Laravel uygulamanız için bir uygulama anahtarı oluşturmanız gerekmektedir:


docker compose exec app php artisan key:generate
    

Bu komut, app servisi içindeki PHP-FPM konteynerinde php artisan key:generate komutunu çalıştırır ve .env dosyanıza otomatik olarak yeni bir uygulama anahtarı ekler. Artık Laravel projemiz Docker Compose ortamımızda çalışmaya hazır.

Sistemimizi Başlatma ve Test Etme: Her Şey Yolunda mı?

Tüm yapılandırma dosyalarımızı oluşturup Laravel projemizi hazırladığımıza göre, artık sistemimizi başlatabilir ve her şeyin düzgün çalıştığından emin olabiliriz. laravel-docker ana dizininde (docker-compose.yml dosyasının bulunduğu yer) terminalinizi açın ve aşağıdaki komutu çalıştırın:


docker compose up -d
    

Bu komut, docker-compose.yml dosyasında tanımlanan tüm servisleri (app, nginx, mysql) arka planda başlatacaktır. İlk çalıştırmada Docker, gerekli imajları indirecek ve Dockerfile‘ımızı kullanarak app servisi için bir imaj oluşturacaktır. Bu işlem biraz zaman alabilir, ancak sonraki çalıştırmalarda çok daha hızlı olacaktır.

Servisler başarıyla başlatıldıktan sonra, çalışan konteynerlerin durumunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:


docker compose ps
    

Bu komut, tüm servislerin Up (çalışıyor) durumda olduğunu göstermelidir. Herhangi bir servis Exit durumundaysa, bir sorun olduğu anlamına gelir ve docker compose logs <servis_adı> komutu ile ilgili servisin loglarını kontrol ederek hatayı ayıklayabilirsiniz.

Her şey yolundaysa, web tarayıcınızı açın ve http://localhost adresine gidin. Laravel’in hoş geldiniz sayfasını görmeniz gerekmektedir. Bu, Nginx’in doğru çalıştığını, PHP-FPM ile iletişim kurduğunu ve Laravel uygulamanızın başarılı bir şekilde sunulduğunu gösterir.

Son olarak, veritabanı bağlantımızın da doğru çalıştığından emin olmalıyız. Laravel’in veritabanı migrasyonlarını çalıştırmak için app servisi içinde aşağıdaki komutu kullanacağız:


docker compose exec app php artisan migrate
    

Bu komut, app konteynerinin içine girerek php artisan migrate komutunu çalıştırır. Eğer migrasyonlar başarıyla çalışırsa, veritabanı bağlantınızın ve yapılandırmanızın doğru olduğu anlamına gelir. Herhangi bir hata alırsanız, .env dosyanızdaki veritabanı bilgilerini veya docker-compose.yml dosyasındaki MySQL ortam değişkenlerini kontrol etmeniz gerekebilir. Bu adımlar, geliştirme ortamınızın tam olarak işlevsel olduğunu doğrulamak için kritik öneme sahiptir. Artık Laravel projenizde geliştirme yapmaya başlayabilirsiniz!

Gerçek Dünya Senaryosu: Geliştirme ve Dağıtım Ortamları Arasındaki Tutarlılık

Bir yazılım projesinde çalışırken karşılaşılan en büyük zorluklardan biri, geliştirme ortamı ile test veya üretim ortamları arasındaki farklılıklardır. “Benim makinemde çalışıyordu!” cümlesi, genellikle bu tutarsızlıkların bir sonucudur. Örneğin, bir geliştirici projesini kendi yerel makinesinde PHP 7.4 ile test ederken, üretim sunucusu PHP 8.1 kullanıyor olabilir. Bu tür versiyon farklılıkları, beklenmedik hatalara ve dağıtım sorunlarına yol açabilir. Bu durum, özellikle büyük ekiplerde veya farklı işletim sistemlerini kullanan geliştiriciler arasında daha da karmaşık hale gelir.

Vaka Analizi: Farklı İşletim Sistemlerinde Çalışan Bir Ekip

Bir yazılım geliştirme ekibinin beş kişiden oluştuğunu ve bu kişilerin farklı işletim sistemleri (macOS, Windows, Linux) kullandığını düşünelim. Proje, Laravel, Nginx ve MySQL kullanıyor. Docker Compose öncesinde, her geliştiricinin kendi işletim sisteminde PHP, Nginx ve MySQL’i ayrı ayrı kurması gerekiyordu. Bu, farklı paket yöneticileri, versiyonlar ve yapılandırmalarla uğraşmayı gerektiriyordu. Sonuç olarak, yeni bir geliştiricinin projeye başlaması günler sürebiliyor, versiyon uyumsuzlukları nedeniyle kod birinin makinesinde çalışırken diğerinde çalışmayabiliyordu.

Docker Compose ile bu senaryo tamamen değişir. Ekip, sadece Docker Desktop’ı kurar ve projenin docker-compose.yml, Dockerfile ve Nginx yapılandırma dosyalarını kopyalar. Ardından tek bir docker compose up -d komutu ile tüm ekip, tamamen aynı, izole edilmiş ve tutarlı bir geliştirme ortamına sahip olur. İşletim sistemi ne olursa olsun, PHP versiyonu, Nginx yapılandırması ve MySQL sürümü her geliştirici için aynıdır. Bu yaklaşım, geliştirme sürecini önemli ölçüde hızlandırır ve hataları azaltır.

Ayrıca, bu tutarlılık sadece geliştirme ortamıyla sınırlı kalmaz. Docker imajları, geliştirme, test ve hatta üretim ortamları arasında taşınabilir olduğundan, uygulamanızın her aşamada aynı şekilde davranmasını sağlar. Bu, CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) süreçlerine entegrasyonu da kolaylaştırır. Bir CI/CD pipeline’ında, aynı Docker Compose dosyası veya Docker imajları kullanılarak otomatik testler çalıştırılabilir ve uygulama üretim ortamına dağıtılabilir. Böylece, geliştirme sırasında keşfedilen hataların üretimde yeniden ortaya çıkma riski minimize edilir ve dağıtım süreçleri çok daha güvenilir hale gelir. Docker Compose, modern yazılım geliştirme ve dağıtım stratejilerinin temel taşlarından biri haline gelmiştir.

İleri Düzey İpuçları ve Optimizasyonlar: Performans ve Güvenlik İçin Neler Yapabiliriz?

Docker Compose ile temel bir Laravel ortamı kurmak harika bir başlangıçtır, ancak geliştirme ve potansiyel olarak üretim ortamlarında daha iyi performans, güvenlik ve esneklik sağlamak için bazı ileri düzey ipuçları ve optimizasyonlar bulunmaktadır. Bu öneriler, projenizin daha sağlam ve verimli olmasına yardımcı olacaktır.

Veritabanı Verilerinin Kalıcılığı ve Yedekleme

docker-compose.yml dosyamızda MySQL için bir named volume (mysql_data) kullandık. Bu, konteyner silinse bile verilerin kalıcı olmasını sağlar. Volume’ların yerel diskinizde nerede depolandığını docker volume inspect mysql_data komutuyla öğrenebilirsiniz. Ayrıca, veritabanı yedeklemelerini otomatikleştirmek için cron işleri veya harici yedekleme araçları kullanmayı düşünebilirsiniz.

Ortam Değişkenleri Yönetimi

Hassas bilgiler (API anahtarları, veritabanı şifreleri) doğrudan docker-compose.yml dosyasına yazılmamalıdır. Bunun yerine, Laravel’in .env dosyasını kullanmak veya Docker Compose’un kendi .env dosyasını (docker-compose.env gibi) kullanarak ortam değişkenlerini yönetmek daha güvenlidir. Örneğin, docker-compose.yml dosyasında env_file: .env veya env_file: .env.production gibi bir ifade kullanabilirsiniz. Bu, hassas bilgilerin versiyon kontrol sistemine (Git) yanlışlıkla eklenmesini engeller.

Nginx Caching ve Performans Optimizasyonu

Nginx, statik dosyalar (CSS, JS, resimler) için güçlü bir önbellekleme mekanizmasına sahiptir. nginx/default.conf dosyanıza aşağıdaki gibi bir yapılandırma ekleyerek performansı artırabilirsiniz:


location ~* \.(jpg|jpeg|gif|png|webp|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    access_log off;
}
    

Bu, tarayıcıların statik varlıkları belirli bir süre boyunca önbelleğe almasını sağlayarak sunucu üzerindeki yükü azaltır ve sayfa yükleme sürelerini iyileştirir.

Geliştirme Ortamı İçin Docker Compose Watch

Docker Compose v2.20.0 ve sonrası ile gelen docker compose watch komutu, geliştirme sürecinizi kolaylaştırabilir. Bu komut, kaynak kodunuzdaki değişiklikleri otomatik olarak algılar ve ilgili servisleri yeniden başlatır veya yeniden oluşturur. Örneğin, docker compose watch komutunu kullanarak, Laravel kodunuzda yaptığınız değişikliklerin otomatik olarak PHP-FPM konteynerine yansımasını sağlayabilirsiniz. Bu, her değişiklikten sonra manuel olarak docker compose up -d çalıştırma ihtiyacını ortadan kaldırır.

Güvenlik İpuçları

  • En Düşük Ayrıcalık Prensibi: Konteynerleri root kullanıcısı olarak çalıştırmaktan kaçının. Dockerfile içinde özel bir kullanıcı oluşturup uygulamayı bu kullanıcıyla çalıştırmak güvenlik risklerini azaltır.
  • Açık Portları Sınırlandırın: Üretim ortamında, yalnızca kesinlikle gerekli olan portları dışarıya açın.
  • Güncel İmajlar Kullanın: Her zaman Docker imajlarının en güncel ve güvenli sürümlerini kullanmaya özen gösterin.

Bu ileri düzey ipuçları, Docker Compose ile kurduğunuz geliştirme ortamını daha güçlü, daha güvenli ve daha verimli hale getirmenize yardımcı olacaktır. Projenizin büyüklüğüne ve gereksinimlerine göre bu optimizasyonları uygulayarak daha iyi bir geliştirme deneyimi elde edebilirsiniz.

Sonuç: Modern Web Geliştirmede Docker Compose’un Yeri

Bu kapsamlı rehber boyunca, Laravel, Nginx ve MySQL’i Docker Compose ile sıfırdan nasıl kuracağımızı adım adım inceledik. Konteynerleşmenin temel prensiplerinden başlayarak, docker-compose.yml, Nginx yapılandırması ve PHP-FPM Dockerfile‘ı oluşturmaya kadar tüm süreci detaylandırdık. Ayrıca, geliştirme ortamını başlatma, test etme ve gerçek dünya senaryolarında sağladığı tutarlılık avantajlarını ele aldık. Son olarak, performansı artırmak ve güvenliği sağlamak için ileri düzey ipuçlarını ve optimizasyonları paylaştık.

Docker Compose, modern web geliştirme süreçlerinde vazgeçilmez bir araç haline gelmiştir. Geliştirme ortamı kurulumunun karmaşıklığını ortadan kaldırarak, “benim makinemde çalışıyordu” sorununu tarihe karıştırır. Ekip üyeleri arasında tutarlı ve izole edilmiş ortamlar sağlayarak işbirliğini kolaylaştırır, yeni ekip üyelerinin projeye katılımını hızlandırır ve genel geliştirme verimliliğini artırır. Ayrıca, geliştirme ve üretim ortamları arasındaki tutarlılığı garantileyerek dağıtım süreçlerini daha güvenilir hale getirir.

Konteyner teknolojilerinin sağladığı bu esneklik ve verimlilik, geliştiricilere sadece kod yazmaya odaklanma imkanı sunar. Artık karmaşık bağımlılık sorunlarıyla boğuşmak yerine, yenilikçi çözümler üretmeye daha fazla zaman ayırabilirsiniz. Laravel, Nginx ve MySQL üçlüsünü Docker Compose ile yönetmek, projelerinizi daha ölçeklenebilir, bakımı daha kolay ve geleceğe daha hazır hale getirir. Bu rehberin, kendi Docker Compose tabanlı Laravel geliştirme ortamınızı başarıyla kurmanızda size yol gösterdiğini umuyoruz. Konteynerleşmenin sunduğu gücü keşfetmeye devam edin!

Sıkça Sorulan Sorular

  1. Docker Compose neden tercih edilmeli?

    Docker Compose, farklı servislerden oluşan karmaşık uygulamaları tek bir komutla yönetme imkanı sunar. Geliştirme ortamlarının kurulumunu basitleştirir, “benim makinemde çalışıyor” sorununu ortadan kaldırır, ekip üyeleri arasında tutarlılık sağlar ve uygulamanızın farklı ortamlarda (geliştirme, test, üretim) aynı şekilde çalışmasını garanti eder.

  2. Veritabanı verilerim kaybolur mu?

    Hayır, docker-compose.yml dosyasında tanımladığımız mysql_data gibi named volume‘lar sayesinde veritabanı verileriniz kalıcı olarak depolanır. Konteyner silinse veya yeniden oluşturulsa bile verileriniz güvende kalır. Ancak, yine de düzenli yedekleme yapmak en iyi uygulamadır.

  3. Üretim ortamında da Docker Compose kullanmalı mıyım?

    Docker Compose, küçük ve orta ölçekli üretim ortamları için kullanılabilir olsa da, büyük ölçekli ve yüksek kullanılabilirlik gerektiren üretim ortamları için Kubernetes gibi daha gelişmiş konteyner orkestrasyon araçları daha uygun olabilir. Docker Compose, daha çok tek sunuculu dağıtımlar veya geliştirme ortamları için tasarlanmıştır. Ancak, üretim ortamında da Docker imajlarının kullanılması, geliştirme ve üretim arasındaki tutarlılığı sağlar.

  4. Laravel projemde Composer paketlerini nasıl kurarım?

    Laravel projenizde yeni Composer paketleri kurmak veya mevcutları güncellemek için docker compose exec app composer install veya docker compose exec app composer update komutlarını kullanabilirsiniz. Bu komutlar, PHP-FPM konteyneri içinde Composer’ı çalıştırır.

  5. Hata ayıklama (debugging) nasıl yapılır?

    Docker Compose ortamında hata ayıklama için Xdebug gibi araçları PHP-FPM Dockerfile‘ınıza ekleyebilir ve IDE’nizi (örneğin VS Code veya PhpStorm) Xdebug ile entegre edebilirsiniz. Bu, kodunuzda adım adım ilerlemenizi ve değişken değerlerini incelemenizi sağlar. Xdebug yapılandırması php.ini dosyasına eklenmelidir ve docker-compose.yml dosyasında ilgili portların açılması gerekebilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.