Takip et

Giriş: Neden Geliştirme Ortamı Kurulumu Bu Kadar Zorlu?

Laravel, Nginx ve MySQL’i Docker Compose ile Kurulum Rehberi

Modern web uygulamaları geliştirirken kurulum süreçlerinin karmaşıklığıyla mı boğuşuyorsunuz? Laravel, Nginx ve MySQL’i Docker Compose ile hızlıca nasıl entegre edeceğinizi adım adım öğrenin, geliştirme ortamınızı standartlaştırın ve verimliliğinizi artırın.

Giriş: Neden Geliştirme Ortamı Kurulumu Bu Kadar Zorlu?

Web geliştirme dünyası, sürekli değişen teknolojiler ve karmaşık bağımlılıklarla dolu. Bir Laravel projesi üzerinde çalışırken, PHP’nin belirli bir sürümüne, MySQL veritabanına ve Nginx veya Apache gibi bir web sunucusuna ihtiyacınız vardır. Bu bileşenlerin her birini işletim sisteminize manuel olarak kurmak, sürüm çakışmaları, sistem kaynaklarının aşırı kullanımı ve “benim makinemde çalışıyordu” sendromu gibi pek çok sorunu beraberinde getirebilir. Özellikle farklı projelerde farklı PHP sürümleri veya veritabanı tipleri kullanmanız gerektiğinde, bu karmaşa katlanarak artar. Geliştirme ortamınızın bir geliştiriciden diğerine veya geliştirme ortamından üretim ortamına tutarlı olmaması, zaman kaybına, hatalara ve gereksiz streslere yol açar.

İşte tam da bu noktada konteyner teknolojileri, özellikle de Docker ve Docker Compose devreye giriyor. Docker, uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir birimler olan konteynerler içinde çalıştırmanıza olanak tanır. Bu sayede uygulamanız, çalıştığı ortamdan bağımsız hale gelir. Docker Compose ise birden fazla Docker konteynerini içeren uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Tek bir YAML dosyası ile tüm servislerinizi (veritabanı, web sunucusu, uygulama sunucusu vb.) yapılandırabilir, başlatabilir ve yönetebilirsiniz. Bu, geliştirme ortamı kurulumunu basitleştirmenin ve standartlaştırmanın en etkili yollarından biridir. Bu makalede, popüler PHP framework’ü Laravel’i, yüksek performanslı web sunucusu Nginx’i ve sağlam veritabanı sistemi MySQL’i Docker Compose kullanarak nasıl kusursuz bir şekilde entegre edeceğimizi adım adım inceleyeceğiz. Bu sayede hem başlangıç seviyesindeki geliştiriciler hem de deneyimli profesyoneller için temiz, tutarlı ve verimli bir geliştirme ortamı oluşturmanın kapılarını aralayacağız.

Uzman İpucu: Geliştirme ortamınızı Dockerize etmek, sadece kurulumu kolaylaştırmakla kalmaz, aynı zamanda CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) süreçlerinizi de büyük ölçüde hızlandırır ve standartlaştırır. Uygulamanızın her zaman aynı şekilde çalıştığından emin olabilirsiniz.

Temel Kavramlar Nelerdir: Docker, Laravel, Nginx ve MySQL’i Yakından Tanıyalım

Bu kılavuza başlamadan önce, kullanacağımız temel teknolojilerin ne olduğunu ve neden bir arada bu kadar güçlü olduklarını anlamak önemlidir. Bu bölümde, her bir bileşenin ne işe yaradığını ve genel mimarideki yerini açıklayacağız.

Docker ve Docker Compose Nedir ve Neden Önemlidir?

Docker, uygulamaları ve bağımlılıklarını paketleyerek “konteyner” adı verilen izole edilmiş birimlerde çalıştırmanızı sağlayan açık kaynaklı bir platformdur. Bir konteyner, uygulamanızı çalıştırmak için gereken her şeyi (kod, çalışma zamanı, sistem araçları, kütüphaneler ve ayarlar) içerir. Bu izolasyon sayesinde, uygulamanız farklı ortamlarda (geliştirme, test, üretim) her zaman aynı şekilde çalışır. Docker’ın en büyük avantajlarından biri, “benim makinemde çalışıyordu” sorununu ortadan kaldırmasıdır. Her konteyner kendi bağımsız işletim sistemine sahip bir sanal makine olmasa da, kendi izole edilmiş ortamına sahiptir.

Docker Compose ise, birden fazla Docker konteynerini içeren uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. Karmaşık uygulamalar genellikle birden fazla servis gerektirir (örneğin, bir web uygulaması, bir veritabanı ve bir önbellek servisi). Docker Compose, bu servislerin tümünü tek bir YAML dosyası içinde tanımlamanıza ve tek bir komutla (docker compose up) tümünü başlatmanıza olanak tanır. Bu, geliştirme ortamınızı kurmayı ve yönetmeyi inanılmaz derecede basitleştirir. Geliştiriciler, projenin tüm bağımlılıklarını saniyeler içinde ayağa kaldırabilir ve hemen kod yazmaya başlayabilir.

Laravel, Nginx ve MySQL Neden Bu Kadar Popüler?

Bu üç teknoloji, modern web geliştirme yığınının temel taşlarıdır ve her birinin kendine özgü güçlü yönleri vardır:

  • Laravel (PHP Framework): PHP tabanlı, açık kaynaklı ve popüler bir web uygulama framework’üdür. Geliştiricilerin hızlı bir şekilde sağlam ve ölçeklenebilir web uygulamaları oluşturmasına olanak tanıyan zarif bir sözdizimi ve kapsamlı özellik setine sahiptir. MVC (Model-View-Controller) mimarisi, ORM (Eloquent), kuyruk yönetimi, kimlik doğrulama gibi birçok yerleşik özelliği sayesinde geliştirme sürecini hızlandırır ve basitleştirir. Laravel, PHP ekosistemindeki en aktif topluluklardan birine sahiptir, bu da sorun giderme ve kaynak bulma konusunda büyük bir avantaj sağlar.
  • Nginx (Web Sunucusu): Yüksek performanslı, hafif ve ölçeklenebilir bir web sunucusu ve ters proxy’dir. Özellikle yüksek trafikli web siteleri için tasarlanmıştır ve eşzamanlı bağlantıları verimli bir şekilde yönetme yeteneğiyle bilinir. Nginx, statik dosyaları sunmada oldukça hızlıdır ve dinamik içerik için PHP-FPM gibi uygulama sunucularıyla sorunsuz bir şekilde entegre olur. Bir ters proxy olarak kullanıldığında, yük dengeleme, SSL sonlandırma ve güvenlik gibi ek yetenekler sunar.
  • MySQL (Veritabanı Yönetim Sistemi): Dünyanın en popüler açık kaynaklı ilişkisel veritabanı yönetim sistemlerinden biridir. Sağlamlığı, güvenilirliği, performansı ve geniş topluluk desteği ile bilinir. MySQL, küçük ölçekli projelerden kurumsal düzeydeki uygulamalara kadar geniş bir yelpazede kullanılabilir. Laravel’in Eloquent ORM’si ile mükemmel bir uyum içindedir, bu da veritabanı işlemlerini kod üzerinden kolayca yönetmenizi sağlar.

Neden Bu Üçlüyü Docker Compose ile Kullanmalıyız?

Laravel, Nginx ve MySQL üçlüsünü Docker Compose ile birleştirmek, geliştirme ve dağıtım süreçlerinizde devrim yaratır. İşte başlıca nedenler:

  1. Tutarlılık: Her geliştirici aynı ortamda çalışır. Bu, “benim makinemde çalışıyordu” sorununu ortadan kaldırır ve ekip içinde daha sorunsuz bir işbirliği sağlar.
  2. İzolasyon: Her servis (Laravel/PHP-FPM, Nginx, MySQL) kendi konteynerinde izole bir şekilde çalışır. Bu, bağımlılık çakışmalarını önler ve bir servisteki değişikliklerin diğerlerini etkilemesini engeller.
  3. Kolay Kurulum: Yeni bir projeye başlayan veya mevcut bir projeye katılan bir geliştirici, tek bir komutla tüm geliştirme ortamını kurabilir. Bu, onboarding sürecini büyük ölçüde hızlandırır.
  4. Taşınabilirlik: Konteynerler, bulut ortamlarından yerel makinelere kadar her yerde çalışabilir. Bu, uygulamanızın farklı ortamlara kolayca taşınabilmesini sağlar.
  5. Sürüm Kontrolü: docker-compose.yml ve Dockerfile dosyaları proje dizininizde saklanır ve sürüm kontrol sistemlerine (Git gibi) dahil edilebilir. Bu, ortam yapılandırmanızın da kod gibi yönetilmesini sağlar.
  6. Ölçeklenebilirlik: Docker Compose, servisleri kolayca ölçeklendirmenize olanak tanır, ancak daha büyük ölçekli üretim ortamları için Kubernetes gibi orkestrasyon araçları daha uygun olabilir.

Bu temel kavramları anladıktan sonra, artık geliştirme ortamımızı adım adım kurmaya başlayabiliriz.

Geliştirme Ortamınızı Hazırlama: İlk Adımlar Nelerdir?

Docker Compose ile Laravel, Nginx ve MySQL yığınını kurmaya başlamadan önce, sisteminizde bazı önkoşulların yüklü olması gerekmektedir. Bu bölüm, gerekli araçları kurmanıza ve proje yapınızı oluşturmanıza yardımcı olacaktır.

Docker ve Docker Compose Kurulumu (Önkoşullar)

İlk ve en önemli adım, Docker’ı ve dolayısıyla Docker Compose’u sisteminize kurmaktır. Docker Desktop, hem Docker Engine’i hem de Docker Compose’u içerdiği için en kolay kurulum yöntemidir ve Windows, macOS ve Linux için mevcuttur.

  • Windows ve macOS için:

    Docker Desktop’ı resmi Docker web sitesinden (www.docker.com/products/docker-desktop) indirin ve kurulum sihirbazını takip edin. Kurulum tamamlandıktan sonra Docker Desktop otomatik olarak başlayacak ve Docker komutlarını terminalinizde kullanabileceksiniz.

  • Linux için:

    Linux dağıtımınıza özel kurulum talimatları için Docker’ın resmi belgelerine (docs.docker.com/engine/install/) bakın. Genellikle, paket yöneticiniz aracılığıyla Docker Engine’i ve ardından Docker Compose’u kurmanız gerekir.

Kurulumu doğruladıktan sonra, terminalinizi açın ve aşağıdaki komutları çalıştırın:

docker --version
docker compose version

Bu komutlar, Docker ve Docker Compose’un yüklü olduğunu ve sürüm bilgilerini göstermelidir. Eğer bir hata alırsanız, kurulum adımlarını dikkatlice tekrar kontrol edin.

Proje Dizini Yapısının Oluşturulması

Şimdi, Laravel projemiz ve Docker yapılandırma dosyalarımız için temiz bir dizin yapısı oluşturalım. Bu, projenizin düzenli kalmasını ve yönetilmesini kolaylaştıracaktır.

Terminalinizde aşağıdaki komutları çalıştırarak projeniz için bir ana dizin oluşturun ve içine girin:

mkdir laravel-docker-app
cd laravel-docker-app

Bu dizinin içinde, Laravel projemizin kendisi için bir alt dizin ve Nginx yapılandırması için ayrı bir dizin oluşturacağız. Genel olarak, yapımız şöyle görünecektir:

laravel-docker-app/
├── app/                  # Laravel projemizin kaynak kodları burada olacak
├── docker-compose.yml    # Docker Compose yapılandırma dosyası
├── docker/
│   ├── nginx/
│   │   └── default.conf  # Nginx sunucu yapılandırması
│   └── php/
│       └── Dockerfile    # PHP (Laravel) konteyneri için Dockerfile
└── .env                  # Ortam değişkenleri (örneğin, veritabanı bilgileri)

Şimdi, bu yapıyı oluşturalım:

mkdir app
mkdir docker
mkdir docker/nginx
mkdir docker/php
touch docker-compose.yml
touch docker/nginx/default.conf
touch docker/php/Dockerfile
touch .env

Laravel projesini app/ dizinine daha sonra kuracağız. Şimdilik bu temel yapı yeterli. Bu düzenli yapı, farklı servislerin yapılandırma dosyalarını birbirinden ayrı tutarak okunabilirliği ve yönetilebilirliği artırır. Örneğin, Nginx yapılandırması docker/nginx/ altında, PHP konteyneri için Dockerfile ise docker/php/ altında yer alacak. Bu sayede, gelecekte herhangi bir serviste değişiklik yapmanız gerektiğinde ilgili dosyayı kolayca bulabilirsiniz.

Bu adımlarla, Docker ve Docker Compose’u kurmuş ve projenizin temel dizin yapısını oluşturmuş oldunuz. Artık Docker Compose dosyamızı yapılandırmaya ve servislerimizi tanımlamaya hazırız.

Docker Compose Dosyasını Yapılandırma: Servisleri Tanımlama

docker-compose.yml dosyası, tüm Docker servislerimizin kalbini oluşturur. Bu dosya, uygulamanızın hangi servislerden oluştuğunu, bu servislerin hangi Docker imajlarını kullanacağını, hangi portları dinleyeceğini, hangi birimlerin (volumes) bağlanacağını ve aralarındaki ağ bağlantılarını tanımlar. Şimdi bu önemli dosyayı adım adım oluşturalım.

docker-compose.yml Dosyasının Oluşturulması ve Temel Yapısı

laravel-docker-app/ dizininin kökünde bulunan docker-compose.yml dosyasını açın ve aşağıdaki temel yapıyı ekleyin:

version: '3.8'

services:
  # MySQL veritabanı servisi
  db:
    image: mysql:8.0
    container_name: laravel_mysql_db
    restart: unless-stopped
    env_file:
      - .env
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USERNAME}
    volumes:
      - dbdata:/var/lib/mysql
    ports:
      - "3306:3306"

  # PHP (Laravel) uygulama servisi
  app:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    container_name: laravel_app
    restart: unless-stopped
    env_file:
      - .env
    volumes:
      - ./app:/var/www/html
    depends_on:
      - db

  # Nginx web sunucusu servisi
  nginx:
    image: nginx:stable-alpine
    container_name: laravel_nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443" # Eğer HTTPS kullanacaksanız
    volumes:
      - ./app:/var/www/html:ro
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

volumes:
  dbdata:
    driver: local

Bu dosya, üç ana servisi tanımlar: db (MySQL), app (Laravel/PHP-FPM) ve nginx. Her servisin kendine özgü yapılandırması vardır.

MySQL Servisi Tanımı (db)

db servisi, MySQL veritabanını çalıştırır:

  • image: mysql:8.0: MySQL’in 8.0 sürümünü kullanacağımızı belirtir.
  • container_name: laravel_mysql_db: Konteyner için okunabilir bir isim atar.
  • restart: unless-stopped: Konteynerin bir hata durumunda veya Docker yeniden başlatıldığında otomatik olarak yeniden başlamasını sağlar.
  • env_file: - .env ve environment: Veritabanı kimlik bilgileri gibi hassas bilgileri .env dosyasından alır. Bu, kimlik bilgilerini koddan ayırmak için iyi bir güvenlik uygulamasıdır.
  • volumes: - dbdata:/var/lib/mysql: Veritabanı verilerinin kalıcı olmasını sağlar. dbdata adında bir Docker volume’u oluşturulur ve MySQL’in veri dizinine bağlanır. Bu sayede konteyner silinse bile verileriniz kaybolmaz.
  • ports: - "3306:3306": Host makinenizin 3306 portunu konteynerin 3306 portuna eşler. Böylece host makinenizden veritabanına erişebilirsiniz.

PHP (Laravel) Servisi Tanımı (app)

app servisi, Laravel uygulamanızı çalıştıracak PHP-FPM ortamını içerir:

  • build: context: . dockerfile: docker/php/Dockerfile: Bu, PHP konteynerinin önceden oluşturulmuş bir imaj yerine, kendi Dockerfile‘ımızdan inşa edileceğini belirtir. context: ., Dockerfile‘ın kök dizinde bulunduğunu (yani laravel-docker-app/ dizinini) ve dockerfile: docker/php/Dockerfile ise Dockerfile‘ın yolunu gösterir.
  • volumes: - ./app:/var/www/html: Laravel projemizin kaynak kodlarının bulunduğu ./app dizinini konteyner içindeki /var/www/html dizinine bağlar. Bu, host makinenizde yaptığınız kod değişikliklerinin anında konteyner içinde de görünmesini sağlar.
  • depends_on: - db: Bu servisin başlamadan önce db servisinin çalışır durumda olmasını sağlar.

Nginx Web Sunucusu Servisi Tanımı (nginx)

nginx servisi, gelen HTTP isteklerini işler ve bunları app servisine (PHP-FPM) yönlendirir:

  • image: nginx:stable-alpine: Nginx’in hafif Alpine Linux tabanlı imajını kullanırız.
  • ports: - "80:80" - "443:443": Host makinenizin 80 (HTTP) ve 443 (HTTPS) portlarını Nginx konteynerinin ilgili portlarına eşler.
  • volumes: - ./app:/var/www/html:ro - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro:
    • İlk volume, Laravel projemizin kodlarını Nginx’in web kök dizinine salt okunur (:ro) olarak bağlar.
    • İkinci volume, kendi Nginx yapılandırma dosyamızı (default.conf) konteyner içindeki Nginx yapılandırma dizinine bağlar. Bu sayede Nginx’in Laravel projemizi doğru bir şekilde sunmasını sağlayabiliriz.
  • depends_on: - app: Nginx’in başlamadan önce app servisinin çalışır durumda olmasını sağlar.

Son olarak, volumes: dbdata: driver: local kısmı, MySQL verileri için kalıcı bir Docker volume’u tanımlar.

Bu yapılandırma, tüm servislerinizin birbiriyle nasıl iletişim kuracağını ve verilerin nasıl yönetileceğini açıkça belirtir. Şimdi, Laravel uygulamamızı ve diğer yapılandırma dosyalarımızı hazırlama zamanı.

Laravel Projesini Entegre Etme ve Çalıştırma: Uygulamanızı Ayağa Kaldırma

Docker Compose dosyamızı hazırladığımıza göre, şimdi Laravel projemizi oluşturma, PHP konteynerimiz için bir Dockerfile yazma ve Nginx’i doğru şekilde yapılandırma zamanı. Bu adımlar, uygulamanızın Docker ortamında sorunsuz bir şekilde çalışmasını sağlayacaktır.

Laravel Projesini Docker Ortamına Taşıma (veya Oluşturma)

Daha önce oluşturduğumuz app/ dizinine Laravel projesini kuracağız. Bunu, Docker Compose aracılığıyla geçici bir PHP konteyneri kullanarak yapabiliriz, bu da bağımlılıkların yerel sisteminize kurulmasını engeller.

laravel-docker-app/ dizininde olduğunuzdan emin olun ve aşağıdaki komutu çalıştırın:

docker run --rm -v $(pwd)/app:/app -w /app laravel_app composer create-project laravel/laravel .

Bu komut, Laravel projesini app/ dizinine indirir ve tüm bağımlılıklarını kurar. Eğer daha önce bir Laravel projeniz varsa, sadece app/ dizinine kopyalamanız yeterlidir.

PHP Konteyneri için Dockerfile (docker/php/Dockerfile)

docker/php/Dockerfile dosyasını açın ve aşağıdaki içeriği ekleyin. Bu Dockerfile, Laravel uygulamanız için gerekli PHP uzantılarını ve ayarlarını içerir.

FROM php:8.2-fpm-alpine

# Gerekli bağımlılıkları yükle
RUN apk add --no-cache \
    nginx \
    mysql-client \
    git \
    unzip \
    libzip-dev \
    libpng-dev \
    libjpeg-turbo-dev \
    freetype-dev \
    icu-dev \
    gmp-dev \
    libpq-dev \
    libxml2-dev \
    && docker-php-ext-install -j$(nproc) pdo pdo_mysql zip gd intl gmp bcmath opcache \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && rm -rf /var/cache/apk/*

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

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

# Uygulama bağımlılıklarını yükle (üretim ortamı için --no-dev kullanılabilir)
COPY app/composer.json app/composer.lock ./
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader

# Uygulama kodunu kopyala
COPY app .

# İzinleri ayarla
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

EXPOSE 9000
CMD ["php-fpm"]

Bu Dockerfile şunları yapar:

  • php:8.2-fpm-alpine imajını temel alır (PHP 8.2 ve Alpine Linux).
  • Laravel’in ihtiyaç duyduğu PHP uzantılarını (pdo, pdo_mysql, zip, gd, intl vb.) kurar.
  • Composer’ı yükler.
  • Uygulama kodunu kopyalar ve gerekli dizinlere yazma izinleri verir.
  • PHP-FPM’in 9000 portunu açar ve PHP-FPM’i başlatır.

Veritabanı Bağlantısı ve Migrasyonlar

Laravel projemizin .env dosyasını (laravel-docker-app/.env) açın ve veritabanı bağlantı bilgilerini Docker Compose dosyamızdaki ayarlarla eşleşecek şekilde güncelleyin:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_docker
DB_USERNAME=laravel_user
DB_PASSWORD=secret

Burada önemli olan, DB_HOST değerini db olarak ayarlamaktır. Bu, Docker Compose ağındaki MySQL servisinin adıdır. Diğer değerler, docker-compose.yml dosyasındaki environment değişkenleri ile eşleşmelidir.

Şimdi, tüm servislerimizi ilk kez çalıştıralım:

docker compose up -d --build

Bu komut:

  • --build: Dockerfile’dan app servisini yeniden inşa eder.
  • -d: Konteynerleri arka planda (detached mode) çalıştırır.

Servisleriniz çalışmaya başladıktan sonra, Laravel migrasyonlarını çalıştırarak veritabanı tablolarını oluşturabiliriz:

docker compose exec app php artisan migrate

docker compose exec app komutu, app konteyneri içinde bir komut çalıştırmamızı sağlar. Bu sayede php artisan komutlarını doğrudan Docker ortamında çalıştırabiliriz.

Nginx Yapılandırması (docker/nginx/default.conf)

Son olarak, Nginx’in Laravel projemizi doğru şekilde sunması için yapılandırmamız gerekiyor. docker/nginx/default.conf dosyasını açın ve aşağıdaki içeriği ekleyin:

server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000; # app servisine yönlendir
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

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

Bu Nginx yapılandırması:

  • Gelen istekleri 80 portundan dinler ve localhost alan adını hedefler.
  • Web kök dizinini Laravel projesinin public/ dizini olarak ayarlar.
  • location / bloğu, tüm istekleri Laravel’in ön denetleyicisi olan index.php‘ye yönlendirir.
  • location ~ \.php$ bloğu, PHP dosyaları için istekleri app servisindeki PHP-FPM’e (app:9000) iletir.

İlk Çalıştırma ve Kontrol

Nginx yapılandırmasını güncelledikten sonra, Nginx konteynerini yeniden başlatmanız gerekebilir:

docker compose restart nginx

Artık tarayıcınızı açıp http://localhost adresine gittiğinizde, Laravel karşılama sayfasını görmeniz gerekir. Eğer bir sorunla karşılaşırsanız, docker compose logs komutuyla servislerin loglarını kontrol edebilirsiniz.

Tebrikler! Laravel, Nginx ve MySQL yığınını Docker Compose ile başarıyla kurdunuz ve çalıştırdınız. Bu, geliştirme ortamınızı standartlaştırmanın ve verimliliğinizi artırmanın ilk adımıdır.

Gerçek Dünya Senaryosu: Ölçeklenebilirlik ve Güvenlik İpuçları

Bir geliştirme ortamını kurmak harika, ancak gerçek dünya senaryolarında uygulamanızı daha sağlam, güvenli ve ölçeklenebilir hale getirmek için ek adımlar atmak gerekir. Bu bölümde, ortam değişkenleri, veri kalıcılığı ve HTTPS yapılandırması gibi önemli konulara odaklanacağız.

Geliştirme ve Üretim Ortamları Arasındaki Farklar

Geliştirme ortamınız genellikle hızlı iterasyon ve kolay hata ayıklama üzerine kuruludur. Üretim ortamı ise performans, güvenlik ve ölçeklenebilirlik odaklıdır. Docker Compose, her iki ortam için de temel bir yapı sunsa da, üretimde farklı Dockerfile’lar, Compose dosyaları ve yapılandırmalar kullanmak yaygın bir yaklaşımdır. Örneğin, üretimde --no-dev ile bağımlılıkları yüklemek, daha küçük imajlar oluşturmak ve debug araçlarını kaldırmak önemlidir. Ayrıca, üretimde veritabanı şifreleri, API anahtarları gibi hassas bilgileri doğrudan .env dosyasında tutmak yerine, Docker Secrets veya Kubernetes Secrets gibi daha güvenli yöntemler kullanmalısınız.

Uzman İpucu: Üretim için ayrı bir docker-compose.prod.yml dosyası oluşturarak geliştirme ortamınızdan farklı ayarlar uygulayabilirsiniz. Örneğin, geliştirme ortamında yerel bir volume kullanırken, üretimde bulut tabanlı bir veritabanı servisine bağlanabilirsiniz.

Ortam Değişkenleri (.env) ve Güvenlik

.env dosyası, veritabanı kimlik bilgileri, API anahtarları ve uygulama ayarları gibi hassas bilgileri depolamak için kullanılır. Bu dosya, sürüm kontrolüne (Git) eklenmemelidir (.gitignore‘a ekleyin). docker-compose.yml dosyamızda env_file: - .env kullanarak bu değişkenleri Docker konteynerlerine aktardık. Bu, geliştirme ortamı için uygun olsa da, üretimde daha güvenli yöntemler tercih edilmelidir:

  • Docker Secrets: Docker Swarm ve Kubernetes gibi orkestrasyon araçları, hassas verileri güvenli bir şekilde depolamak ve konteynerlere dağıtmak için “secrets” mekanizmaları sunar.
  • Ortam Değişkeni Yönetimi: Bulut sağlayıcıları (AWS, Azure, GCP) genellikle ortam değişkenlerini yönetmek için kendi servislerini sunar (örneğin, AWS Secrets Manager).

Veri Kalıcılığı (Volumes)

dbdata adında bir Docker volume’u kullanarak MySQL verilerimizin kalıcı olmasını sağladık. Bu, konteynerler silinse veya yeniden oluşturulsa bile veritabanı verilerinizin kaybolmamasını garanti eder. Uygulamanızın ürettiği kullanıcı tarafından yüklenen dosyalar (profil resimleri, belgeler vb.) gibi diğer kalıcı veriler için de benzer bir yaklaşım izlemelisiniz. Laravel’in storage/app/public dizini için de bir volume tanımlayabilirsiniz:

# docker-compose.yml dosyanızda
app:
  # ... diğer ayarlar
  volumes:
    - ./app:/var/www/html
    - app_storage:/var/www/html/storage # Yeni volume

# ...

volumes:
  dbdata:
    driver: local
  app_storage: # Yeni volume tanımı
    driver: local

Bu, kullanıcı tarafından yüklenen dosyaların konteynerden bağımsız olarak kalıcı olmasını sağlar.

HTTPS Yapılandırması (Let’s Encrypt ile Örnek)

Üretim ortamında uygulamanızın HTTPS üzerinden güvenli bir şekilde sunulması kritik öneme sahiptir. Nginx’i Docker konteynerinde HTTPS için yapılandırmak mümkündür. Let’s Encrypt, ücretsiz SSL/TLS sertifikaları sağlayan popüler bir hizmettir. Certbot aracı ile bu sertifikaları kolayca alabilir ve Nginx ile entegre edebilirsiniz.

Docker Compose ile Let’s Encrypt entegrasyonu genellikle ayrı bir Certbot konteyneri kurarak ve Nginx konteynerini bu sertifikaları kullanacak şekilde yapılandırarak yapılır. Bu, daha karmaşık bir kurulum gerektirse de, temel adımlar şunlardır:

  1. Certbot konteynerini kurun ve sertifikaları alın. Bu genellikle Nginx’i geçici olarak kapatıp Certbot’un 80 portunu kullanmasını gerektirebilir veya Nginx’i Certbot’un doğrulama isteklerini proxy edecek şekilde yapılandırabilirsiniz.
  2. Alınan sertifikaları Nginx konteyneriyle paylaşmak için Docker volumes kullanın (örneğin, ./data/certbot/conf:/etc/letsencrypt).
  3. Nginx yapılandırma dosyanızı (default.conf) HTTPS’i dinleyecek ve sertifikaları kullanacak şekilde güncelleyin.

Örnek Nginx HTTPS yapılandırması (docker/nginx/default.conf):

server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    return 301 https://$host$request_uri; # Tüm HTTP isteklerini HTTPS'e yönlendir
}

server {
    listen 443 ssl http2;
    server_name your_domain.com www.your_domain.com;
    root /var/www/html/public;
    index index.php index.html index.htm;

    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

    # Diğer SSL ayarları (güvenlik için önerilir)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";

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

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

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

Bu, alan adınız ve sertifika yollarınızla güncellenmesi gereken bir örnektir. Gerçek bir üretim ortamında bu adımları dikkatlice takip etmek ve Certbot’un resmi belgelerine başvurmak önemlidir.

Bu ipuçları ve teknikler, geliştirme ortamınızı bir adım öteye taşıyarak daha güvenli, verimli ve gerçek dünya senaryolarına uygun hale getirmenize yardımcı olacaktır.

İleri Düzey Kullanım ve Optimizasyon Teknikleri Nelerdir?

Temel kurulumu tamamladıktan sonra, Docker Compose ile Laravel geliştirme deneyiminizi daha da zenginleştirecek ve optimize edecek bazı ileri düzey tekniklere göz atalım. Bu teknikler, daha büyük projeler veya daha karmaşık iş akışları için özellikle faydalıdır.

Çoklu Docker Compose Dosyaları ile Ortam Yönetimi

Projeniz büyüdükçe veya farklı ortamlar (geliştirme, test, üretim) arasında farklı yapılandırmalar kullanmanız gerektiğinde, tek bir docker-compose.yml dosyası yönetilemez hale gelebilir. Bu durumda, çoklu Docker Compose dosyaları kullanmak iyi bir çözümdür.

Örneğin, temel servislerinizi (db, app, nginx) docker-compose.yml dosyasında tanımlayabilir, geliştirme ortamına özgü ek servisleri (örneğin, MailHog, Redis) veya ayarları docker-compose.override.yml dosyasında belirtebilirsiniz. Docker Compose, varsayılan olarak docker-compose.yml ve docker-compose.override.yml dosyalarını otomatik olarak birleştirir.

Ayrıca, üretim ortamı için docker-compose.prod.yml gibi ayrı bir dosya oluşturabilir ve bu dosyayı aşağıdaki gibi çalıştırabilirsiniz:

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Bu yaklaşım, ortamlar arasında tutarlılığı korurken esneklik sağlar.

CI/CD Entegrasyonu ve Otomatik Dağıtım

Dockerize edilmiş bir uygulama, Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) süreçlerine mükemmel bir şekilde entegre edilebilir. CI/CD boru hattınızda:

  1. Kodunuz her commit edildiğinde veya birleştirildiğinde, Docker imajlarınızı otomatik olarak oluşturabilir (docker build).
  2. Bu imajları bir Docker kayıt defterine (Docker Hub, GitLab Container Registry vb.) gönderebilirsiniz (docker push).
  3. Dağıtım aşamasında, sunucunuzda bu imajları çekebilir ve Docker Compose veya Kubernetes gibi bir orkestrasyon aracıyla uygulamanızı başlatabilirsiniz (docker pull ve docker compose up).

Bu otomasyon, dağıtım süreçlerini hızlandırır, insan hatasını azaltır ve uygulamanızın daha güvenilir bir şekilde yayınlanmasını sağlar. GitHub Actions, GitLab CI/CD, Jenkins gibi araçlar bu entegrasyonu kolaylaştırır.

Log Yönetimi ve İzleme

Docker Compose ile çalışan servislerin loglarını izlemek, sorun giderme ve performans analizi için hayati öneme sahiptir. docker compose logs komutu, tüm servislerin loglarını tek bir yerden görmenizi sağlar. Belirli bir servisin loglarını görmek için:

docker compose logs app

Gerçek dünya üretim ortamlarında, logları merkezi bir log toplama sistemine (ELK Stack – Elasticsearch, Logstash, Kibana, Grafana, Prometheus) göndermek önemlidir. Docker, logları çeşitli sürücüler aracılığıyla harici sistemlere aktarmanıza olanak tanır. Örneğin, docker-compose.yml dosyanızda logging yapılandırmasını kullanarak logları bir syslog sunucusuna veya JSON dosyalarına yönlendirebilirsiniz.

Debugging İpuçları ve Araçları

Laravel uygulamalarını Docker konteynerleri içinde hata ayıklamak, geleneksel yöntemlerden biraz farklı olabilir. Xdebug, PHP uygulamaları için popüler bir hata ayıklama aracıdır. Xdebug’ı PHP Dockerfile’ınıza ekleyebilir ve IDE’nizi (örneğin, VS Code veya PhpStorm) Xdebug ile bağlantı kuracak şekilde yapılandırabilirsiniz.

docker/php/Dockerfile içine Xdebug ekleme örneği:

# ... diğer RUN komutlarından sonra
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

COPY docker/php/xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini

Ve docker/php/xdebug.ini dosyası:

zend_extension=xdebug.so
xdebug.mode=develop,debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal # macOS/Windows için
# xdebug.client_host=172.17.0.1 # Linux için (docker0 arayüz IP'si)
xdebug.client_port=9003
xdebug.idekey=VSCODE

Bu, IDE’nizin Docker konteyneri içindeki PHP-FPM ile iletişim kurmasını sağlayarak kesme noktaları (breakpoints) koymanıza ve kodunuzu adım adım izlemenize olanak tanır. host.docker.internal, Docker Desktop yüklü sistemlerde (macOS, Windows) host makinesinin IP adresini temsil eder. Linux’ta ise genellikle docker0 arayüzünün IP adresini (genellikle 172.17.0.1) kullanmanız gerekebilir.

Bu ileri düzey teknikler, Docker Compose ile Laravel geliştirme ve dağıtım süreçlerinizi daha verimli, güvenli ve yönetilebilir hale getirmenize yardımcı olacaktır. Konteyner teknolojilerinin sunduğu esneklik sayesinde, ihtiyaçlarınıza göre ortamınızı sürekli olarak optimize edebilirsiniz.

Sonuç: Geliştirme Ortamınızı Dönüştürün

Bu makalede, Laravel, Nginx ve MySQL’i Docker Compose ile nasıl entegre edeceğimizi adım adım öğrendik. Karmaşık ve zaman alıcı manuel kurulum süreçlerinden, tek bir komutla çalıştırılabilen tutarlı, izole ve taşınabilir bir geliştirme ortamına geçiş yaptık. Konteyner teknolojilerinin gücünü kullanarak, “benim makinemde çalışıyordu” sorununu geride bıraktık ve geliştirme verimliliğimizi önemli ölçüde artırdık.

Başlangıçta Docker ve Docker Compose’un temel kavramlarını anladık, ardından Laravel projemizi ve gerekli yapılandırma dosyalarını oluşturduk. MySQL veritabanını, PHP-FPM ile Laravel uygulamasını ve Nginx web sunucusunu Docker Compose çatısı altında nasıl bir araya getireceğimizi ayrıntılı bir şekilde inceledik. Ayrıca, gerçek dünya senaryolarında karşılaşabileceğimiz güvenlik, veri kalıcılığı ve HTTPS gibi önemli konulara değindik. Son olarak, çoklu Docker Compose dosyaları, CI/CD entegrasyonu ve hata ayıklama gibi ileri düzey tekniklerle ortamımızı daha da optimize etme yollarını keşfettik.

Bu kurulum, sadece yerel geliştirme ortamınızı iyileştirmekle kalmayacak, aynı zamanda uygulamanızın dağıtım süreçlerini de basitleştirecektir. Docker Compose, modern web geliştiricilerinin araç kutusunda vazgeçilmez bir yer edinmiş olup, projelerinizi daha hızlı, daha güvenilir ve daha ölçeklenebilir bir şekilde hayata geçirmenize olanak tanır. Unutmayın, pratik yapmak ve farklı senaryoları denemek, bu araçlarda ustalaşmanın anahtarıdır.

Sıkça Sorulan Sorular

1. Docker Compose ile kurduğum veritabanı verileri kaybolur mu?
Hayır, docker-compose.yml dosyasında tanımladığımız dbdata gibi Docker volumes kullanarak veritabanı verilerinin kalıcı olmasını sağladık. Konteynerler silinse veya yeniden oluşturulsa bile bu volume içindeki veriler korunur.
2. Nginx yerine Apache kullanabilir miyim?
Evet, kesinlikle kullanabilirsiniz. Nginx yerine Apache imajını (örneğin, httpd:alpine) kullanabilir ve Nginx için yaptığımız gibi Apache için de ayrı bir yapılandırma dosyası oluşturup Docker Compose dosyasında ilgili servisi güncelleyebilirsiniz. Temel mantık aynı kalacaktır.
3. Laravel projemde Composer bağımlılıklarını nasıl güncellerim?
Laravel konteyneri içinde Composer’ı çalıştırmanız gerekir. Bunun için aşağıdaki komutu kullanabilirsiniz:
docker compose exec app composer update

Bu komut, app servisi konteyneri içinde composer update komutunu çalıştırır ve bağımlılıklarınızı günceller.

4. Yeni bir PHP uzantısı eklemem gerekirse ne yapmalıyım?
Yeni bir PHP uzantısı eklemeniz gerektiğinde, docker/php/Dockerfile dosyasını düzenlemeniz ve gerekli uzantıyı eklemeniz gerekir (örneğin, RUN docker-php-ext-install new_extension). Değişiklikleri yaptıktan sonra, PHP konteynerinizi yeniden inşa etmeniz ve başlatmanız gerekir:
docker compose up -d --build app

Bu komut sadece app servisini yeniden inşa edip başlatacaktır.

5. Geliştirme ortamında HTTPS kullanmak zorunda mıyım?
Hayır, geliştirme ortamında HTTPS kullanmak zorunlu değildir ve genellikle HTTP (port 80) üzerinden çalışmak daha hızlı ve basittir. HTTPS yapılandırması genellikle üretim ortamları için kritik öneme sahiptir. Ancak, tarayıcıların bazı yeni özelliklerinin (örneğin, Geolocation API) sadece HTTPS üzerinden çalıştığını unutmayın. Bu tür özelliklere ihtiyacınız varsa, geliştirme ortamınızda da HTTPS kullanmayı düşünebilirsiniz.

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.
Mobil sürümden çık