Dockerfile Untuk Laravel dan Lumen

Assalamualaikum wr. wb.
Oke ini adalah tulisan perdana saya sebagai DevOps Engineer di blog Adab. Jadi www.adab.page bagi teman-teman yang belum tau sesuai namanya Adab ini adalah social media platform yang ‘islami’ dan ber-adab tentunya. Teknologi backend Adab ini dibangun menggunakan Laravel Lumen. Di bagian infrastructure semua service Adab ini saya buat berjalan menggunakan orkestrasi Kubernetes dan tentu saja untuk kontenerisasinya menggunakan Docker.

Nah, alih-alih menggunakan docker official dari PHP yang menurut saya agak sulit untuk di kustomisasi manual, saya lebih memilih membuat sendiri Docker container untuk Laravel Lumen karena jika kita membuat sendiri tentu lebih mudah untuk di kustomisasi karena kita sendiri yang membuatnya, istilah kerennya “mending baca koding sendiri ketimbang baca kodingan orang”.

Berikut daftar aplikasi yang akan diinstall menggunakan Dockerfile:

  • OS: saya ambil dari Docker Ubuntu 18.04
  • PHP 7.4
  • Composer
  • Nginx
  • PHP-FPM
  • Supervisord

Dockerfile

FROM ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y --no-install-recommends gnupg apt-utils nginx \
    && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu bionic main" > /etc/apt/sources.list.d/ondrej-php.list \
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C \
    && apt-get update && apt-get -y install curl ca-certificates unzip software-properties-common \
    php7.4 php7.4-fpm php7.4-cli php7.4-curl php7.4-apcu php7.4-apcu-bc php7.4-dev libmcrypt-dev php-pear php7.4-curl \
    php7.4-json php7.4-pdo-mysql php7.4-mbstring php7.4-opcache php7.4-readline php7.4-xml php7.4-zip php7.4-bcmath php7.4-gd php7.4-mysql \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \   
    && composer clear-cache \
    && apt-get update && apt-get install -y gettext-base \
    && apt-get install -y libsodium-dev php7.4-bz2 php7.4-soap php7.4-dba php7.4-gmp php7.4-intl \
    php7.4-ldap php7.4-odbc php7.4-pdo-dblib unixodbc unixodbc-dev php7.4-pdo-odbc php7.4-sqlite3 \
    php7.4-xmlrpc php7.4-common php7.4-uuid php7.4-amqp php7.4-memcached \
    php7.4-pdo-sqlite php7.4-mongodb \
    && apt-get update \
    && apt-get install -y supervisor \
    && mkdir -p /var/log/supervisor
    
RUN pecl install -f uopz redis libsodium mongodb-1.8.1 mcrypt-1.0.2
RUN echo "extension=sodium.so" > /etc/php/7.4/mods-available/sodium.ini \
    && echo "extension=uopz.so" > /etc/php/7.4/mods-available/uopz.ini \
    && echo "extension=redis.so" > /etc/php/7.4/mods-available/redis.ini \
    && echo "extension=mongodb.so" > /etc/php/7.4/mods-available/mongodb.ini \
    \
    && echo "memory_limit=512M" >> /etc/php/7.4/fpm/conf.d/adab.ini \
    && echo "upload_max_filesize=512M" >> /etc/php/7.4/fpm/conf.d/adab.ini \
    && echo "max_file_uploads=1000" >> /etc/php/7.4/fpm/conf.d/adab.ini \
    && echo "post_max_size=512M" >> /etc/php/7.4/fpm/conf.d/adab.ini \
    && echo "max_execution_time=600" >> /etc/php/7.4/fpm/conf.d/adab.ini \
    && echo "allow_url_fopen = On" >> /etc/php/7.4/fpm/conf.d/adab.ini \
    && echo "error_reporting = E_ALL & ~E_NOTICE" >> /etc/php/7.4/fpm/conf.d/adab.ini

RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* ~/.composer \
    && rm /var/www/html/index.nginx-debian.html && apt-get clean

RUN ln -sf /dev/stdout /var/log/nginx/access.log \
	&& ln -sf /dev/stderr /var/log/nginx/error.log

COPY ./nginx.conf /etc/nginx/sites-enabled/default
COPY ./supervisord.conf  /etc/supervisor/conf.d/supervisord.conf
WORKDIR /var/www/html
EXPOSE 80
CMD ["/usr/bin/supervisord"]

Dengan demikian teman-teman bisa menaruh laravel projectnya dengan cara bind mount volume ke dalam folder docker /var/www/html. Jika teman-teman perhatikan di Dockerfile saya juga melakukan COPY configurasi Nginx dan Supervisor, berikut ini file nginx dan supervisor:

nginx.conf

#HTTP SERVER
server {
    listen 80;
    listen [::]:80;
    
    root /var/www/html/public;
    server_name localhost;
    index index.html index.php;


    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            try_files $uri =404;        
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
    }

    location ~ /\.ht {
        deny all;
    }

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Limit File Upload Size
    client_max_body_size 20M;
    
    # Hide nginx version info
    server_tokens off;
}

supervisord.conf

[supervisord]
nodaemon=true
loglevel=warn

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
priority=10
stdout_events_enabled=true
stderr_events_enabled=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:php-fpm]
command=/bin/bash -c "service php7.4-fpm start"
autostart=true
priority=5
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

Sebagai penutup Dockerfile yang sudah saya tulis diatas sebenarnya tidak hanya bisa dipakai untuk laravel saja, tapi bisa juga dipakai untuk semua aplikasi yang menggunakan PHP.

Akhir kata, Semoga tulisan saya kali ini bermanfaat. Aamiin.

Leave a Reply

Your email address will not be published.