Laravel PHP dan Nginx dengan Docker

Pada tutorial kali ini saya akan berbagi untuk membuat aplikasi Laravel PHP termasuk NginX Docker container. Dengan Docker, kita tidak perlu menginstall aplikasi apapun di dalam laptop kecuali Docker.

Laravel adalah PHP Framework yang paling populer, namun terkadang sulit untuk melakukan setup bagi orang yang pertama kali mengenal Laravel. Kalau kita membuka halaman awal cara untuk menginstall laravel, akan terdapat list apa saja tools yang perlu diinstal. Menginstall PHP tidak sederhana. Karena itu, menggunakan Docker akan sangat membantu kita jika ingin menjalankan Laravel.

Di tutorial ini kita akan membuat container untuk PHP interpreter, Nginx Server, dan MySQL Database untuk menyimpan data. Container lain yang akan kita siapkan adalah Composer package manager untuk install dependendecy, Laravel artisan container, dan npm container.

1. Membuat Container NginX 

Nginx container sebagai web server. Pertama kali kita akan membuat file docker-compose.yaml dan mengatur service nginx server.

Service nginx menggunakan official image dari docker dengan versi stable-alpine. Dari docker documentation, nginx juga mengekspose port 80. Service ini akan melihat request yang datang untuk dihubungkan ke container php untuk mengeksekusi kode php. Untuk menambah konfigurasi ini, kita akan menambahkan volumes. Dari dokumentasinya, kita akan menambahkan di folder etc, sehingga menjadi seperti ini: – ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro

Buat folder baru, ‘nginx’, dan di dalamnya buat file baru nginx.conf

nginx.conf

2. Membuat PHP Container

Selain php, kita akan menginstall juga beberapa extension yang dibutuhkan Laravel. Untuk itu, kita akan membuat sebuah Dockerfile. Buat folder baru dockerfile, didalamnya buat file baru, php.dockerfile.

php.dockerfile

Edit docker-compose.yaml untuk menambahkan php container.

Buat source folder di root, ‘src’ untuk ditambahkan di volume pada php container.

Sehingga docker-compose.yaml menjadi:

3. Membuat MySQL Container

Saat membuat MySQL Container, kita perlu menambahkan environment variables misalnya untuk user, password. Environment variabel tersebut akan kita tambahkan bukan di docker-compose.yml tapi di file mysql.env di dalam folder env yang akan kita buat.

mysql.env

Di dalam docker-compose kita akan membuat env_file yang menunjukkan dimana tempat environment variabelnya berada:

4. Membuat Utility Container – Composer

Untuk membuat container ini, kita akan membuat satu dockerfile baru karena perlu ada beberapa tambahan dari yang image composer yang original.

dockerfiles/composer.dockerfile

ENTRYPOINT [“composer”, “–ignore-platform-reqs”] dimaksudkan supaya tidak ada error warning meskipun dependencynya tidak ada.

Kita juga menambahkan volumes supaya terjadi mirroring apa yang terjadi di folder src di local computer itu sama dengan yang terjadi di folder /var/www/html yang berada di dalam container.

docker-compose.yml

5. Membuat Aplikasi Laravel dengan Composer

Kita dapat menjalankan masing2 service di dalam file docker-compose.yaml dengan perintah docker-compose run. Kita akan coba menjalankan composer service dengan perintah berikut:

–rm digunakan untuk meremove semua resource apabila container di hentikan.

Setelah perintah dijalankan dan selesai proses instalasi, di folder src akan terisi folder2 aplikasi laravel.

6. Launching Aplikasi dari Docker

Di dalam folder src terdapat file .env. Kita akan fokus pada informasi database:

Sebelumnya, kita sudah membuat file mysql.env, sesuaikan info db dengan file tersebut dan ganti host dengan nama service di docker-compose.yml sehingga menjadi seperti ini:

Sebelum menjalankan aplikasi, kita perlu mengupdate docker-compose.yaml file untuk menambahkan volume di service server. Karena server adalah yang pertama kali menerima request dan dia tidak tahu isi dari src folder, maka kita perlu menambahkan volume untuk mengekspose php service ke server service.

Selanjutnya, kita akan menyalakan service yang berada di docker-compose, namun tidak semuanya, hanya service server, php, dan mysql.

Setelah selesai proses deployment, buka browser http://localhost:8000, aplikasi laravel berhasil dijalankan dari docker.

Bagaimana jika banyak service yang harus dijalankan? Perintah docker-compose up -d service1 service2 service3 tidak efektif tentunya. Terdapat alternatif lain untuk menjalankan perintah ini, ialah dengan menambahkan dependency di docker-compose.yaml, misalnya pada service server, tambahkan depends_on php dan mysql.

Terdapat satu trik lagi supaya docker-compose me rebuild image dengan yang terbaru, kita bisa menambahkan option –build ketika menjalankan docker run:

Kita bisa langsung mengubah2 kode di folder src, perubahannya akan langsung terlihat ketika kita menjalankan laravel.

7. Menambahkan Utility Container

Utility container yang akan kita tambahkan adalah artisan. Artisan membutuhkan php untuk operasionalnya, karena itu kita akan menggunakan php.dockerfile untuk ditaruh di docker-compose.yaml. Di docker-compose.yaml untuk artisan juga kita akan menambahkan entrypoint untuk override php.dockerfile dan mengeksekusi perintah php artisan.

Utility container yang kita buat lagi adalah npm, sehingga docker-compose.yaml menjadi seperti ini:

Selanjutnya kita akan coba untuk menjalankan docker-compose run artisan dari terminal:

Perintah ini akan membuat tabel-tabel di dalam database.

Kita telah berhasil membuat aplikasi laravel dengan docker. Namun ada beberapa catatan khususnya tentang bind mount/volumes. Volumes ok jika dilakukan di development environment, namun tidak disarankan jika kita ingin mendeploy container. Sebaiknya seluruh source code dan configurasi sudah ada di dalam container, tidak perlu membuat bind mount dari laptop kita.

Alternatifnya, kita bisa membuat file nginx.dockerfile di folder dockerfiles.

php.dockerfile juga perlu disesuaikan untuk mengcopy isi folder src ke working directory container dan tambahkan perintah untuk memberikan permission untuk melakukan operasi write pada folder /var/www/html:

Sehingga kita tidak perlu menggunakan bind mount di service nginx dan php pada docker-compose.yaml

Jalankan lagi perintah ini di terminal:

Maka aplikasi laravel siap untuk di deploy di production.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.