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.