Skip to main content

Ubuntu 22.04 Üzerinde Docker Compose ile Laravel Kurulumu 🚀


💡 Bu Rehberde Ne Öğreneceksiniz

Bu rehberde, Docker Compose kullanarak Laravel uygulamanızı PHP-FPM, MySQL ve Nginx servislerinden oluşan izole bir ortamda çalıştırmayı öğreneceksiniz. Bu yapı, hem yerel geliştirme hem de üretim öncesi test süreçlerinde taşınabilir, hızlı ve güvenli bir çözüm sunar.


🧠 Teknik Özet

  • Konu: Docker Compose ile Ubuntu 22.04 üzerinde Laravel geliştirme ortamı oluşturma
  • Amaç: Laravel, PHP, Nginx ve MySQL bileşenlerini konteyner tabanlı çalıştırmak
  • Avantaj: Manuel kurulum gerekmeden, izole ve taşınabilir bir geliştirme ortamı

⚙️ Adım 1: Örnek Uygulamayı İndirme

Örnek Laravel uygulamasını indirerek başlayalım:

cd ~
curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o gezilistesi.zip
sudo apt update && sudo apt install unzip -y
unzip gezilistesi.zip
mv travellist-laravel-demo-tutorial-1.0.1 gezilistesi-demo
cd gezilistesi-demo

Bu işlemler, uygulama dosyalarını gezilistesi-demo klasörüne çıkarır.


⚙️ Adım 2: Laravel .env Dosyasını Yapılandırma

Ortam değişkenlerini Docker konteynerlerine uygun hale getirelim.

cp .env.example .env
nano .env

Aşağıdaki değişiklikleri yapın:

APP_NAME=Gezilistesi
APP_ENV=local
APP_URL=http://localhost:8000

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=gezilistesi
DB_USERNAME=gezilistesi_user
DB_PASSWORD=sifre123

DB_HOST=db olarak ayarlamak, Laravel'in Docker içindeki MySQL servisine bağlanmasını sağlar.


🐳 Adım 3: app Servisi İçin Dockerfile Oluşturma

app servisi, PHP-FPM ve Composer’ı barındırır.

nano Dockerfile

İçeriği ekleyin:

FROM php:7.4-fpm
ARG user
ARG uid
RUN apt-get update && apt-get install -y \
git curl libpng-dev libonig-dev libxml2-dev zip unzip \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN useradd -G www-data,root -u $uid -d /home/$user $user && \
mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
WORKDIR /var/www
USER $user

Bu yapı, PHP eklentilerini yükler, Composer ekler ve Artisan komutlarının düzgün çalışması için kullanıcı izinlerini ayarlar.


🌐 Adım 4: Nginx ve MySQL Yapılandırmaları

Nginx için yapılandırma dizini oluşturun:

mkdir -p docker-compose/nginx
nano docker-compose/nginx/gezilistesi.conf

Aşağıdaki içeriği ekleyin:

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;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}

MySQL için başlangıç verilerini oluşturun:

mkdir docker-compose/mysql
nano docker-compose/mysql/init_db.sql

İçeriği ekleyin:

CREATE TABLE yerler (
id bigint unsigned AUTO_INCREMENT PRIMARY KEY,
isim varchar(255) NOT NULL,
ziyaret_edildi tinyint(1) DEFAULT 0
);
INSERT INTO yerler (isim, ziyaret_edildi)
VALUES ('İstanbul',0),('İzmir',1),('Ankara',0);

Bu tablo, uygulama açıldığında örnek verilerle otomatik oluşturulur.


🧩 Adım 5: docker-compose.yml Dosyasını Oluşturma

Tüm servisleri aynı ağda tanımlayalım:

nano docker-compose.yml

İçeriği ekleyin:

version: "3.7"
services:
app:
build:
context: ./
dockerfile: Dockerfile
args:
user: rabisu-dev
uid: 1000
image: gezilistesi-app
container_name: gezilistesi-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- gezilistesi-net

db:
image: mysql:8.0
container_name: gezilistesi-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:
- gezilistesi-net

nginx:
image: nginx:alpine
container_name: gezilistesi-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- gezilistesi-net

networks:
gezilistesi-net:
driver: bridge

Üç konteyner de gezilistesi-net adlı köprü ağı üzerinde birbirine bağlıdır.


🧨 Adım 6: Uygulamayı Başlatma

Docker ortamını oluşturup başlatın:

docker-compose build app
docker-compose up -d

Durumu kontrol edin:

docker-compose ps

Bağımlılıkları kurun:

docker-compose exec app composer install

Uygulama anahtarını oluşturun:

docker-compose exec app php artisan key:generate

Artık Laravel uygulamanız çalışmaya hazır!


🌍 Adım 7: Uygulamayı Test Etme

Tarayıcıda şu adresi açın:

http://localhost:8000

Laravel karşılama sayfası görünüyorsa, ortam başarıyla yapılandırılmış demektir. 🎉


🧠 Adım 8: Docker Compose Yönetimi

Servisleri duraklatın:

docker-compose pause

Devam ettirin:

docker-compose unpause

Tamamen durdurun:

docker-compose down

Bu komut konteynerleri, ağları ve hacimleri siler, ancak proje dosyalarınız korunur.


❓ Sıkça Sorulan Sorular (SSS)

1. Neden üç konteyner kullanıyoruz?

Her servis kendi ortamında çalışır, bu da güvenlik, bakım ve ölçeklenebilirlik açısından avantaj sağlar.

2. Neden bind mounts kullanılıyor?

Yerel kod değişiklikleri anında konteynerde yansır; canlı geliştirme için idealdir.

3. docker-compose exec komutu ne işe yarar?

Konteyner içine girmeden komut çalıştırmanıza yarar (örneğin composer install, php artisan migrate).

4. -d parametresi ne anlama gelir?

Servisleri arka planda çalıştırır; terminalinizi meşgul etmez.

5. Veritabanı verileri silinir mi?

Hayır, docker-compose/mysql klasöründeki veri dosyaları volume olarak korunur.


🏁 Sonuç

Bu rehberle, Ubuntu 22.04 üzerinde Docker Compose kullanarak Laravel uygulamasını başarıyla konteynerize ettiniz. Artık tüm bileşenler (PHP, MySQL, Nginx) izole ve taşınabilir bir ortamda çalışıyor.

💡 Geliştirme süreçlerinizi hızlandırmak ve aynı yapıyı buluta taşımak için Rabisu Bulut platformunda kendi sanal sunucunuzu oluşturabilir, Laravel projenizi dakikalar içinde ayağa kaldırabilirsiniz! 🌩️