Deploy Laravel 10 Modern dengan Docker (Best Practice 2024β2025)
- Best Practice
π Pendekatan modern dan production-friendly untuk menjalankan Laravel 10 dengan Docker di Ubuntu 22.04 / 24.04 β lebih rapi, aman, dan mudah dirawat.
π¦ Stack yang Digunakan
Section titled βπ¦ Stack yang Digunakanβ- Laravel 10
- PHP-FPM 8.1+
- MySQL 8.0
- phpMyAdmin (opsional, non-production)
- Nginx (Reverse Proxy)
- Docker Compose v2
π§ Perbedaan Utama Dibanding Setup Lama
Section titled βπ§ Perbedaan Utama Dibanding Setup Lamaβ- Tidak menggunakan static IP container
- Database tidak diekspos ke host
- Konfigurasi pakai
.env - Persistent data pakai named volume
- Docker Compose v2 (
docker compose) - phpMyAdmin hanya aktif saat dibutuhkan
π³ Step 1 β Install Docker Engine (Metode Resmi)
Section titled βπ³ Step 1 β Install Docker Engine (Metode Resmi)βsudo apt update -ysudo apt install -y ca-certificates curl gnupgsudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho \ "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 -ysudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginVerifikasi:
docker versiondocker compose versionπ Step 2 β Struktur Proyek
Section titled βπ Step 2 β Struktur ProyekβDirectorylaravel-docker/
Directoryapp/ # Source code Laravel
- β¦
Directorydocker/
Directorynginx/
- default.conf
Directoryphp/
- Dockerfile
- php.ini
- docker-compose.yml
- .env
π Step 3 β Konfigurasi Environment (.env)
Section titled βπ Step 3 β Konfigurasi Environment (.env)βAPP_NAME=LaravelAPP_ENV=localAPP_KEY=APP_DEBUG=trueAPP_URL=http://localhost
DB_CONNECTION=mysqlDB_HOST=dbDB_PORT=3306DB_DATABASE=laravelDB_USERNAME=laravelDB_PASSWORD=secretπ οΈ Step 4 β Dockerfile PHP-FPM
Section titled βπ οΈ Step 4 β Dockerfile PHP-FPMβdocker/php/Dockerfile:
FROM php:8.1-fpm
RUN apt-get update && apt-get install -y \ git curl zip unzip libpng-dev libonig-dev libxml2-dev \ && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/htmlπ§© Step 5 β docker-compose.yml (Modern & Rapi)
Section titled βπ§© Step 5 β docker-compose.yml (Modern & Rapi)βservices: app: build: context: . dockerfile: docker/php/Dockerfile container_name: laravel-app volumes: - ./app:/var/www/html env_file: - .env depends_on: - db
web: image: nginx:alpine container_name: nginx ports: - "80:80" volumes: - ./app:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app
db: image: mysql:8.0 container_name: mysql restart: always environment: MYSQL_DATABASE: laravel MYSQL_USER: laravel MYSQL_PASSWORD: secret MYSQL_ROOT_PASSWORD: root volumes: - dbdata:/var/lib/mysql
phpmyadmin: image: phpmyadmin container_name: phpmyadmin ports: - "8081:80" environment: PMA_HOST: db profiles: - debug
volumes: dbdata:π Step 6 β Konfigurasi Nginx
Section titled βπ Step 6 β Konfigurasi Nginxβdocker/nginx/default.conf:
server { listen 80; index index.php index.html; root /var/www/html/public;
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; }}π Step 7 β Jalankan Stack
Section titled βπ Step 7 β Jalankan Stackβdocker compose up -d --buildGenerate APP_KEY Laravel:
docker compose exec app php artisan key:generateAkses aplikasi:
- Laravel: http://localhost
- phpMyAdmin (debug): http://localhost:8081
π§ Catatan Production
Section titled βπ§ Catatan Productionβ- Gunakan
.env.production - Jangan jalankan phpMyAdmin di production
- Tambahkan HTTPS (Traefik atau Nginx + Certbot)
- Pertimbangkan container terpisah untuk queue & scheduler
- Gunakan backup untuk volume database
β Penutup
Section titled ββ PenutupβSetup ini sengaja dibuat membosankan β dan justru itu kelebihannya.
Compose file simpel, network bisa diprediksi, dan minim komponen aneh = minim drama.
Kalau kamu migrasi dari setup Laravel Docker lama, struktur ini cocok dijadikan baseline ke depan.