- Ubuntu 22.04 üzerinde Laravel'i Docker Compose ile nasıl kurup yapılandırabilirim?
- İlk kontrol listesi
- Ubuntu 22.04'e Docker ve Docker Compose Kurulumu
- Önerilen proje yapısı
- PHP-FPM için Önerilen Dockerfile (PHP 8.1)
- docker-compose.yml örneği
- Nginx yapılandırma dosyası (docker/nginx/default.conf)
- Kodun hazırlanması ve bağımlılıkların yüklenmesi
- Docker için .env dosyasının ayarlanması
- SSL ve Let's Encrypt — İki Kolay Yol
- Başlatma sırasında çalıştır ve hizmeti sürdür
- Pratik güvenlik ipuçları
- Üretim ortamları için performans optimizasyonu
- Sıradaki çalışanlar ve Horizon
- Konum ve veri merkezi seçimiyle ilgili ipuçları
- Yedeklemeler, izleme ve kayıtlar
- Genel hata ayıklama
- Sonuç ve nihai öneri
- İlgili hizmetler
- Sıkça Sorulan Sorular
Ubuntu 22.04 üzerinde Laravel'i Docker Compose ile nasıl kurup yapılandırabilirim?
Bu pratik ve teknik kılavuzda, bir uygulamanın kurulumu ve yapılandırılması sürecini adım adım ele alacağız. Laravel Kullanarak Docker Compose Sunucuda Ubuntu 22.04 Bu makalenin amacı, geliştiriciler, DevOps ekipleri ve teknik yöneticiler için güvenli, ölçeklenebilir ve bakımı kolay bir üretim ortamı oluşturmak üzere tekrarlanabilir yönergeler sunmaktır.
İlk kontrol listesi
Başlamadan önce lütfen aşağıdakileri hazırlayın:
- Bir sunucu Ubuntu 22.04 Kök kullanıcı erişimi veya sudo yetkisine sahip bir kullanıcı ile
- Liman işçisi (kararlı sürüm) ve Docker Compose (veya Docker Compose eklentisini kullanın)
- Açık bağlantı noktaları: 80/443 Web için; gerekirse 3306 Veya 5432 Veritabanı için (tercihen IP adresleriyle sınırlı)
- Yeterli disk alanı (SSD önerilir) ve birden fazla depolama alanından birine erişim. 85 lokasyon Bulut hizmetleri kullanılıyorsa küresel ölçekte.
- Sunucu IP adresine işaret eden alan adı ve DNS kaydı
Ubuntu 22.04'e Docker ve Docker Compose Kurulumu
Docker'ı ve docker compose eklentisini yüklemek için sunucuda aşağıdaki komutları çalıştırın:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USERArdından oturumu kapatıp tekrar giriş yapın veya yeni grup docker Kullanmak.
Kurulumu kontrol etmek için:
docker --version
docker compose versionÖnerilen proje yapısı
Bakım ve geliştirme işlemlerini kolaylaştırmak için proje klasörünün aşağıdaki gibi düzenlenmesi önerilir:
proje-kökü/liman işçisi/nginx/default.confphp/Dockerfile
kaynak/— Laravel kodu (veya mount)docker-compose.yml.çevre
PHP-FPM için Önerilen Dockerfile (PHP 8.1)
Yol içeren bir dosya docker/php/Dockerfile Aşağıdaki örneğe benzer bir şey oluşturun:
FROM php:8.1-fpm
# Install required tools and extensions
RUN apt-get update && apt-get install -y \
git zip unzip libpng-dev libjpeg-dev libfreetype6-dev libonig-dev libxml2-dev \
libzip-dev libpq-dev cron curl supervisor \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql mbstring xml bcmath zip opcache \
&& pecl install redis && docker-php-ext-enable redis \
&& pecl install xdebug || true \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Create non-root user
RUN useradd -G www-data,root -u 1000 -d /home/appuser appuser
WORKDIR /var/www/html
USER appuserdocker-compose.yml örneği
Önerilen sürüm docker-compose.yml Uygulamayı, web sunucusunu, veritabanını ve Redis'i çalıştırmak için:
version: "3.8"
services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile
image: laravel_app:latest
container_name: laravel_app
restart: unless-stopped
volumes:
- ./src:/var/www/html
- ./docker/php/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
environment:
- APP_ENV=production
- APP_DEBUG=false
networks:
- laravel-net
web:
image: nginx:alpine
container_name: laravel_web
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./src:/var/www/html:ro
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./certs:/etc/letsencrypt
depends_on:
- app
networks:
- laravel-net
db:
image: mysql:8.0
container_name: laravel_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
networks:
- laravel-net
redis:
image: redis:6-alpine
container_name: laravel_redis
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- laravel-net
volumes:
db_data:
redis_data:
networks:
laravel-net:
driver: bridgeNginx yapılandırma dosyası (docker/nginx/default.conf)
PHP-FPM (uygulama) sayfasına istekleri yönlendirmek için örnek Nginx yapılandırması:
server {
listen 80;
server_name example.com;
root /var/www/html/public;
index index.php index.html;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.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;
}
}Not: Ters proxy veya birden fazla hizmet içeren mimarilerde, Nginx'i yük dengeleyici veya CDN katmanına yerleştirebilirsiniz.
Kodun hazırlanması ve bağımlılıkların yüklenmesi
Eğer bir Laravel projeniz yoksa, Composer kullanarak yeni bir proje oluşturabilirsiniz:
composer create-project --prefer-dist laravel/laravel srcArdından konteynerleri oluşturmak ve çalıştırmak için:
docker compose build
docker compose up -dComposer ve Artisan komutlarını bir PHP konteyneri içinde çalıştırmak için:
docker exec -it laravel_app bash
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan config:cache
php artisan route:cache
exitDocker için .env dosyasının ayarlanması
Docker-compose ile uyumlu örnek .env yapılandırması:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
CACHE_DRIVER=redis
REDIS_HOST=redis
APP_URL=https://example.comSSL ve Let's Encrypt — İki Kolay Yol
HTTPS'yi etkinleştirmenin iki basit yolu vardır:
- Sunucuda Certbot kullanımı: Nginx'i geçici olarak durdurun ve verilen sertifikayı klasöre yerleştirin.
./sertifikalarve onu konteynere monte edin. - Otomatik çözümü kullanarak: Araçlar gibi docker-letsencrypt-nginx-proxy-companion Veya Trafik Otomatik sertifika yönetimi için uygundurlar.
Certbot ile hızlı bir örnek:
sudo apt install -y certbot
sudo docker compose down
sudo certbot certonly --standalone -d example.com --non-interactive --agree-tos -m [email protected]
# Copy certificates from /etc/letsencrypt/live/... to ./certs and then:
sudo docker compose up -dBaşlatma sırasında çalıştır ve hizmeti sürdür
Hizmetlerin yeniden başlatmanın ardından çalışmaya devam etmesini sağlamak için:
sudo systemctl enable dockerEk olarak, docker-compose'da yeniden başlat: durdurulmadığı sürece Kullanıldı. Gerekirse, docker-compose için bir systemd birimi oluşturulabilir.
Pratik güvenlik ipuçları
- PHP konteynerinde root olmayan bir kullanıcı kullanmak (
uygulama kullanıcısı(yukarıdaki Dockerfile'da) - Veritabanı portuna erişimi güvenlik duvarı (UFW) ile kısıtlama:
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enableDiğer öneriler:
- Veritabanı biriminin düzenli yedeğinin alınması (
db_veri) ve sunucunun dışında depolamak - HTTPS ve HSTS'yi Etkinleştirme
- Parolaları saklamak için gizli anahtarlar veya anahtar yönetim hizmetleri kullanmak (Docker gizli anahtarları veya anahtar yönetim hizmetleri)
- Aşağıdakiler gibi güvenlik araçlarını kullanın: başarısız2ban Ve gerekirse WAF gibi ModSecurity
- Trafiği korumak için bir CDN veya DDoS saldırılarına karşı koruma hizmeti kullanın.
Üretim ortamları için performans optimizasyonu
- OPcache'i etkinleştirme
php.ini:opcache.memory_consumption=256 opcache.validate_timestamps=0 - php-fpm'yi (pm = dinamik veya isteğe bağlı) kurmak ve artırmak
maksimum_çocukSunucu belleğine göre - Redis'i önbellek ve oturumlar için kullanma
- Statik dosyalar için CDN kullanmak
- Yatay ölçeklendirme: Yük dengeleyici (NGINX veya HAProxy) kullanarak uygulama hizmetinin birden fazla örneğini çalıştırmak.
- Gerçek zamanlı işlemler ve kuyruklar için ayrı çalışanlar ve denetçiler veya hizmetler kullanın.
Sıradaki çalışanlar ve Horizon
Kuyruk çalışanlarını çalıştırmak için docker-compose'a ayrı bir servis ekleyin. Örnek:
worker:
build: ...
command: php /var/www/html/artisan queue:work --sleep=3 --tries=3
depends_on: [app, redis]
restart: unless-stoppedLaravel Horizon için, PHP ve Horizon'ın kurulu olduğu özel bir konteyner kullanmak ve bunu Nginx/kimlik doğrulama sisteminin arkasına yerleştirmek en iyisidir.
Konum ve veri merkezi seçimiyle ilgili ipuçları
Yer seçimi için pratik ipuçları:
- En düşük gecikme süresi için, son kullanıcılarınıza veya hedef noktanıza yakın bir konumdaki sunucuyu seçin. Servis sağlayıcısı daha fazlasını sunar. 85 küresel lokasyon Öyle oldu.
- Oyun oynayanlar veya alım satım yapanlar için düşük ping süresine ve optimize edilmiş bir BGP ağına sahip bir konum seçin.
- Yapay zeka işleme ve görüntü oluşturma için GPU donanımlı sunucular kullanın.
- DDoS saldırılarına karşı koymak için DDoS korumasına sahip sunucular ve CDN kullanın.
Yedeklemeler, izleme ve kayıtlar
- Konteyner günlükleri ile
docker günlükleriErişilebilir durumdadırlar; merkezi toplama için ELK veya Prometheus+Grafana kullanın. - Günlük veritabanı yedeklemesi ve periyodik geri yükleme testi
- CI/CD'de CPU/RAM kaynaklarının, uygulama ve hata takibinin izlenmesi.
Genel hata ayıklama
- 502 Geçersiz Ağ Geçidi Hatası: Uygulama kapsayıcısında php-fpm'nin çalıştığından ve fastcgi_pass'ın doğru adrese ayarlandığından emin olun (
uygulama:9000) belirtmek için. - Veritabanı bağlantı sorunu: .env değişkenlerini, Docker ağını ve MySQL günlüklerini kontrol edin.
- Dosya izinleri: İzin hataları durumunda, depolama ve bootstrap/cache klasörlerinin sahipliğini ayarlayın:
sudo chown -R 1000:1000 src/storage src/bootstrap/cacheSonuç ve nihai öneri
Docker Compose kullanarak Laravel'i Ubuntu 22.04 üzerinde çalıştırmak, geliştirme ve dağıtımı basit, tekrarlanabilir ve ölçeklenebilir hale getirir. Bu kılavuzu takip ederek güvenli, hızlı ve bakımı kolay bir üretim ortamı kurabilirsiniz: Nginx ile PHP-FPMMySQL/MariaDB veya PostgreSQL, önbellek ve kuyruk için Redis ve SSL ayarları ve izleme.
İlgili hizmetler
Bu mimariyi profesyonelce uygulamak için aşağıdaki hizmetlerden yararlanabilirsiniz:
- Bundan fazla 85 küresel lokasyon Gecikmeyi azaltmak ve sunucuyu kullanıcıya veya hedefe daha yakın hale getirmek için
- Yapay zeka hesaplama ve işleme için grafik sunucusu (GPU)
- Düşük ping ve optimize edilmiş BGP ağına sahip, alım satım için VPS.
- Düşük ping ve DDoS korumasına sahip oyun VPS'si
- Hosting ve alan adı kayıt hizmetleri, CDN, ağ ve BGP çözümleri
- Yüksek performanslı bulut sunucusu ve yönetilen yedekleme









