Membuat Docker Image Nginx + PHP7-FPM untuk teman-teman yang baru belajar docker mungkin membingungkan. Kenapa saya katakan demikian karena saya sendiri awalnya masih virtualisazation-base mindset.
Pola pikir tersebut membuat saya sedikit pusing ketika pertama belajar Containerization docker. Namun, karena bawaanya hobi ngoprek/ngulik jadi tetep harus pelan-pelan dipahami agar ilmu mengikuti perkembangan teknologi.
Sampai dititik ini saya sarankan teman-teman nanti perlu mendalami lagi ya commands yang sering dipakai dalam pembuatan image didalam Dockerfile. Jika teman-teman sering buka referensi tersebut dan mempraktikanya untuk dockerize aplikasi maka akan mahir sendiri.
Tips-nya silahkan latihan dengan cara mengkontainerisasi aplikasi-aplikasi yang sering teman-teman buat. Kalau programmer tentu punya banyak aplikasi yang mungkin bisa dicoba. Untuk teman-teman yang bukan programmer bisa mencari aplikasi di Github atau Gitlab untuk dicoba dockerize.
Hal-hal yang perlu diketahui sebelum membuat image, diantaranya:
1. Pembuatan image itu bergantung pada file dengan nama Dockerfile.
2. Uji commands yang didefinisikan pada Dockerfile kedalam container – image base.
3. Seharusnya ketika image itu dijalankan, command yang dieksekusi pada bagian CMD / ENTRYPOINT tidak failed.
Mungkin itu dulu yang perlu saya mention, selanjutnya kita bahas pada langkah-langkah saja ya. 😀
Langkah-langkah Membuat Docker Image Nginx + PHP7-FPM
Sebenarnya langkah-langkah ini saya merujuk pada website Wiki Nginx Alpine Linux. Kenapa saya memilih Alpine Linux sebagai base image? Ini dikarenakan alpine linux merupakan salah satu base image favorit, punya ukuran image yang lebih kecil dibanding yang lain.
Semakin kecil ukuran image yang telah kita build, maka semakin baik karena proses push dan pull akan lebih cepat. Ini akan terasa saat teman-teman nanti belajar CI/CD.
LukmanLAB
Seperti yang saya katakan pada poin nomor 2 diatas bahwa proses ini saya awali dengan cara menjalankan base image dan mencoba instalasi paket-paket dan konfigurasi paket tersebut dalam container – image base yang dijalankan (docker-run
).
Aku menjalankan docker run -it --rm alpine
terlebih dulu dan mencoba update, instalasi paket-paket, kemudian mencoba konfigurasi dan melakukan testing didalamnya. Paham ya? 😀
1. Membuat Dockerfile
$ mkdir belajardocker && cd belajardocker
$ vi Dockerfile
FROM alpine:latest RUN apk update \ && apk add --no-cache nginx php7-fpm php7-mcrypt \ php7-soap php7-openssl php7-gmp \ php7-pdo_odbc php7-json php7-dom \ php7-pdo php7-zip php7-mysqli \ php7-apcu php7-pdo_pgsql \ php7-bcmath php7-gd php7-odbc \ php7-pdo_mysql \ php7-gettext php7-xmlreader php7-xmlrpc \ php7-bz2 php7-iconv php7-pdo_dblib php7-curl php7-ctype \ supervisor COPY nginx.conf /etc/nginx/nginx.conf COPY configure.sh /configure.sh COPY supervisord.conf /etc/supervisord.conf VOLUME ["/var/lib/nginx/html/"] EXPOSE 80/tcp RUN sh /configure.sh CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
Buat juga file-file yang diperlukan dalam proses pembuatan image:
$ vi nginx.conf
daemon off; user www; worker_processes auto; # it will be determinate automatically by the number of core error_log /var/log/nginx/error.log; #pid /var/run/nginx/nginx.pid; # it permit you to use /etc/init.d/nginx reload|restart|stop|start events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; access_log /var/log/nginx/access.log; keepalive_timeout 3000; server { listen 80; root /var/lib/nginx/html; index index.html index.php index.htm; server_name localhost; client_max_body_size 32m; error_page 500 502 503 504 /50x.html; location / { try_files $uri /index.html; } location = /50x.html { root /var/lib/nginx/html; } # config to read .php location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } } }
$ vi configure.sh
#!/bin/sh # nginx config adduser -D -g 'www' www chown -R www:www /var/lib/nginx mkdir /run/nginx && touch /run/nginx/nginx.pid # set variable PHP_FPM_USER="www" PHP_FPM_GROUP="www" PHP_FPM_LISTEN_MODE="0660" PHP_MEMORY_LIMIT="512M" PHP_MAX_UPLOAD="50M" PHP_MAX_FILE_UPLOAD="200" PHP_MAX_POST="100M" PHP_DISPLAY_ERRORS="On" PHP_DISPLAY_STARTUP_ERRORS="On" PHP_ERROR_REPORTING="E_COMPILE_ERROR\|E_RECOVERABLE_ERROR\|E_ERROR\|E_CORE_ERROR" PHP_CGI_FIX_PATHINFO=0 # replace some of configuration on www.conf sed -i "s|;listen.owner\s*=\s*nobody|listen.owner = ${PHP_FPM_USER}|g" /etc/php7/php-fpm.d/www.conf sed -i "s|;listen.group\s*=\s*nobody|listen.group = ${PHP_FPM_GROUP}|g" /etc/php7/php-fpm.d/www.conf sed -i "s|;listen.mode\s*=\s*0660|listen.mode = ${PHP_FPM_LISTEN_MODE}|g" /etc/php7/php-fpm.d/www.conf sed -i "s|user\s*=\s*nobody|user = ${PHP_FPM_USER}|g" /etc/php7/php-fpm.d/www.conf sed -i "s|group\s*=\s*nobody|group = ${PHP_FPM_GROUP}|g" /etc/php7/php-fpm.d/www.conf sed -i "s|;log_level\s*=\s*notice|log_level = notice|g" /etc/php7/php-fpm.d/www.conf # replace some of configuration on php.ini sed -i "s|display_errors\s*=\s*Off|display_errors = ${PHP_DISPLAY_ERRORS}|i" /etc/php7/php.ini sed -i "s|display_startup_errors\s*=\s*Off|display_startup_errors = ${PHP_DISPLAY_STARTUP_ERRORS}|i" /etc/php7/php.ini sed -i "s|error_reporting\s*=\s*E_ALL & ~E_DEPRECATED & ~E_STRICT|error_reporting = ${PHP_ERROR_REPORTING}|i" /etc/php7/php.ini sed -i "s|;*memory_limit =.*|memory_limit = ${PHP_MEMORY_LIMIT}|i" /etc/php7/php.ini sed -i "s|;*upload_max_filesize =.*|upload_max_filesize = ${PHP_MAX_UPLOAD}|i" /etc/php7/php.ini sed -i "s|;*max_file_uploads =.*|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|i" /etc/php7/php.ini sed -i "s|;*post_max_size =.*|post_max_size = ${PHP_MAX_POST}|i" /etc/php7/php.ini sed -i "s|;*cgi.fix_pathinfo=.*|cgi.fix_pathinfo= ${PHP_CGI_FIX_PATHINFO}|i" /etc/php7/php.ini
$ vi supervisord.conf
[program:nginx] command=/usr/sbin/nginx -c /etc/nginx/nginx.conf [program:php-fpm] command=/usr/sbin/php-fpm7 [supervisord] logfile=/var/log/supervisord.log nodaemon=true
2. Build Image
$ docker build -t lukmanlab/nginx-php-fpm7 . --no-cache
3. Run Image
$ docker run -itd --rm -p 8080:80 lukmanlab/nginx-php-fpm7
4. Verifikasi dan Review
Verifikasinya cukup cek apakah container-nya jalan atau tidak dengan cara:
$ docker ps
Pastikan ada container dengan image yang teman-teman jalankan. Harusnya output-nya mirip seperti ini :
Admin LUKMANLAB, DevOps Engineer, Site Reliability Engineer, System Administrator.