Membuat aplikasi Laravel yang berfungsi sebagai API dan menjalankannya di server menggunakan Docker. Meskipun banyak Dockerfile yang tersedia di internet saat Anda mencari, sebagian besar tidak lengkap atau spesifik untuk penggunaan tertentu.
Bagaimana melakukannya dan mencoba melengkapinya agar menjadi Dockerfile yang bagus untuk Laravel. Mohon beri tahu jika ada hal yang lebih baik atau cara untuk mengoptimalkannya atau fitur apa pun yang kurang dari lingkungan Laravel yang optimal.
Perlu diingat bahwa artikel ini hanya tentang membuat aplikasi Laravel menggunakan Docker dan bukan tentang basis data atau sistem file lainnya.
Menerapkan Aplikasi Docker
Salin konten di bawah ini ke dalam file bernama Dockerfile di direktori utama. (Di direktori utama proyek terdapat file-file seperti artisan, composer.json, dan .env, jika Anda bingung)
FROM ubuntu:latest AS base
ENV DEBIAN_FRONTEND noninteractive
# Install dependencies
RUN apt update
RUN apt install -y software-properties-common
RUN add-apt-repository -y ppa:ondrej/php
RUN apt update
RUN apt install -y php8.4\
php8.4-mysql \
php8.4-Aapcu \
php8.4-exif \
php8.4-pcntl \
php8.4-bcmath \
php8.4-bz2 \
php8.4-cgi \
php8.4-cli \
php8.4-common \
php8.4-bcmath \
php8.4-gd \
php8.4-igbinary \
php8.4-imagick \
php8.4-imap \
php8.4-intl \
php8.4-ssh2 \
php8.4-ldap \
php8.4-mbstring \
php8.4-memcache \
php8.4-mysql \
php8.4-opcache \
php8.4-pgsql \
php8.4-redis \
php8.4-soap \
php8.4-xml \
php8.4-xmlrpc \
php8.4-zip \
php8.4-curl
# Install php-fpm
RUN apt install -y php8.4-fpm php8.4-cli
# Install composer
RUN apt install -y curl
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Install nodejs
RUN apt install -y ca-certificates gnupg
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
ENV NODE_MAJOR 20
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
RUN apt update
RUN apt install -y nodejs
# Install nginx
RUN apt install -y nginx-extras
RUN echo "\
server {\n\
listen 80;\n\
listen [::]:80;\n\
root /var/www/saksenengku/public;\n\
add_header X-Frame-Options \"SAMEORIGIN\";\n\
add_header X-Content-Type-Options \"nosniff\";\n\
index index.php;\n\
charset utf-8;\n\
location / {\n\
try_files \$uri \$uri/ /index.php?\$query_string;\n\
}\n\
location = /favicon.ico { access_log off; log_not_found off; }\n\
location = /robots.txt { access_log off; log_not_found off; }\n\
error_page 404 /index.php;\n\
location ~ \.php$ {\n\
fastcgi_pass 127.0.0.1:9000;\n\
fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;\n\
include fastcgi_params;\n\
}\n\
location ~ /\.(?!well-known).* {\n\
deny all;\n\
}\n\
}\n" > /etc/nginx/sites-available/saksenengku
RUN echo "\
#!/bin/sh\n\
echo \"Starting services...\"\n\
service php8.4-fpm start\n\
nginx -g \"daemon off;\" &\n\
echo \"Ready.\"\n\
tail -s 1 /var/log/nginx/*.log -f\n\
" > /start.sh
COPY . /var/www/saksenengku
WORKDIR /var/www/saksenengku
RUN chown -R www-data:www-data /var/www/saksenengku
RUN composer install
EXPOSE 80
CMD ["sh", "/start.sh"]Jalankan perintah build dari terminal, lalu jalankan image tersebut:
docker build -t MY_IMAGE . docker run -p "8000:80" MY_IMAGE
Kemudian buka browser local dan navigasikan ke “http://localhost:8000/”
Laravel Anda sudah berjalan.
Pelajari Lebih Lanjut
Anda perlu pemahaman dasar tentang Docker, jadi lakukan riset tentang Docker untuk informasi yang lebih detail.
Base image dan stage
Pada baris pertama, Anda dapat melihat baris ini:
FROM ubuntu:latest AS base
Ini berarti kita sedang mendefinisikan tahap pembangunan yang disebut base dari cUbuntu image terbaru.
Ikuti baris yang disebutkan di atas, Anda akan melihat variabel lingkungan yang sedang diatur:
ENV DEBIAN_FRONTEND noninteractive
Ini mengatur antarmuka Ubuntu menjadi non-interaktif. Hal ini dilakukan karena beberapa perintah mungkin meminta input pengguna, dan karena hal itu tidak memungkinkan dan kita perlu agar citra kita dibangun secepat dan semudah mungkin, kita perlu menonaktifkan permintaan input agar tidak menghentikan proses pembangunan.
Kita perlu memperbarui paket Ubuntu, oleh karena itu baris ini:
RUN apt update
Dependensi Laravel
Setiap program membutuhkan beberapa hal yang diinstal sebelum dijalankan dan Laravel tidak terkecuali. Jika Anda mengikuti tautan ke dokumentasi penyebaran resmi Laravel, Anda dapat melihat prasyarat untuk menjalankan Laravel.
Seperti yang disebutkan dalam dokumentasi Laravel, dibutuhkan PHP versi 8.1 atau lebih tinggi. Kita akan menggunakan PHP 8.4 bersama dengan FPM untuk menjalankan Laravel dan NGINX sebagai reverse proxy.
Untuk menginstal PHP 8.4 di Ubuntu, kita perlu menambahkan beberapa repositori karena tidak tersedia secara default. Cara yang baik untuk menambahkan repositori adalah dengan menggunakan alat yang disebut add-apt-repository, tetapi sekali lagi, alat ini tidak tersedia secara default. Alat add-apt-repository tersedia dalam paket yang disebut software-properties-common. Untuk menginstal paket ini, kita dapat memberi tahu Docker untuk memberi tahu Ubuntu agar menginstalnya.
RUN apt install -y software-properties-common
Opsi -y digunakan untuk mengkonfirmasi semua perintah secara default karena apt install meminta konfirmasi di tengah proses instalasi.
Setelah instalasi selesai, kita dapat menggunakan add-apt-repository untuk menambahkan repositori yang diperlukan untuk menginstal php8.4:
RUN add-apt-repository -y ppa:ondrej/php
Kemudian perbarui kembali daftar paket untuk memastikan semuanya akan diinstal dari repositori yang baru ditambahkan:
RUN apt update
Bersamaan dengan PHP itu sendiri, kita juga akan menginstal persyaratan Laravel:
RUN apt install -y php8.4\
php8.4-mysql \
php8.4-Aapcu \
php8.4-exif \
php8.4-pcntl \
php8.4-bcmath \
php8.4-bz2 \
php8.4-cgi \
php8.4-cli \
php8.4-common \
php8.4-bcmath \
php8.4-gd \
php8.4-igbinary \
php8.4-imagick \
php8.4-imap \
php8.4-intl \
php8.4-ssh2 \
php8.4-ldap \
php8.4-mbstring \
php8.4-memcache \
php8.4-mysql \
php8.4-opcache \
php8.4-pgsql \
php8.4-redis \
php8.4-soap \
php8.4-xml \
php8.4-xmlrpc \
php8.4-zip \
php8.4-curlJika Anda bertanya-tanya apa arti semua garis miring terbalik (), itu adalah untuk memberi tahu Docker bahwa karakter baris baru harus di-escape.
PHP FPM & CLI
Sejauh ini semuanya berjalan lancar untuk aplikasi Laravel, tetapi kami ingin meningkatkan kecepatannya dan kami akan menggunakan PHP FPM. (Informasi lebih lanjut tentang PHP FPM disini)
Berikut adalah cara menginstal FPM:
RUN apt install -y php8.4-fpm php8.4-cli
PHP CLI juga perlu diinstal karena sangat penting untuk menjalankan banyak perintah, terutama php artisan.
Composer
Seperti yang mungkin Anda ketahui, Composer adalah pengelola paket untuk proyek PHP dan Laravel juga menggunakannya. Untuk menginstal Composer, kita perlu mengunduh file penginstal dan menjalankannya dengan PHP. Untuk mengunduh sesuatu, kita dapat menggunakan wget atau curl. Di sini kita akan menggunakan curl untuk mengunduh dan mengirimkan hasilnya ke PHP untuk instalasi.
Pertama, instal curl:
RUN apt install -y curl
Kemudian, unduh file tersebut dan jalankan melalui pip ke PHP:
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Node.js
Jika Anda menggunakan Laravel sebagai kerangka kerja full-stack (baik front-end maupun back-end), Anda juga membutuhkan Node.js.
Dokumentasi resmi Node menyarankan untuk menginstal Node pada distro berbasis Debian/Ubuntu (yang menjadi dasar image kami) melalui distribusi biner Node. (Dokumentasi untuk Debian/Ubuntu)
Saya tidak akan membahas detail lengkap perintah karena deskripsi lengkap tersedia dalam dokumentasi yang diberikan di atas. Jadi sekali lagi kita akan memberi tahu Docker untuk memberi tahu Ubuntu agar menjalankan perintah, sehingga kodenya adalah:
RUN apt install -y ca-certificates gnupg RUN mkdir -p /etc/apt/keyrings RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg ENV NODE_MAJOR 20 RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list RUN apt update RUN apt install -y nodejs
NGINX
Kita akan menginstal dan mengkonfigurasinya sebagai reverse proxy.
Untuk menginstal NGINX:
RUN apt install -y nginx-extras
Setelah NGINX terinstal, kita perlu menambahkan konfigurasi situs web kita. Konfigurasi situs web kita terletak di /etc/nginx/sites-available/saksenengku, jadi kita salin konfigurasi kita ke dalam file ini dan timpa konfigurasi yang ada:
RUN echo "\
server {\n\
listen 80;\n\
listen [::]:80;\n\
root /var/www/saksenengku/public;\n\
add_header X-Frame-Options \"SAMEORIGIN\";\n\
add_header X-Content-Type-Options \"nosniff\";\n\
index index.php;\n\
charset utf-8;\n\
location / {\n\
try_files \$uri \$uri/ /index.php?\$query_string;\n\
}\n\
location = /favicon.ico { access_log off; log_not_found off; }\n\
location = /robots.txt { access_log off; log_not_found off; }\n\
error_page 404 /index.php;\n\
location ~ \.php$ {\n\
fastcgi_pass 127.0.0.1:9000;\n\
fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name;\n\
include fastcgi_params;\n\
}\n\
location ~ /\.(?!well-known).* {\n\
deny all;\n\
}\n\
}\n" > /etc/nginx/sites-available/saksenengkuIni adalah konfigurasi yang sama seperti yang disarankan oleh dokumentasi resmi Laravel dengan sedikit perubahan:
– Kita tidak memerlukan `server_name` karena kontainer ini hanya digunakan untuk server Laravel dan harus merespons semuanya.
– Mengubah root menjadi `/var/www/saksenengku/public` karena ini adalah root tempat aplikasi kita akan di-deploy.
– Socket fpm fastcgi_pass diubah menjadi `fastcgi_pass 127.0.0.1:9000` karena socket php8.4-fpm dalam skenario kita ditempatkan di sini.
Skrip shell kustom untuk menjalankan aplikasi
Pada langkah ini, kita akan membuat skrip shell kustom untuk mempersiapkan sistem dan menjalankan aplikasi setiap kali kontainer dimulai.
Berikut tampilan skrip bash:
#!/bin/sh echo "Starting services..." service php8.4-fpm start nginx -g "daemon off;" & echo "Ready." tail -s 1 /var/log/nginx/*.log -f
Skrip ini memulai layanan FPM, kemudian menjalankan titik masuk nginx dan mengirimkannya ke latar belakang, dan akhirnya mulai mencetak log nginx.
Untuk membuat file ini, kita dapat memasukkannya ke dalam file seperti di bawah ini:
RUN echo "\
#!/bin/sh\n\
echo \"Starting services...\"\n\
service php8.4-fpm start\n\
nginx -g \"daemon off;\" &\n\
echo \"Ready.\"\n\
tail -s 1 /var/log/nginx/*.log -f\n\
" > /start.shTelah memberi nama file tersebut start.sh dan meletakkannya di direktori root kontainer. Anda bebas memberi nama apa pun dan meletakkannya di mana pun Anda mau.
Deploy Laravel
Sekarang lingkungan kita sudah siap, mari kita lanjutkan ke penerapan Laravel.
Pertama, salin file saat ini ke /var/www/saksenengku:
COPY . /var/www/saksenengku
Kemudian ubah direktori kerja Docker ke alamat yang sama:
WORKDIR /var/www/saksenengku
Karena Laravel juga membutuhkan akses ke folder ini, maka kita mengatur izin direktori tersebut:
RUN chown -R www-data:www-data /var/www/saksenengku
Terakhir, minta Composer untuk menginstal paket ph yang dibutuhkan oleh Laravel:
RUN composer install
Catatan: jangan jalankan `composer install` sebelum mengatur izin. Pengaturan izin setiap folder dilakukan secara rekursif dan lebih baik dijalankan sebelum semua paket diinstal karena akan memakan waktu jauh lebih lama jika dilakukan secara terpisah.
Ekspos port 80
NGINX akan mencoba mendengarkan port 80 dan perlu diekspos agar dapat terikat:
EXPOSE 80
Jalankan server
Ingat skrip shell yang telah kita buat? Sekarang saatnya menjalankan skrip tersebut ketika kontainer telah dimulai:
CMD ["sh", "/start.sh"]
Build dan menjalankan
Untuk membangun dan menjalankan image, gunakan perintah di bawah ini jika instance Docker tersedia:
docker build -t MY_IMAGE . docker run -p "8000:80" MY_IMAGE
Ganti MY_IMAGE dengan nama yang diinginkan untuk image Docker Anda.
Semoga artikel ini bermanfaat.

