Dockerisasi Laravel 10, Ubuntu image, PHP8.4-FPM, NGINX

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.

Baca Juga: 
Konfigurasi PHP-FPM dengan NGINX

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-curl

Jika 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.

Baca Juga: 
Cara menginstal Docker di Debian 11

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/saksenengku

Ini 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.sh

Telah 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.






Reporter: Adi Prabowo

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.

Baca Juga: 
Instalasi Virtualmin dengan Nginx dan MariaDB di Debian 11

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-curl

Jika 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.

Baca Juga: 
Instalasi Docker di Debian 12

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/saksenengku

Ini 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.sh

Telah 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.






Reporter: Adi Prabowo

Untuk mendapatkan Berita & Review menarik Saksenengku Network
Google News

Artikel Terkait

Terpopuler