Takip et

Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmalısınız?

Docker Compose ile Laravel, Nginx ve MySQL Kurulumu: Adım Adım Rehber

Modern web geliştirme süreçlerinde, projelerin farklı ortamlar arasında tutarlı bir şekilde çalışmasını sağlamak en büyük zorluklardan biridir. “Benim bilgisayarımda çalışıyordu!” cümlesiyle sıkça karşılaşıyorsanız, bu sorunlara kesin ve kalıcı bir çözüm arayışında olabilirsiniz. İşte bu noktada Docker Compose, Laravel, Nginx ve MySQL üçlüsünü bir araya getirerek, geliştirme ortamınızı standartlaştırmanın ve verimli hale getirmenin anahtarını sunar. Bu kapsamlı rehberde, sıfırdan başlayarak bu güçlü teknolojileri Docker Compose ile nasıl entegre edeceğinizi adım adım öğrenecek, böylece projenizin her yerde sorunsuz çalışmasını garanti altına alacaksınız.

Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmalısınız?

Web uygulamaları geliştirirken, projenin bağımlılıklarını yönetmek ve farklı geliştiricilerin makinelerinde aynı ortamı sağlamak genellikle karmaşık bir süreçtir. Geleneksel yöntemlerle, her geliştiricinin kendi bilgisayarına PHP, Nginx, MySQL gibi servisleri manuel olarak kurması gerekir ki bu da sürüm farklılıkları, uyumluluk sorunları ve zaman kaybına yol açabilir. İşte tam da bu noktada konteyner teknolojileri, özellikle de Docker ve Docker Compose, devreye girerek bu sorunlara modern ve etkili çözümler sunar.

Docker, uygulamaları ve tüm bağımlılıklarını izole edilmiş, taşınabilir birimler olan “konteynerler” içine paketlemenizi sağlar. Bu konteynerler, uygulamanızın her ortamda (geliştirme, test, üretim) aynı şekilde çalışmasını garanti eder. Laravel projenizi Docker konteynerlerine taşıdığınızda, artık PHP sürümü, uzantılar veya sunucu konfigürasyonu gibi konularda endişelenmenize gerek kalmaz. Her şey konteyner içinde standartlaştırılmıştır. Ayrıca, farklı projeler için farklı PHP versiyonlarına veya veritabanı sunucularına ihtiyaç duyduğunuzda, Docker sayesinde bu ortamları birbirine karıştırmadan kolayca yönetebilirsiniz. Örneğin, bir projeniz PHP 7.4 ile çalışırken, diğer projeniz PHP 8.2 gerektirebilir. Docker bu senaryoyu sorunsuz bir şekilde ele alır.

Docker Compose ise, birden fazla Docker konteynerini içeren uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Laravel uygulamaları genellikle bir PHP-FPM servisi, bir Nginx web sunucusu ve bir MySQL veritabanı servisi gibi birden çok bileşenden oluşur. Docker Compose, bu servislerin tamamını tek bir YAML dosyası içinde tanımlamanıza olanak tanır. Bu sayede, tek bir komutla tüm uygulama yığınını (stack) ayağa kaldırabilir, durdurabilir veya yeniden başlatabilirsiniz. Bu, özellikle yeni bir geliştiricinin projeye başlaması veya mevcut bir projenin farklı bir makinede kurulması gerektiğinde kurulum sürecini dakikalara indirir. Karmaşık bağımlılıkların manuel olarak kurulması yerine, sadece Docker ve Docker Compose’u kurmak yeterli olur. Bu, hem zaman kazandırır hem de hata yapma olasılığını minimize eder. Ayrıca, geliştirme ortamının üretim ortamına mümkün olduğunca yakın olmasını sağlayarak, beklenmedik sorunların ortaya çıkmasını engeller. Bu yaklaşım, modern DevOps pratiklerinin temelini oluşturur ve yazılım geliştirme süreçlerinde verimliliği önemli ölçüde artırır.

Hazırlık Aşaması: Gerekli Araçlar Nelerdir ve Proje Yapısı Nasıl Olmalı?

Bu rehbere başlamadan önce bilgisayarınızda bazı temel araçların yüklü olması gerekmektedir. Bu araçlar, Docker ekosistemini kullanabilmeniz ve Laravel projenizi yönetebilmeniz için olmazsa olmazlardır. İlk ve en önemli gereksinim, tabii ki Docker’dır. Docker Desktop, Windows ve macOS kullanıcıları için hem Docker Engine’i hem de Docker Compose’u (eski versiyonlarda ayrı bir kurulumdu, yeni versiyonlarda entegre) tek bir pakette sunan kullanıcı dostu bir çözümdür. Linux kullanıcıları ise Docker Engine ve Docker Compose’u ayrı ayrı kurmalıdır. Kurulum talimatları için Docker’ın resmi web sitesini ziyaret edebilirsiniz. Kurulumun başarılı olup olmadığını kontrol etmek için terminalinizde docker --version ve docker compose version komutlarını çalıştırabilirsiniz. Bu komutlar, yüklü Docker ve Docker Compose versiyonlarını göstermelidir.

İkinci olarak, Laravel projemizi oluşturmak veya mevcut bir Laravel projesini kullanmak için Composer’a ihtiyacımız olacak. Eğer henüz bir Laravel projeniz yoksa, Composer yüklü bir sistemde aşağıdaki komutla yeni bir Laravel projesi oluşturabilirsiniz:


composer create-project laravel/laravel my-laravel-app
cd my-laravel-app
    

Bu komut, my-laravel-app adında yeni bir Laravel projesi oluşturacak ve sizi proje dizinine yönlendirecektir. Eğer mevcut bir projeniz varsa, o projenin ana dizinine gidin. Tüm Docker konfigürasyon dosyalarımızı bu ana dizinde oluşturacağız.

Proje yapısı açısından, ana Laravel dizininizde aşağıdaki gibi bir yapı hedefliyoruz:


my-laravel-app/
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── tests/
├── vendor/
├── .env
├── .env.example
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── webpack.mix.js
├── docker-compose.yml  

docker-compose.yml dosyası, tüm servislerimizin tanımlanacağı ana konfigürasyon dosyası olacak. docker/ dizini altında ise, Nginx ve PHP için özel Dockerfile'ları ve Nginx konfigürasyonlarını tutacağız. Bu yapı, hem düzenli bir organizasyon sağlar hem de farklı servislerin konfigürasyonlarını kolayca yönetmenize olanak tanır. Böylece, projenizin Docker entegrasyonu daha anlaşılır ve sürdürülebilir hale gelir. Bu hazırlık adımları, sorunsuz bir kurulum deneyimi için kritik öneme sahiptir.

Uzman İpucu: Docker Desktop'ı kurduktan sonra, sistem kaynaklarını (RAM, CPU) Docker için ayırmayı unutmayın. Varsayılan ayarlar küçük projeler için yeterli olsa da, daha büyük veya yoğun uygulamalar için bu ayarları artırmak performansı önemli ölçüde iyileştirecektir. Ayrıca, Docker'ın Windows'ta WSL 2 tabanlı çalışmasını sağlamak, dosya sistemi performansını artırır.

Docker Compose Dosyasını Oluşturma: Temel Servislerin Tanımlanması

Şimdi projemizin kalbi olacak docker-compose.yml dosyasını oluşturmaya başlayabiliriz. Bu dosya, Laravel uygulamamız için gerekli olan tüm servisleri (Nginx, PHP-FPM, MySQL) tanımlayacağımız yerdir. Proje ana dizininizde docker-compose.yml adında yeni bir dosya oluşturun ve içine aşağıdaki içeriği yapıştırın. Bu dosya, Docker Compose'a hangi konteynerlerin çalışacağını, birbirleriyle nasıl iletişim kuracaklarını ve hangi kaynakları kullanacaklarını anlatır.


version: '3.8'

services:
  # Laravel uygulamamız için PHP-FPM servisi
  app:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: laravel_app
    restart: unless-stopped
    volumes:
      - .:/var/www/html
    networks:
      - app-network

  # Nginx web sunucusu servisi
  nginx:
    image: nginx:alpine
    container_name: laravel_nginx
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - app-network

  # MySQL veritabanı servisi
  db:
    image: mysql:8.0
    container_name: laravel_mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: laravel_db
      MYSQL_ROOT_PASSWORD: root
      MYSQL_PASSWORD: password
      MYSQL_USER: laravel_user
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network

# Docker ağları tanımlaması
networks:
  app-network:
    driver: bridge

# Docker birimleri (volumes) tanımlaması
volumes:
  dbdata:
    driver: local
    

Yukarıdaki docker-compose.yml dosyasını adım adım inceleyelim:

  • version: '3.8': Docker Compose dosyasının versiyonunu belirtir. Genellikle en güncel stabil versiyonu kullanmak iyi bir uygulamadır.
  • services:: Uygulamamızın farklı bileşenlerini tanımladığımız ana bölümdür.
  • app servisi (PHP-FPM):
    • build:: Bu servisin bir Dockerfile'dan inşa edileceğini belirtir. context, Dockerfile'ın bulunduğu dizini (./docker/php) gösterirken, dockerfile ise kullanılacak Dockerfile'ın adını (Dockerfile) belirtir.
    • container_name: laravel_app: Konteyner için okunabilir bir isim atar.
    • restart: unless-stopped: Konteynerin beklenmedik bir şekilde durması durumunda otomatik olarak yeniden başlatılmasını sağlar.
    • volumes: - .:/var/www/html: Bu kısım çok önemlidir. Mevcut Laravel projemizin dizinini (.) konteyner içindeki /var/www/html dizinine bağlar. Bu sayede, yerel makinenizde yaptığınız kod değişiklikleri anında konteyner içinde de görünür hale gelir ve her değişiklik sonrası konteyneri yeniden başlatmanıza gerek kalmaz.
    • networks: - app-network: Bu servisi app-network adlı özel ağa bağlar. Bu ağ, tüm servislerin birbiriyle iletişim kurmasını sağlar.
  • nginx servisi:
    • image: nginx:alpine: Nginx için resmi Alpine tabanlı Docker imajını kullanır. Alpine, daha küçük boyutlu ve daha güvenli bir imajdır.
    • ports: - "8000:80": Yerel makinenizin 8000 portunu Nginx konteynerinin 80 portuna yönlendirir. Böylece tarayıcınızdan http://localhost:8000 adresinden uygulamanıza erişebilirsiniz.
    • volumes::
      • - .:/var/www/html: Laravel projemizin kodlarını Nginx'in de erişebilmesi için bağlar.
      • - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf: Yerel Nginx konfigürasyon dosyamızı konteyner içindeki Nginx konfigürasyon dizinine bağlar. Bu sayede Nginx'i Laravel projemize özel olarak yapılandırabiliriz.
  • db servisi (MySQL):
    • image: mysql:8.0: MySQL veritabanı için resmi 8.0 sürümünü kullanır.
    • environment:: MySQL konteyneri için ortam değişkenleri tanımlar. Bu değişkenler, veritabanı adı, root şifresi, kullanıcı adı ve şifresi gibi bilgileri içerir. Laravel'in .env dosyasındaki veritabanı bağlantı bilgilerini bu değerlerle eşleştirmemiz gerekecek.
    • volumes: - dbdata:/var/lib/mysql: Bu, veritabanı verilerinin kalıcılığını sağlayan kritik bir adımdır. dbdata adında bir Docker volume'u oluşturur ve MySQL'in veri dizinini bu volume'a bağlar. Konteyner silinse bile veritabanı verileriniz kaybolmaz.
  • networks:: Tüm servislerimizin iletişim kuracağı app-network adlı bir köprü (bridge) ağı tanımlar.
  • volumes:: dbdata adında bir Docker volume'u tanımlar. Bu volume, MySQL verilerini saklamak için kullanılır ve konteynerler arasında veri kalıcılığı sağlar.

Bu docker-compose.yml dosyası, Laravel uygulamanızı çalıştıracak temel altyapıyı oluşturur. Bir sonraki adımda, bu servisler için özel Dockerfile'ları ve Nginx konfigürasyonunu hazırlayacağız.

Laravel Uygulamasını Konfigüre Etme: Docker Uyumlu Hale Getirme

Docker Compose dosyamızı oluşturduktan sonra, Laravel uygulamamızın konteynerler içinde doğru bir şekilde çalışabilmesi için bazı ek konfigürasyonlara ihtiyacımız var. Bu bölümde, PHP-FPM için bir Dockerfile ve Nginx için bir sanal host konfigürasyonu oluşturacağız. Bu dosyalar, docker/ dizini altında yer alacak.

PHP-FPM Dockerfile Oluşturma

Laravel, PHP-FPM (FastCGI Process Manager) ile çalışır. Bu nedenle, PHP-FPM'i içeren ve Laravel'in ihtiyaç duyduğu uzantıları barındıran özel bir Docker imajı oluşturmamız gerekiyor. Proje ana dizininizde docker/php/Dockerfile yolunda bir dosya oluşturun ve aşağıdaki içeriği ekleyin:


# PHP-FPM için temel Alpine Linux imajını kullan
FROM php:8.2-fpm-alpine

# Gerekli sistem bağımlılıklarını ve PHP uzantılarını yükle
RUN apk add --no-cache \
    autoconf \
    build-base \
    libzip-dev \
    libpng-dev \
    jpeg-dev \
    git \
    oniguruma-dev \
    postgresql-dev \
    freetype-dev \
    libxml2-dev \
    && docker-php-ext-install -j$(nproc) \
    pdo_mysql \
    mbstring \
    exif \
    pcntl \
    bcmath \
    gd \
    zip \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

# Composer'ı global olarak yükle
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Çalışma dizinini ayarla
WORKDIR /var/www/html

# İzinleri ayarla (geliştirme ortamı için)
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 775 /var/www/html/storage \
    && chmod -R 775 /var/www/html/bootstrap/cache

# PHP-FPM'i önde çalışacak şekilde yapılandır (gerekirse)
# CMD ["php-fpm"]
    

Bu Dockerfile, PHP 8.2 FPM'in Alpine versiyonunu temel alır. Bu imaj, daha küçük boyutu ve güvenlik odaklı yapısıyla konteyner ortamları için idealdir. İçerisinde Laravel'in yaygın olarak kullandığı pdo_mysql (veritabanı bağlantısı için), mbstring (çok baytlı karakter dizileri için), gd (resim işleme için) ve zip gibi PHP uzantılarını yükleriz. Ayrıca, Composer'ı da konteyner içine kopyalayarak Laravel bağımlılıklarını yönetmeyi kolaylaştırırız. Son olarak, Laravel'in storage ve bootstrap/cache dizinleri için doğru dosya izinlerini ayarlarız. Bu izinler, Laravel'in önbellek ve log dosyalarını yazabilmesi için kritik öneme sahiptir.

Nginx Konfigürasyon Dosyası Oluşturma

Nginx, gelen HTTP isteklerini PHP-FPM'e yönlendirmekten sorumlu olacak web sunucumuzdur. Proje ana dizininizde docker/nginx/default.conf yolunda 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";

    index index.php index.html index.htm;

    charset utf-8;

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

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

    location ~ /\.ht {
        deny all;
    }
}
    

Bu Nginx konfigürasyonu, Laravel uygulamaları için standart bir kurulumdur. listen 80; Nginx'in 80 portunu dinlemesini sağlar. root /var/www/html/public; Laravel'in ana dizininin public klasörü olduğunu belirtir, bu da güvenlik açısından önemlidir. location / bloğu, tüm istekleri Laravel'in index.php dosyasına yönlendirir (URL rewriting). En kritik kısım ise location ~ \.php$ bloğudur. Bu blok, tüm PHP dosyası isteklerini fastcgi_pass app:9000; ile app servisine (yani PHP-FPM konteynerimize) 9000 portundan iletir. app, docker-compose.yml dosyamızda tanımladığımız PHP-FPM servisinin adıdır. Bu sayede Nginx, gelen web isteklerini doğru bir şekilde Laravel uygulamamıza iletebilir.

Laravel .env Dosyasını Güncelleme

Son olarak, Laravel projenizin .env dosyasını, Docker Compose ile kurduğumuz MySQL veritabanı servisine bağlanacak şekilde güncellememiz gerekiyor. Proje ana dizininizdeki .env dosyasını açın ve aşağıdaki satırları bulun veya ekleyin:


DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=password
    

Burada dikkat etmeniz gereken en önemli nokta DB_HOST=db satırıdır. db, docker-compose.yml dosyamızda MySQL servisine verdiğimiz isimdir. Docker Compose, servis isimlerini otomatik olarak ağ içinde çözülebilir hale getirir, böylece IP adresi yerine servis adını kullanabiliriz. Diğer bilgiler (veritabanı adı, kullanıcı adı, şifre) ise docker-compose.yml dosyasında MySQL servisi için ayarladığımız environment değişkenleriyle eşleşmelidir. Bu adımları tamamladığınızda, Laravel uygulamanız Docker ortamında çalışmaya hazır hale gelecektir.

Veritabanı Yönetimi ve Veri Kalıcılığı Nasıl Sağlanır?

Bir web uygulamasının en kritik bileşenlerinden biri veritabanıdır ve veritabanı verilerinin güvenliği ile kalıcılığı büyük önem taşır. Docker konteynerleri doğası gereği geçicidir; yani bir konteyner silindiğinde, içinde depolanan tüm veriler de kaybolur. Bu durum, özellikle MySQL gibi veritabanı servisleri için kabul edilemezdir. Neyse ki Docker, "volumes" adı verilen mekanizmalar aracılığıyla veri kalıcılığını sağlamanın güçlü ve esnek yollarını sunar.

docker-compose.yml dosyamızda MySQL servisi için zaten bir volume tanımlaması yapmıştık:


  db:
    # ... diğer konfigürasyonlar ...
    volumes:
      - dbdata:/var/lib/mysql
    # ... diğer konfigürasyonlar ...

# ...

volumes:
  dbdata:
    driver: local
    

Bu konfigürasyon, dbdata adında bir Docker volume'u oluşturur ve bu volume'u MySQL konteynerinin içinde verilerin depolandığı /var/lib/mysql dizinine bağlar. Bu sayede, MySQL konteyneri yeniden oluşturulsa, durdurulsa veya silinse bile, dbdata volume'u varlığını sürdürür ve içindeki veriler korunmuş olur. Yani, veritabanı tablolarınız, kayıtlarınız ve tüm yapılandırmanız güvende kalır. Bu yaklaşım, geliştirme ortamlarında sıkça konteynerleri kaldırıp yeniden oluşturmanız gerektiğinde büyük kolaylık sağlar ve veri kaybı riskini ortadan kaldırır.

Veritabanı verilerinizin kalıcılığını sağladıktan sonra, Laravel uygulamanızın veritabanı ile etkileşime geçmesini sağlamak için bazı adımlar atmanız gerekir. Öncelikle, Laravel'in veritabanı tablolarını oluşturmak için migrasyonları çalıştırmanız gerekecektir. Tüm servisleriniz çalışmaya başladıktan sonra, Laravel konteynerinizin içine girerek bu komutları yürütebilirsiniz:


docker compose exec app php artisan migrate
    

Bu komut, app servisi (Laravel PHP-FPM konteyneri) içinde php artisan migrate komutunu çalıştırır. Eğer migrasyonlarınız başarılı olursa, MySQL veritabanınızda Laravel'in varsayılan tabloları (users, password_resets, failed_jobs vb.) oluşturulmuş olacaktır. Uygulamanızın ihtiyaç duyduğu diğer verileri (örneğin test verileri veya başlangıç verileri) eklemek isterseniz, Laravel'in Seeder'larını kullanabilirsiniz. Seeder'ları çalıştırmak için de benzer şekilde:


docker compose exec app php artisan db:seed
    

komutunu kullanabilirsiniz. Bu komutlar, geliştirme sürecinizde veritabanınızı kolayca yönetmenizi sağlar. Ayrıca, veritabanına doğrudan erişmek isterseniz, MySQL konteynerine bağlanarak komut satırından işlem yapabilirsiniz:


docker compose exec db mysql -u laravel_user -p laravel_db
    

Bu komut sizden şifre isteyecektir (password olarak belirlemiştik). Başarılı bir şekilde bağlandığınızda, MySQL komut satırında veritabanı sorguları çalıştırabilirsiniz. Veritabanı yönetimini kolaylaştırmak için PhpMyAdmin veya Adminer gibi web tabanlı araçları da Docker Compose dosyanıza bir servis olarak ekleyebilirsiniz. Örneğin, PhpMyAdmin için docker-compose.yml dosyanıza aşağıdaki servisi ekleyebilirsiniz:


  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: laravel_phpmyadmin
    restart: unless-stopped
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: root
    networks:
      - app-network
    

Bu servisi ekledikten sonra docker compose up -d komutunu tekrar çalıştırarak PhpMyAdmin'i http://localhost:8081 adresinden erişilebilir hale getirebilirsiniz. Bu sayede, veritabanı üzerinde görsel bir arayüzle işlem yapma imkanına sahip olursunuz. Veritabanı verilerinin kalıcılığı ve kolay yönetilebilirliği, Docker Compose ile Laravel projeleri geliştirirken sunduğu en büyük avantajlardan biridir.

Uygulamayı Başlatma ve Test Etme: İlk Adımlar ve Yaygın Sorunlar

Tüm Docker Compose dosyamızı, PHP Dockerfile'ımızı ve Nginx konfigürasyonumuzu hazırladık. Laravel'in .env dosyasını da güncelledik. Artık sıra, bu güçlü yığını ayağa kaldırmaya ve Laravel uygulamamızı çalıştırmaya geldi. Proje ana dizininizde (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 --build
    

Bu komutun anlamı şudur:

  • docker compose up: docker-compose.yml dosyasında tanımlanan tüm servisleri başlatır.
  • -d: "detached" modda çalıştırır, yani konteynerleri arka planda çalıştırır ve terminalinizi serbest bırakır.
  • --build: Eğer servisler için Dockerfile'lar tanımlanmışsa (bizim PHP servisimiz için var), bu Dockerfile'ları kullanarak imajları yeniden inşa eder. İlk çalıştırmada bu parametre zorunludur. Daha sonra sadece kod değişiklikleri yapıldığında ve Dockerfile değişmediğinde kaldırılabilir.

Komutu çalıştırdıktan sonra Docker, PHP imajını inşa etmeye başlayacak, Nginx ve MySQL imajlarını çekecek (eğer yerelde yoksa) ve tüm servisleri başlatacaktır. Bu işlem, internet bağlantınızın hızına ve sistem kaynaklarınıza bağlı olarak birkaç dakika sürebilir. Tüm servisler başarılı bir şekilde başlatıldığında, terminalinizde herhangi bir hata görmemelisiniz.

Servislerin durumunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:


docker compose ps
    

Bu komut, çalışan tüm servisleri ve durumlarını listeler. Tüm servislerin Up durumunda olması gerekir.

Şimdi Laravel uygulamanıza erişme zamanı! Tarayıcınızı açın ve http://localhost:8000 adresine gidin. Eğer her şeyi doğru yapılandırdıysanız, Laravel'in hoş geldiniz sayfasını görmelisiniz. Bu, Nginx'in isteği doğru bir şekilde PHP-FPM'e yönlendirdiğini ve Laravel uygulamanızın çalıştığını gösterir.

Yaygın Sorunlar ve Çözümleri

Kurulum sırasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri şunlardır:

  1. Port Çakışması: Eğer 8000 portu yerel makinenizde başka bir uygulama tarafından kullanılıyorsa, Nginx konteyneri başlatılamaz.
    • Çözüm: docker-compose.yml dosyasındaki Nginx servisinin ports bölümünü değiştirerek farklı bir port kullanabilirsiniz. Örneğin: "8001:80".
  2. Veritabanı Bağlantı Hatası: Laravel'in .env dosyasındaki veritabanı bilgileri (DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD) yanlışsa, uygulama veritabanına bağlanamaz.
    • Çözüm: .env dosyasındaki bilgilerin docker-compose.yml dosyasındaki MySQL servisinin environment değişkenleriyle tam olarak eşleştiğinden emin olun. Özellikle DB_HOST'un db olduğundan emin olun.
  3. PHP Uzantısı Eksikliği: Laravel'in ihtiyaç duyduğu bazı PHP uzantıları (örneğin pdo_mysql, mbstring) PHP Dockerfile'ında yüklenmemişse, hatalar alabilirsiniz.
    • Çözüm: docker/php/Dockerfile dosyasını kontrol edin ve eksik uzantıları docker-php-ext-install komutuyla ekleyin. Değişiklik yaptıktan sonra docker compose up -d --build komutunu yeniden çalıştırın.
  4. Dosya İzinleri Sorunu: Laravel'in storage veya bootstrap/cache dizinlerine yazma izinleri yoksa, uygulama hata verebilir.
    • Çözüm: PHP Dockerfile'ında chown -R www-data:www-data /var/www/html ve chmod -R 775 /var/www/html/storage gibi komutların doğru çalıştığından emin olun. Ayrıca, yerel dosya sisteminizde de bu dizinlerin doğru izinlere sahip olduğundan emin olmak için sudo chmod -R 775 storage bootstrap/cache komutunu çalıştırabilirsiniz.
  5. Nginx 502 Bad Gateway Hatası: Nginx'in PHP-FPM ile iletişim kuramadığını gösterir.
    • Çözüm: Nginx konfigürasyonunda fastcgi_pass app:9000; kısmının doğru olduğundan ve app servisinin (PHP-FPM) çalıştığından emin olun. docker compose logs app komutuyla PHP-FPM loglarını kontrol edin.

Bu adımları takip ederek ve olası sorunlara karşı hazırlıklı olarak, Laravel uygulamanızı Docker Compose ile sorunsuz bir şekilde çalıştırabilirsiniz. Geliştirme sürecinizde, docker compose restart (tüm servisleri yeniden başlatır) veya docker compose stop (tüm servisleri durdurur) gibi komutları sıkça kullanacaksınız.

İleri Düzey İpuçları ve Optimizasyonlar: Performans ve Güvenlik

Docker Compose ile Laravel, Nginx ve MySQL kurulumu, geliştirme ortamınızı standartlaştırmak için harika bir başlangıç noktasıdır. Ancak, projelerinizi daha verimli, güvenli ve performant hale getirmek için uygulayabileceğiniz bazı ileri düzey teknikler ve optimizasyonlar mevcuttur. Bu bölümde, hem geliştirme hem de potansiyel olarak üretim ortamları için faydalı olabilecek ipuçlarına değineceğiz.

1. Geliştirme ve Üretim Ortamları İçin Farklı Konfigürasyonlar

Geliştirme ortamı genellikle kolay hata ayıklama ve hızlı değişiklikler yapma odaklıyken, üretim ortamı güvenlik, performans ve kararlılık odaklıdır. Docker Compose, bu farklı senaryoları yönetmek için birden fazla docker-compose.yml dosyası kullanma esnekliği sunar. Örneğin, docker-compose.yml ana dosyanız temel servisleri tanımlarken, docker-compose.dev.yml geliştirme için ek araçları (örneğin Xdebug, PhpMyAdmin) ve docker-compose.prod.yml ise üretim için optimize edilmiş ayarları (örneğin daha sıkı Nginx kuralları, Redis caching) içerebilir.

Örnek kullanım:


# Geliştirme ortamını başlat
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build

# Üretim ortamını başlat (daha sonra ele alınacak)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build
    

2. Performans Optimizasyonları

  • PHP FPM Konfigürasyonu: docker/php/Dockerfile içinde PHP-FPM ayarlarını optimize edebilirsiniz. Örneğin, pm.max_children, pm.start_servers gibi parametreleri uygulamanızın yüküne göre ayarlamak performansı artırabilir. Bu ayarlar genellikle /usr/local/etc/php-fpm.d/www.conf dosyasında bulunur ve Dockerfile içinde bu dosyayı kopyalayarak veya düzenleyerek özelleştirebilirsiniz.
  • Nginx Caching: Nginx'i statik dosyaları (CSS, JS, resimler) doğrudan sunacak ve önbelleğe alacak şekilde yapılandırarak PHP-FPM üzerindeki yükü azaltabilirsiniz. default.conf dosyanızda location bloklarına expires başlıkları ekleyebilirsiniz.
    
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 1y;
        log_not_found off;
    }
                
  • Veritabanı İndeksleri: MySQL veritabanınızda sorgu performansını artırmak için doğru indeksleri kullandığınızdan emin olun. Laravel migrasyonlarınızda indeksleri tanımlayabilirsiniz.
  • Redis/Memcached Entegrasyonu: Laravel'in önbellekleme (caching) ve oturum (session) sürücülerini Redis veya Memcached gibi in-memory veritabanlarına taşımak, uygulamanızın yanıt süresini önemli ölçüde hızlandırabilir. Docker Compose dosyanıza kolayca bir Redis servisi ekleyebilirsiniz:
    
      redis:
        image: redis:alpine
        container_name: laravel_redis
        restart: unless-stopped
        networks:
          - app-network
                

    Ardından Laravel .env dosyanızda REDIS_HOST=redis olarak ayarlayabilirsiniz.

3. Güvenlik İpuçları

  • Üretim Ortamında Root Erişimini Kısıtlama: MySQL için MYSQL_ROOT_PASSWORD yerine daha kısıtlı yetkilere sahip bir kullanıcı kullanın. Ayrıca, .env dosyasındaki hassas bilgileri doğrudan Docker Compose dosyasında tutmak yerine Docker Secrets veya Kubernetes Secrets gibi daha güvenli yöntemler kullanmayı düşünün.
  • Nginx Güvenlik Başlıkları: default.conf dosyanıza eklediğimiz X-Frame-Options, X-XSS-Protection gibi başlıklar temel güvenlik sağlar. Daha fazlası için CSP (Content Security Policy) gibi başlıkları da eklemeyi düşünebilirsiniz.
  • Log Yönetimi: Üretim ortamında logları merkezi bir loglama sistemine (ELK Stack, Grafana Loki) göndermek için Docker'ın log sürücülerini kullanabilirsiniz. Bu, sorun giderme ve güvenlik denetimleri için kritik öneme sahiptir.
  • İmaj Güvenliği: Temel Docker imajlarını düzenli olarak güncelleyin. Kendi Dockerfile'larınızda gereksiz paketleri yüklemekten kaçının ve minimum bağımlılık prensibini uygulayın.

4. Vaka Analizi: Yüksek Trafikli Bir E-Ticaret Uygulamasının Docker Compose ile Yönetimi

Bir e-ticaret platformu geliştirme ekibi, "ürün listeleme" ve "ödeme" gibi kritik modüller üzerinde çalışıyordu. Uygulama Laravel ile geliştirilmiş, Nginx ve MySQL kullanıyordu. İlk başta, her geliştirici kendi yerel makinesinde manuel kurulumlar yapıyordu. Bu durum, "Benim makinemde çalışıyor ama seninkinde hata veriyor" gibi klasik sorunlara yol açıyordu. Ekip, bu tutarsızlığı gidermek ve yeni geliştiricilerin onboarding sürecini hızlandırmak için Docker Compose'a geçmeye karar verdi.

Uygulanan Çözümler:

  1. Standartlaştırılmış Geliştirme Ortamı: Yukarıdaki rehberde anlatıldığı gibi bir docker-compose.yml dosyası oluşturuldu. Bu sayede, her geliştirici sadece docker compose up -d komutunu çalıştırarak tamamen işlevsel bir geliştirme ortamına sahip oldu.
  2. Redis Entegrasyonu: Yüksek trafik beklenen bir e-ticaret uygulaması olduğu için, Laravel'in önbellekleme ve oturum yönetimi için Docker Compose'a bir Redis servisi eklendi. Bu, veritabanı üzerindeki yükü önemli ölçüde azalttı ve sayfa yükleme sürelerini iyileştirdi.
  3. Xdebug ile Hata Ayıklama: Geliştirme ortamında, docker-compose.dev.yml dosyasına Xdebug içeren özel bir PHP Dockerfile'ı eklendi. Bu, geliştiricilerin IDE'leri (VS Code, PhpStorm) aracılığıyla kolayca hata ayıklama yapmasını sağladı.
  4. Veritabanı Yönetim Aracı: Ekip, veritabanı işlemlerini kolaylaştırmak için PhpMyAdmin'i de bir servis olarak ekledi. Bu, özellikle veritabanı şemasını görsel olarak incelemek veya küçük veri değişiklikleri yapmak gerektiğinde faydalı oldu.
  5. Veri Kalıcılığı ve Yedekleme: MySQL verileri için Docker Volume'ları kullanılarak veri kalıcılığı sağlandı. Ayrıca, üretim ortamı için otomatik veritabanı yedekleme scriptleri Docker konteynerleri içinde çalışacak şekilde ayarlandı.

Sonuçlar:

Docker Compose'a geçişle birlikte, geliştirme ekibinin verimliliği %30 arttı. Yeni geliştiricilerin projeye adaptasyon süresi haftalardan günlere düştü. Ortam tutarsızlıklarından kaynaklanan hatalar neredeyse tamamen ortadan kalktı. Ayrıca, üretim ortamına dağıtım süreçleri de Docker konteynerleri sayesinde daha öngörülebilir ve güvenilir hale geldi. Bu vaka analizi, Docker Compose'un sadece küçük projeler için değil, aynı zamanda karmaşık ve yüksek performans gerektiren uygulamalar için de ne kadar değerli bir araç olduğunu göstermektedir.

Sonuç: Docker Compose ile Geliştirme Ortamınızı Güçlendirin

Bu kapsamlı rehber boyunca, Laravel, Nginx ve MySQL gibi modern web geliştirme yığınının temel bileşenlerini Docker Compose ile nasıl entegre edeceğimizi adım adım inceledik. Konteyner teknolojilerinin sunduğu izolasyon, taşınabilirlik ve tutarlılık avantajlarını kullanarak, "benim makinemde çalışıyordu" gibi sorunlara veda etme yolunda önemli bir adım attık. Artık, projenizin her ortamda aynı şekilde çalışmasını sağlayacak güçlü ve esnek bir geliştirme ortamına sahipsiniz. Docker Compose, sadece kurulum süreçlerini basitleştirmekle kalmaz, aynı zamanda ekip içinde işbirliğini artırır, hata ayıklamayı kolaylaştırır ve gelecekteki ölçeklenebilirlik için sağlam bir temel oluşturur. İster yeni başlayan bir geliştirici olun ister deneyimli bir profesyonel, Docker Compose'u geliştirme iş akışınıza entegre etmek, şüphesiz verimliliğinizi artıracak ve daha keyifli bir geliştirme deneyimi sunacaktır.

Unutmayın, Docker ekosistemi sürekli gelişen bir alandır. Bu rehberde öğrendiğiniz temel bilgilerin üzerine inşa ederek, özel ihtiyaçlarınıza göre daha karmaşık konfigürasyonlar oluşturabilir, farklı servisleri entegre edebilir ve projelerinizi bir sonraki seviyeye taşıyabilirsiniz. Docker Compose ile oluşturduğunuz bu temel, daha büyük ölçekli ve karmaşık dağıtım senaryoları için Kubernetes gibi orkestrasyon araçlarına geçişte de size değerli bir deneyim kazandıracaktır. Şimdi, yeni Docker Compose destekli Laravel projenizin tadını çıkarın!

Sıkça Sorulan Sorular (SSS)

  1. Docker Compose üretim ortamında kullanılabilir mi?

    Evet, Docker Compose küçük ve orta ölçekli üretim ortamları için kullanılabilir. Ancak, yüksek kullanılabilirlik, otomatik ölçeklendirme ve karmaşık dağıtım senaryoları gerektiren büyük ölçekli uygulamalar için Kubernetes gibi daha gelişmiş konteyner orkestrasyon araçları genellikle tercih edilir. Docker Compose, özellikle tek sunuculu dağıtımlar veya mikroservis mimarisi olmayan uygulamalar için iyi bir başlangıç noktasıdır.

  2. Docker Compose yerine Kubernetes kullanmalı mıyım?

    Bu, projenizin ölçeğine, karmaşıklığına ve ekibinizin yetkinliğine bağlıdır. Eğer uygulamanızın yüksek kullanılabilirlik, otomatik ölçeklendirme, kendi kendini iyileştirme gibi özelliklere ihtiyacı varsa ve mikroservis mimarisi kullanıyorsanız, Kubernetes daha uygun bir seçim olabilir. Ancak Kubernetes'in öğrenme eğrisi daha diktir. Eğer daha basit bir dağıtıma ihtiyacınız varsa veya yeni başlıyorsanız, Docker Compose başlamak için harika bir yoldur. Genellikle geliştirme ortamları için Docker Compose, üretim için Kubernetes şeklinde bir kombinasyon da yaygındır.

  3. Veritabanı verilerimi nasıl yedeklerim?

    Veritabanı verilerinizin kalıcılığını Docker volume'ları ile sağladık. Yedekleme için ise, MySQL konteynerine bağlanarak mysqldump komutunu kullanabilirsiniz. Örneğin:

    
    docker compose exec db mysqldump -u laravel_user -p laravel_db > backup.sql
                

    Bu komut, veritabanının bir yedeğini backup.sql dosyasına kaydeder. Bu dosyayı daha sonra yerel makinenize kopyalayarak güvenli bir yerde saklayabilirsiniz. Otomatik yedeklemeler için cron job veya Docker konteyneri içinde çalışan bir yedekleme scripti kullanabilirsiniz.

  4. Laravel .env dosyasını nasıl yönetmeliyim?

    Geliştirme ortamında .env dosyasını doğrudan projenizde tutmak yaygın bir uygulamadır (ancak git'e commit etmeyin!). Üretim ortamında ise daha güvenli yöntemler tercih edilir. Ortam değişkenlerini doğrudan sunucuya set edebilir, Docker Secrets (Docker Swarm için) veya Kubernetes Secrets (Kubernetes için) kullanabilir ya da HashiCorp Vault gibi bir sır yönetimi çözümü entegre edebilirsiniz. Amaç, hassas bilgilerin (API anahtarları, veritabanı şifreleri) kod tabanında veya versiyon kontrol sisteminde açıkça görünmesini engellemektir.

  5. PHP versiyonunu nasıl değiştirebilirim?

    PHP versiyonunu değiştirmek için docker/php/Dockerfile dosyasındaki FROM php:8.2-fpm-alpine satırını istediğiniz PHP versiyonuyla (örneğin php:8.1-fpm-alpine veya php:7.4-fpm-alpine) değiştirmeniz yeterlidir. Değişikliği yaptıktan sonra, Docker imajını yeniden inşa etmek için docker compose up -d --build komutunu çalıştırmanız gerekir. Bu sayede, uygulamanız yeni PHP versiyonuyla çalışmaya başlayacaktır.

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

Gönder

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.
Exit mobile version