Cara Membuat Docker Image Nginx + PHP7-FPM untuk Pemula

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.

membuat docker image nginx
Nginx PHP-FPM

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 containerimage 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 :

image docker nginx running
Container Docker yang Running

Leave a Reply