- Problem Klasik Developer
- Crafting Docker Sendiri Itu Ribet
- Laravel Sail Solusi Official
- Projek Baru Dengan Laravel Sail
- Port Default
- Setup Laravel Sail ke Projek Lama
- Git Clone Projek Sail
- Shell Alias
- Operasi Container (Run, Restart, Remove, dll)
- Artisan, Composer, npm, Database?
- Masuk ke Shell di Dalam Container
- Tambah Servis Baru
Problem Klasik Developer
Ganti OS? Projek broken.
Upgrade OS? Projek yang lagi dikerjain tiba-tiba gak jalan.
Projek working di mesin/laptop sendiri, tapi error di punya kolega?
Projek dari jaman tobangado tiba-tiba perlu diupdate. Dan udah susah di-setup karena stack udah terlalu lama? Masih pakai MySql 5 lah, php7.1 lah, dan lain-lain… dan lain-lain.
Solusinya: docker (meskipun cuman untuk development).
Crafting Docker Sendiri Itu Ribet
Saya termasuk yang adopsi docker dari dulu. Dari jaman masih PHP versi 7, Laravel versi 5, dan jQuery masih the king.
Buat saya pribadi, docker itu ribet. Konsepnya “beda” kayak kerja biasa. Mau bikin koneksi database susah, mau eksekusi perintah CLI susah. Dan juga sering ketipu sama tutorial docker yang ditujukan untuk production alih-alih untuk development. Akhirnya apa? Dockerfile dieksekusi berkali-kali tiap kali save file! Wkwk.
Sudah nyoba beberapa solusi: dari mulai bikin sendiri (jelek, tapi jalan), terus pakai third party library (dulu ada yg populer, lupa namanya), sampai pernah juga beralih ke solusi Virtual Machine seperti homestead (tapi lemot).
Laravel Sail Solusi Official
Sampai akhirnya sekitar tahun 2020 ada solusi official dari laravel untuk docker: yakni laravel sail.
Sudah ada package composer-nya.
Sudah ada artisan-nya.
Sudah ada docker image yang ready to use, tinggal build aja di local.
Sudah ada konfigurasinya.
Bahkan juga udah ada integrasi sama tool-tool development lain seperti redis untuk caching, Meilisearch untuk pencarian, sama mailpit untuk email (yang ini favorit saya pribadi).
Projek Baru Dengan Laravel Sail
Sayangnya, sejak laravel versi 12, LARAVEL SAIL UDAH dianggap jadi second class citizen. Udah gak muncul di halaman instalasi di dokumentasi resmi. Karena sejak versi 12, laravel justru mempromosikan Laravel Herd (produk berbayar punya mereka, tentu setelah dapat pendanaan).
Jadi kalau mau baca-baca soal laravel sail, harus ke bagian khusus untuk laravel sail. Bukan di halaman instalasi utama.
Tapi tenang aja, cara official instalasinya masih working sampai sekarang (sampai laravel terbaru alias laravel 12 saat artikel ini ditulis). Dan juga masih bisa dicek di halaman instalasi laravel 11 ke belakang.

Catatan sebelum mulai instalasi: saya tidak menginstall php native di mesin saya pribadi karena semua projek php sudah menggunakan docker / sail.
php --version
zsh: command not found: php
Instalasi projek baru laravel dengan sail (di linux):
curl -s "https://laravel.build/nama-projek-kita" | bash
Perintah di atas akan otomatis membuat direktori baru dengan nama nama-projek-kita, lengkap dengan laravel terbaru dan sail yang siap digunakan.

Bahkan, composer install udah dilakukan, database sudah di-create. Jadi kita sudah TIDAK PERLU setup database lagi. Tinggal pakai. Tinggal running artisan:
sail up -d # jalankan container
sail artisan migrate
Catatan:
- Untuk build image pertama kali biasanya perlu waktu yang cukup lama. Tapi kalau sudah pernah sebelumnya, prosesnya akan menjadi lebih cepat.
- Untuk pengguna linux, ada kemungkinan / kasus bahwa ownership file projek yang baru dibuat adalah ownership user
root:root. Jadi untuk menghindary permission error, kita perlu ubah ownership seluruh file projek ke user kita yang sedang aktif:cd nama-projek sudo chown -R $USER:$USER .
Env & Database Default
Penting untuk diketahui bahwa projek baru sudah memiliki file .env. Tapi secara default, database yang digunakan adalah mysql dengan nama database laravel sesuai dengan env variables:
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=laravel
Dan jika kita ingin mengganti nama database (misal), kita bisa mengganti nama database dari env, kemudian hapus volumes dari sail, dan jalankan ulang, sehingga dia akan membuat database baru dengan nama laravel lengkap beserta username dan passsword-nya:
sail down -v # hentikan proses + hapus volume
sail up -d # jalankan lagi
Port Default
Secara default, laravel sail akan jalan di dalam port 80. Jadi kita bisa mengakses projek cukup dengan mengunjungi url http://localhost.
Bagaimana kalau kita ingin projek laravel kita jalan di port lain?
Kita tinggal stop container (kalau lagi jalan).
Edit .env, dan tambahkan APP_PORT ke port yang kita inginkan:
APP_PORT=5033 # port baru
Kita juga bisa ganti port forward mysql dari yang default-nya adalah 3306 menjadi terserah kita:
FORWARD_DB_PORT=3308
Jangan lupa untuk melakukan restart container agar sebelum perubahan port aktif.
Setup Laravel Sail ke Projek Lama
Sedangkan untuk projek lama, dengan asumsi mesin/komputer host kita sudah memiliki php, composer, dan lain-lain. Kita tinggal menginstall laravel sail seperti berikut:
composer require laravel/sail --dev
Kemudian jalankan:
php artisan sail:install
Git Clone Projek Sail
Ada hal unik yang selalu terjadi ketika kita clone projek sail di mesin / laptop / os baru yang mana:
- environment baru gak ada
php - mau jalankan
sail, tapi foldervendorbelum ada (karena baru clone) - mau jalankan
composer install, tapi gak adaphpsamacomposer
Solusinya?
Kita bisa pakai docker image punya laravel sail juga! Perintahnya seperti ini:
docker run --rm \
-u "$(id -u):$(id -g)" \
-v "$(pwd):/var/www/html" \
-w /var/www/html \
laravelsail/php84-composer:latest \
composer install --ignore-platform-reqs
Teman-teman tinggal sesuaikan image-nya sesuai dengan versi php yang dibutuhkan, pada contoh di atas, image yg dipakai adalah untuk php8.4 (laravelsail/php84-composer).
Sayangnya perintah di atas udah gak disebutkan di dokumentasi Laravel 12, tapi masih bisa kita temukan di dokumentasi versi 11.
Note: jangan lupa untuk copy file .env.example ke .env sebelum menjalankan sail up (agar database di-create dengan benar).
Shell Alias
Secara default, perintah sail ada di dalam folder vendor/bin/sail. Jadi setiap kali kita mau memanggil sail, kita harus panggil path-nya secara lengkap:
./vendor/bin/sail artisan route:list
Agar bisa lebih singkat, kita bisa membuat alias dengan perintah berikut:
alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
Taruh perintah di atas di dalam file ~/.bashrc dan ~/.zhrc dan kita akan bisa memanggil sail dengan lebih singkat:
sail artisan route:list
Operasi Container (Run, Restart, Remove, dll)
Untuk mengoperasikan container, kita bisa menggunakan perintah-perintah berikut:
Menjalankan sail:
sail up
Menjalankan sail di dalam background:
sail up -d
Me-rebuild ulang image:
sail build --no-cache
Men-stop container:
sail down
Stop Container + Hapus volume (kalau kita mau reset database, bisa pakai ini):
sail down -v
Melihat service yang berjalan:
sail ps
Melihat log service:
sail logs
Artisan, Composer, npm, Database?
Untuk artisan dan composer, mirip seperti halnya ketika kita melakukannya langsung di OS host. Hanya saja kita perlu tambahkan sail di depannya, contoh:
sail artisan migrate # untuk migrasi
sail artisan route:list # untuk list route
sail artisan queue:work # untuk running queue
sail composer install # untuk run composer install
sail composer require paket/paket # untuk install paket composer baru
Untuk npm juga sudah include dalam image:
sail node --version
sail npm install
sail npm run dev
sail npm run build
Dan untuk masuk ke dalam mysql via CLI:
sail mysql
Masuk ke Shell di Dalam Container
sail shell
Masuk sebagai root:
sail root-shell
Dua perintah di atas jauh lebih singkat dari pada menggunakan docker compose asli:
docker compose exec -ti laravel.test bash
Tambah Servis Baru
Laravel sail memiliki beberapa service default. Kita bisa cek dengan perintah:
sail artisan sail:add
Pilihannya banyak, bisa discroll ke bawah (pakai arrow down):


Service yang kita pilih, akan ditambahkan pada file compose.yml atau docker-compose.yml. Dan karena sail hanyalah wrapper untuk docker compose, kita bisa menambahkan berbagai macam image lain baik image publik mau pun private seperti halnya docker biasa.
Terima kasih banyak!