📦 Pendahuluan
Laravel adalah salah satu framework PHP paling populer dan powerful. Supaya project Laravel kita bisa berjalan lebih konsisten dan portabel di berbagai environment (terutama untuk tim atau server production), Docker menjadi solusi modern untuk containerization.
Pada artikel ini, saya akan membagikan pengalaman bagaimana saya membuat dan deploy project Laravel ke dalam container Docker, dan menghubungkannya dengan database MySQL/MariaDB, termasuk bagaimana integrasinya dengan container database yang sudah berjalan di luar Docker Compose.
🛠️ Stack yang Digunakan
- Laravel 11
- PHP 8.3 (Apache)
- MySQL 8.3 / MariaDB (di container terpisah)
- Docker & Docker Compose
- Composer
🎯 Tujuan
- Men-deploy Laravel ke dalam Docker container
- Menghubungkan Laravel ke database MariaDB yang sudah berjalan
- Menjelaskan proses build, konfigurasi .env, dan manajemen image/container
🧱 Struktur Project Docker
Dalam project Laravel ini, kita menggunakan:
- PHP 8.3 + Apache sebagai web server
- Mysql sebagai database
- File konfigurasi: Dockerfile, .env, dan docker-compose.yml
🛠️ 1. Dockerfile
FROM php:8.3-apache # Install PHP extensions RUN apt-get update && apt-get install -y \ git zip unzip curl libpng-dev libjpeg-dev libonig-dev libxml2-dev libzip-dev \ libpq-dev libicu-dev g++ \ && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip intl # Enable Apache mod_rewrite RUN a2enmod rewrite # Set working directory WORKDIR /var/www/html # Set Git safe directory RUN git config --global --add safe.directory /var/www/html # Copy Apache vhost config COPY docker/apache/vhost.conf /etc/apache2/sites-available/000-default.conf # Copy project files COPY . . # Install Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Install Laravel dependencies RUN composer install --optimize-autoloader --no-dev # Set permissions RUN chown -R www-data:www-data /var/www/html && chmod -R 755 /var/www/html EXPOSE 80
⚙️ 2. Contoh docker-compose.yml
Jika database sudah berjalan di luar (misal di Synology NAS), kita cukup hubungkan Laravel container ke network eksternal:
version: "3.8" services: app: build: context: . dockerfile: dockerfile container_name: your_app ports: - "2025:80" volumes: - .:/var/www/html depends_on: - db environment: - APP_ENV=local - APP_DEBUG=true - DB_HOST= "Your Host" #Maybe Local Host - DB_PORT=3306 - DB_DATABASE="Your Database" - DB_USERNAME="Your Username" - DB_PASSWORD="Your Password" db: image: mysql:8.3 container_name: mysql_db restart: unless-stopped ports: - "3307:3306" # Post to public port environment: MYSQL_DATABASE: "Your Database" MYSQL_USER: "Your Username" MYSQL_PASSWORD: "Your Password" MYSQL_ROOT_PASSWORD: "Your Password Root" volumes: - db_data:/var/lib/mysql volumes: db_data:
📄 3. Konfigurasi .env Laravel
Sesuai dengan pengaturan database yang sudah ada:
APP_NAME=Laravel APP_ENV=local APP_KEY= APP_DEBUG=true APP_TIMEZONE=UTC APP_URL=http://localhost APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US APP_MAINTENANCE_DRIVER=file # APP_MAINTENANCE_STORE=database PHP_CLI_SERVER_WORKERS=4 BCRYPT_ROUNDS=12 LOG_CHANNEL=stack LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=sqlite # DB_HOST=127.0.0.1 # DB_PORT=3306 # DB_DATABASE=laravel # DB_USERNAME=root # DB_PASSWORD= SESSION_DRIVER=database SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null BROADCAST_CONNECTION=log FILESYSTEM_DISK=local QUEUE_CONNECTION=database CACHE_STORE=database CACHE_PREFIX= MEMCACHED_HOST=127.0.0.1 REDIS_CLIENT=phpredis REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=log MAIL_HOST=127.0.0.1 MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="[email protected]" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}"
🚀 Build & Deploy
- Build Laravel container:
docker compose up -d --build
- Akses di browser:
http://localhost:8080 //sesuaikan port yang sudah dibuat
🧠 Tips Tambahan
- Pastikan .env tidak dimasukkan ke Docker Hub: tambahkan ke .dockerignore
- Gunakan docker exec -it untuk mengakses container secara langsung
- Gunakan volume mount agar perubahan file langsung tercermin di container
✅ Kesimpulan
Dengan pendekatan ini, kita bisa:
- Menjalankan Laravel di Docker dengan PHP 8.3 + Apache
- Menghubungkan Laravel ke MySQL/MariaDB yang sudah ada
- Menjaga project tetap portable, reproducible, dan mudah dideploy
Semoga artikel ini membantu kamu yang sedang belajar atau membangun sistem Laravel dengan Docker!
Selamat bereksperimen! 🚢