menu

Docker - Laradock (docker for laravel)


Pada tutorial kemarin codedoct sudah membagikan beberapa syntax docker yang sering digunakan, kali ini kita akan mensetup docker untuk project laravel yang bernama laradock untuk halaman resminya bisa akses disini.

Sebelum menginstall laradock pastikan aplikasi docker sudah terinstal pada komputer masing-masing saat ini codedoct sedang menggunakan macbook cara menginstall docker sangat mudah untuk mac silahkan download disini jika menggunakan windows silahkan download disini jika menggunakan linux silahkan ikuti langkah pada artikel ini.

Jika docker sudah terinstal dengan baik selanjutnya langsung saja kita install laradocknya,
$ git clone https://github.com/Laradock/laradock.git
$ cp env-example .env
$ docker-compose up -d nginx mysql phpmyadmin workspace

Jika sudah silahkan akses url localhost.

Yang perlu diperhatikan:

1. Secara default nginx laradock akan membaca folder public, maka susunan folder harus sperti ini,


jika ingin mengubah nya maka silahkan edit file default.conf pada path nginx/sites/, anda akan menemukan code
root /var/www/public;
silahkan ubah misal menjadi sperti ini
root /var/www;
maka default nginx akan membaca folder yang setara dengan folder laradocknya.
Jika sudah jangan lupa untuk merestart docker-compose nya
$ docker-compose restart

2.  Mengubah default url "localhost" dan multi project laravel
Secara default kita tidak bisa mengakses multi project pada laradock jika anda ingin memprovide 2 project laravel maka harus menginstall 2 laradock juga sehingga penampakan struktur foldernya akan tampak seperti ini,


Tapi kita juga bisa hanya menggunakan 1 laradock saja dengan sedikit penyesuaian pada nginx caranya pada path nginx/sites/ kita buat file baru misal namaya projectB.conf ini configurasi untuk project projectB dan satu lagi pada path yang sama kita buat file lagi dengan nama projectA.conf keduanya adalah project laravel, dan isi code kedua file tersebut adalah,

- projectB.conf
server {

    listen 80;
    listen [::]:80;

    # For https
    # listen 443 ssl;
    # listen [::]:443 ssl ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name projectB.test;
    root /var/www/projectB/public;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

- projectA.conf
server {

    listen 80;
    listen [::]:80;

    # For https
    # listen 443 ssl;
    # listen [::]:443 ssl ipv6only=on;
    # ssl_certificate /etc/nginx/ssl/default.crt;
    # ssl_certificate_key /etc/nginx/ssl/default.key;

    server_name projectA.test;
    root /var/www/projectA/public;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-upstream;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }

    error_log /var/log/nginx/laravel_error.log;
    access_log /var/log/nginx/laravel_access.log;
}

Jangan lupa untuk kembali merestart docker-compose seperti cara diatas.
Selanjutnya maping target url, buka file hosts dengan cara "vim /etc/hosts" dan tambahkan projectB dan projectA seperti ini,


Selanjutnya silahkan akses url projectB.test dan projectA.test pada browser.

3. Tidak bisa login phpmyadmin
Secara default user access phpmyadmin adalah,
host: default
user: root
pass: root
Untuk mengaksesnya pada url localhost:8080
tapi jika kita menggunakan versi latest mysql akan ada masalah saat login searching2 ternyata belum support, untuk melihat versi dan pengaturan mysql ini bisa dilihat pada .env laradock seperti gambar dibawah,


Silahkan ganti version mysql menjadi 5.7 seperti diatas.
Selanjutnya ikuti step dibawah untuk restart image mysql
### shutdown container
docker-compose down

### remove mysql data laradock
rm -rf ~/.laradock/data/mysql

### rebuild mysql image
docker-compose build mysql

### re-up all container
docker-compose up -d nginx mysql workspace phpmyadmin

4. Menggunakan GUI untuk mengakses mysql
Misal menggunakan mysql workbench konfigurasinya seperti gambar dibawah,


5. Mengganti versi php
Buka kembali file .env laradock dan ubah PHP_VERSION seperti gambar dibawah,


Selanjutnya ikuti step dibawah untuk restart image mysql
### Build fpm and cli for new version                       
docker-compose build php-fpm                       
docker-compose build workspace
                                               
### Restart Container to use new version of php
docker-compose down                       
docker-compose up -d nginx mysql workspace phpmyadmin

===DONE!===

Syntax - Docker


Artikel ini merupakan artikel pertama di bulan ramadhan, ada banyak sekali ide yang ingin ditulis sampai bingung mau mulai dari yang mana. Sampai akhirnya codedoct memutuskan untuk menulis tentang docker dan sebelum memulai artikel selanjutnya tentang docker ada baiknya kita mulai dulu pengenalan sintax-sintax nya.

Oke dimulai dari melihat daftar container,
# list running containers
$ docker ps

# list all containers
$ docker ps -a

# list latest created container
$ docker ps -l

# list n last created containers
$ docker ps -n=-1

Selanjutnya melihat list images,
# list used images
$ docker images

# list all images
$ docker images -a

# list images unused
$ docker images -f dangling=true

# find list images with param
$ docker images -a |  grep "param"

Operation,
# stop container
$ docker stop {id_container}

# stop all container
$ docker stop $(docker ps -a -q)

# remove contaner
$ docker rm {id_container}

# remove all container
$ docker rm $(docker ps -a -q)

# remove images
$ docker image rm {id_container}

# remove all images
$ docker rmi $(docker images -a -q)

# remove unused container, volume, etc
$ docker system prune —-volumes

# remove all images which are not referenced by any existing container, not just dangling ones
$ docker image prune -a

===DONE!===