Lewati ke konten

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.

  • Laravel 10
  • PHP-FPM 8.1+
  • MySQL 8.0
  • phpMyAdmin (opsional, non-production)
  • Nginx (Reverse Proxy)
  • Docker Compose v2

  • 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)”
Terminal window
sudo apt update -y
sudo apt install -y ca-certificates curl gnupg
Terminal window
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Terminal window
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 -y
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Verifikasi:

Terminal window
docker version
docker compose version

  • Directorylaravel-docker/
    • Directoryapp/ # Source code Laravel
      • …
    • Directorydocker/
      • Directorynginx/
        • default.conf
      • Directoryphp/
        • Dockerfile
        • php.ini
    • docker-compose.yml
    • .env

APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

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:

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;
}
}

Terminal window
docker compose up -d --build

Generate APP_KEY Laravel:

Terminal window
docker compose exec app php artisan key:generate

Akses aplikasi:


  • 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

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.