Memasang laravel dengan Docker

Ini adalah nomor 5 mengenai menggunakan laravel. Tapi untuk yang docker ini emang perlu persiapan tambahan. Pertama jelas docker sebagai engine utamanya dan yang kedua adalah docker-compose.

Apa itu docker-compose ? Menurut situs docker sendiri saya menyimpulkan seperti ini :

  1. Dapat membuat environment terpisah menggunakan Dockerfile sehinga bisa digunakan dimana saja.
  2. Mendefinesikan masing-masing service aplikasi melalui docker-composer.yml sehingga dapat berjalan bersamaan.

Memasang Docker Compose

Pertama kita bisa cek dulu versi docker compose di halaman githubnya di sinihttps://github.com/docker/compose/releases saat saya menulis ini berada di versi 1.9.

Lalu docker-composer

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Lalu ubah permission docker compose tersebut :

$ sudo chmod +x /usr/local/bin/docker-compose

Jika sudah silakan cek dengan menggunakan

$ docker-compose --version

Akan menghasilkan informasi sebagai berikut misalnya :

docker-compose version 1.9.0, build 2585387

Laravel

Saya berasumsi bahwa sudah sudah memiliki source laravel di komputer/laptop masing-masing. Jika sudah buka folder laravel di mesin masing-masing. Lalu di root folder sejajar dengan .env, composer.json, dan lainnya buatlah satu berkas baru dengan nama docker-compose.yml.

Di sini saya akan mempersiapkan laravel dengan environment sebagai berikut :

  1. Menggunakan PHP versi 7
  2. Menggunakan nginx
  3. Menggunakan database mysql versi 5.6

Lalu isikan informasi berikut di docker-compose.yml sebagai berikut :

ersion: '2'
services:
    web:
        build:
            context: ./
            dockerfile: web.docker
        volumes:
            - ./:/var/www/docker
        ports:
            - "8080:80"
        links:
            - app
    app:
        build:
            context: ./
            
            dockerfile: app.docker
        volumes:
            - ./:/var/www/docker
    database:
        image: mysql:5.6
        environment:
            - "MYSQL_ROOT_PASSWORD=secret"
            - "MYSQL_DATABASE=dockerApp"
        ports:
            - "33061:3306"

Penjelasan Singkat :

Di atas tadi saya menyiapkan 3 buah service untuk laravel docker ini :

  1. Web : Build context berarti lokasi source code, karena docker composer berada di root aplikasi cukup ketikan ./ saja. dockerfile saya beri nama web.docker di sinilah saya mengatur konfigurasi webserver (nginx). Volumes : path untuk source di dalam docker. Ports : menggunakan port 8080 yang diteruskan ke 80
  2. app : Build context sama dengan penjelasan sebelumnya, dockerfile diberi nama app.docker di sini saya mengatur tentang konfigurasi php dan sejenisnya.
  3. database : Menggunakan mysql 5,6 dengan passwod dan database yang disiapkan. Menggunakan port 33061 yang diterukan ke 3306.

Membuat docker-file

Tadi saya menyebutkan konfigurasi untuk web server di web.docker dan untuk aplikasinya di app.docker.

app.docker masih di root aplikasi buat berkas baru dengan nama app.docker dan isikan sebagai berikut :

FROM php:7-fpm

RUN useradd -ms /bin/bash docker

RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client \
    && docker-php-ext-install mcrypt pdo_mysql



    USER docker
WORKDIR /var/www/docker

Penjelasan singkat ;

  1. Menggunakan php 7
  2. Menambahkan user baru “docker” sehingga saat login ssh ke dalam docker container yang ini levelnya tidak langsung root.
  3. Install php dan libaray-library-nya.
  4. Memastikan direktori berada di /var/www/docker

web.docker Masih di root aplikasi buat berkas baru dengan anam web.docker dan isikan sebagai berikut

FROM nginx:1.10

ADD ./vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www/docker

Penjelasan singkat :

  1. Menggunakan nginx versi 1.10
  2. Menggunakan konfigurasi dari berkas vhsot.conf (ini akan dibuat setelah ini) yang disalin ke direktori nginx di docker
  3. Memastikan direktori berada di /var/www/docker.

vhost.conf

Kareana tadi disebutkan konfigurasi nginx akan menyalin dari konfigurasi yang sudah ada maka buat dulu berkas vhost.conf di root aplikasi.

server {
    listen 80;
    index index.php index.html;
    root /var/www/docker/public;

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Setelah semua siap, maka sekarang saatnya megaktifkan container yang dibuat tadi dengan cara :

docker-compose up -d --build

Tunggu sampai selesai.

Jika sudah akses di browser localhost:8080 akan menghasilkan :

Issue yang muncul

Ini issue yang saya alami saat saya hendak menggunakan database. sebelumnya di file .env saya sudah set konfigurasi seperti ini

DB_CONNECTION=mysql
DB_HOST= 127.0.0.1
DB_PORT=33061
DB_DATABASE=dockerApp
DB_USERNAME=root
DB_PASSWORD=secret

Tapi selalu error “SQLSTATE[HY000] [2002] Connection refused” cara menanggulanginya adalah :

  1. Cek docker network Periksa terlebih dahulu daftar docker network yang digunakan dengan cara
docker network ls

Akan menghasilkan informasi sebagai berikut

NETWORK ID NAME DRIVER SCOPE 0899554a5194 bridge bridge local 6be447f9587f host host local 66eaf73473be laraveldocker_default bridge local 2606a2d09a28 none null local

Laravel docker mempunyai NETWORK ID 66eaf73473be dan menggunakan tipe bridge. Sekarang cek ip dari network tersebut

2. Periksa Network

sudo ifoconfig

Maka akan menghasilkan informasi network yang tersedia. Fokus saja ke network yang akan digunakan yaitu network laravel docker. Pada kasus saya terdapat informasi berikut

br-66eaf73473be Link encap:Ethernet  HWaddr 02:42:f8:30:1e:3d  
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:f8ff:fe30:1e3d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5931 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7890 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1706901 (1.6 MiB)  TX bytes:6782068 (6.4 MiB)

Ip yang dimiliki ternyata 172.18.0.1 , maka di .env ubah menjadi :

DB_CONNECTION=mysql
DB_HOST= 172.18.0.1
DB_PORT=33061
DB_DATABASE=dockerApp
DB_USERNAME=root
DB_PASSWORD=secret

Terakhir lakukan perintah composer dumpautoload dan php artisan config:cache maka aplikasi seharusnya bisa tersambung ke database.

Tambahan : Sebenarnya ada cara lebih mudah yaitu menggunakan laradock ( silahkan cek ke github dengan kata kunci tersebut ). Tapi karena ingin mengenal docker saya memilih menggunakan cara manual seperti ini.

REFERENSI :

  1. https://docs.docker.com/compose/overview/
  2. https://docs.docker.com/compose/install/
  3. https://kyleferg.com/laravel-development-with-docker/#laravel-setup