Docker Compose İle Laravel Kurulumu ve Geliştirme Ortamı Hazırlama 🐳
Bu rehberde, Docker Compose kullanarak Laravel uygulamanızı Ubuntu 22.04 üzerinde nasıl üç ayrı konteynerde (PHP-FPM, MySQL, Nginx) hızlıca kurabileceğinizi öğreneceksiniz. Geliştirme ortamınız tamamen izole olacak ve taşınabilir bir yapı elde edeceksiniz. Bu yöntem, özellikle ekip çalışmasında ve ortamlardaki tutarlılığı sağlamak için oldukça faydalıdır.
Bu Rehberde Ne Öğreneceksiniz?
Laravel uygulamanızı Docker Compose ile nasıl konteynerleştireceğinizi öğreneceksiniz. PHP-FPM, MySQL ve Nginx servislerini üç ayrı konteynerde çalıştıracak, böylece izole edilmiş ve taşınabilir bir geliştirme ortamı oluşturacaksınız. Ayrıca, bu ortamı kolayca çoğaltabilir ve üretime geçmeden önce tüm uygulamanızı test edebilirsiniz.
Ön Koşullar
Başlamadan önce aşağıdaki araçların kurulu olması gerektiğini unutmayın:
- Ubuntu 22.04 işletim sistemi (sudo yetkili bir kullanıcı)
- Docker
- Docker Compose
1. Demo Uygulama Kodunu İndirme
Başlamak için Laravel uygulamanızın demo versiyonunu GitHub'dan çekelim.
Kodları İndirme ve Çıkarma
Öncelikle uygulama kodlarını ana dizininize (~) indirin:
cd ~
curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
Sonra, dosyayı çıkartın ve dizini yeniden adlandırın:
sudo apt update
sudo apt install unzip
unzip travellist.zip
mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
cd travellist-demo
2. Ortam Değişkenleri Dosyasını Ayarlama (.env)
Laravel, ortam bağımlı ayarları .env dosyasına kaydeder. Bu dosyayı Docker servis adlarına göre güncellememiz gerekiyor.
.env Dosyasını Oluşturma ve Düzenleme Öncelikle, .env.example dosyasını kopyalayarak yeni bir .env dosyası oluşturun:
cp .env.example .env
nano .env
Veritabanı hizmeti db olarak tanımlanacağı için, DB_HOST değerini db olarak değiştirin:
DB_CONNECTION=mysql
DB_HOST=db # Burayı db olarak değiştirin
DB_PORT=3306
DB_DATABASE=rabisu_list
DB_USERNAME=rabisu_user
DB_PASSWORD=cokgizlisifre
Bu değişiklikle, Docker ortamında veritabanı servisi ile bağlantı sağlanacaktır.
3. Uygulama Konteyneri İçin Dockerfile Hazırlama
PHP-FPM üzerinde çalışan uygulama konteynerimiz için özel bir Dockerfile oluşturacağız. Bu, Composer ve gerekli PHP modüllerini içerecek.
Dockerfile Oluşturma
nano Dockerfile
Aşağıdaki içeriği Dockerfile'a ekleyin:
FROM php:7.4-fpm
# Docker Compose'de tanımlanan argümanlar
ARG user
ARG uid
# Sistem bağımlılıklarını kurma
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# PHP eklentilerini kurma
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Composer'ı ekleme
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Kullanıcı oluşturma
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
WORKDIR /var/www
USER $user
Neden Bu Dockerfile Kullanılır? PHP-FPM için gerekli bağımlılıkları yükler, Composer'ı içerir ve çalışma dizini ile kullanıcı izinlerini ayarlar. Bu yapı, Laravel uygulamanızın sağlıklı bir şekilde çalışabilmesi için gereklidir.
4. Nginx ve MySQL Yapılandırma Dosyalarını Hazırlama
Şimdi, Nginx ve MySQL için yapılandırma dosyalarını hazırlamalıyız.
Nginx Yapılandırma Dosyası
Nginx'in Laravel'i nasıl sunacağını belirlemek için docker-compose/nginx/rabisu_app.conf dosyasını oluşturun:
mkdir -p docker-compose/nginx
nano docker-compose/nginx/rabisu_app.conf
İçeriği aşağıdaki gibi ayarlayın:
server {
listen 80;
index index.php index.html;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
MySQL İlk Yükleme Dosyası
Veritabanı ilk yükleme dosyasını docker-compose/mysql/init_db.sql olarak oluşturun:
mkdir docker-compose/mysql
nano docker-compose/mysql/init_db.sql
Aşağıdaki SQL komutlarını ekleyin:
DROP TABLE IF EXISTS `yerler`;
CREATE TABLE `yerler` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`isim` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`ziyaret_edildi` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `yerler` (isim, ziyaret_edildi) VALUES ('Istanbul',0),('Ankara',0),('Izmir',1);
5. Docker Compose Yapılandırma Dosyasını Tanımlama (docker-compose.yml)
Şimdi, Laravel uygulamamız için üç konteyneri tanımlayacağımız docker-compose.yml dosyasını oluşturalım.
nano docker-compose.yml
Aşağıdaki içeriği ekleyin:
version: "3.7"
services:
app:
build:
args:
user: rabisu_dev
uid: 1000
context: ./
dockerfile: Dockerfile
image: rabisu_laravel
container_name: rabisu-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- rabisu_net
db:
image: mysql:8.0
container_name: rabisu-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- rabisu_net
nginx:
image: nginx:alpine
container_name: rabisu-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- rabisu_net
networks:
rabisu_net:
driver: bridge
6. Ortamı Çalıştırma ve Laravel'i Yapılandırma
Tüm yapılandırmaları tamamladıktan sonra, Docker Compose kullanarak ortamı çalıştıracağız.
Uygulama İmajını İnşa Etme
docker-compose build app
Konteynerleri Başlatma
docker-compose up -d
Hizmet Durumunu Kontrol Etme
docker-compose ps
Laravel Bağımlılıklarını Kurma
docker-compose exec app composer install
Laravel Anahtarını Oluşturma
docker-compose exec app php artisan key:generate
Uygulama başarılı bir şekilde çalıştığında, tarayıcınızda http://localhost:8000 adresine giderek test edebilirsiniz.
Sıkça Sorulan Sorular (SSS)
- Konteyner nedir ve neden kullanmalıyım?
Konteyner, uygulamanızı ve tüm bağımlılıklarını izole bir ortamda çalıştıran hafif sanallaştırma teknolojisidir. Farklı ortamlarda tutarlı ve taşınabilir çalışmasını sağlar.
- docker-compose.yml dosyasındaki volumes ne işe yarar?
Volumes, yerel dosya sisteminiz ile konteyner arasında veri paylaşımını sağlar. Böylece, geliştirme sırasında yaptığınız değişiklikler anında konteyner içinde yansır.
- Neden Dockerfile kullandık?
MySQL ve Nginx için hazır imajlar yeterliyken, Laravel uygulaması için PHP modülleri, Composer ve kullanıcı izinlerini ayarlamak için özel bir Dockerfile kullanmak gereklidir.
Sonuç
Laravel uygulamanızı Docker Compose ile kolayca izole edilmiş ve taşınabilir bir ortamda çalıştırabilirsiniz. Bu rehber, uygulamanızın hızlıca geliştirilmesi ve taşınması için size güçlü bir temel sağlar.