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),nginxvemysql.appservisi:Dockerfile‘dan oluşturulur, yerel./appklasörünü konteyner içindeki/var/www/html‘e bağlar velaravel_networkağına dahil olur.nginxservisi: Resminginx:stable-alpineimajı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.appservisine bağımlıdır.mysqlservisi: Resmimysql:8.0imajını kullanır, ortam değişkenleri ile veritabanı ayarlarını yapar, verilerin kalıcılığı içinmysql_dataisimlendirilmiş 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 projemizinpublicdizinini web kök dizini olarak ayarlar.location / { ... }: Gelen tüm istekleri Laravel’inindex.phpdosyasına yönlendirir.location ~ \.php$ { ... }: PHP dosyalarına gelen istekleriapp:9000adresindeki PHP-FPM servisine yönlendirir.app,docker-compose.ymldosyamı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öneticisiapkkullanarak gerekli sistem bağımlılıklarını yükleriz.&& docker-php-ext-install ...: Laravel için gerekli olanpdo_mysql,mbstring,gd,bcmathgibi 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.
Dockerfileiç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
-
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.
-
Veritabanı verilerim kaybolur mu?
Hayır,
docker-compose.ymldosyasında tanımladığımızmysql_datagibi 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. -
Ü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.
-
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 installveyadocker compose exec app composer updatekomutlarını kullanabilirsiniz. Bu komutlar, PHP-FPM konteyneri içinde Composer’ı çalıştırır. -
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.inidosyasına eklenmelidir vedocker-compose.ymldosyasında ilgili portların açılması gerekebilir.