Cara Setting Sederhana Laravel dan Docker

Berawal dari satu project yang memiliki environtment development yang berbeda. Saya mencoba membiasakan setup project entah dengan bahasa apapun dengan docker. Lalu apa sebenarnya docker itu? dan masalah seperti apa yang menyebabkan kita menggunakan docker?

Jawabannya itu sederhana, misalnya di local laptop kita terinstall MySQL versi 5.7. Sedangkan project hanya berjalan lancar di versi 5.6.

Apa yang harus kita lakukan? Jawaban-nya itu biasanya kita downgrade mysql menjadi versi 5.6. Tapi project lainnya yang ada di local laptop dan menggunakan MySQL versi 5.7 kita bagaimana? Dilema 😀

Saat inilah kita harus mencoba docker.

Oke searching cara install docker di laptop ubuntu, lalu mari mulai belajar docker. Ketika searching di google ada banyak sekali tutorial. Salah satu yang saya ikuti ada di sini https://www.katacoda.com/courses/docker

Saya lebih seneng langsung terjun ke project dibanding teori, padahal syarat utama untuk memahami mesti tahu teori dulu. Biasanya kalau tersesat ya tinggal google aja dan baca stackoverflow :D. So ada yang mau ikuti silahkan, mau baca teori terlebih dahulu monggo, itu lebih bagus!

Sebelum lanjut, saya disini menggunakan ubuntu 18.04. Docker versi 17.12.1-ce. Jika ada kesalahan dalam mengikuti step by step ini mungkin versi tidak sesuai atau hal lainnya.

Lanjut, saya buat per step ya biar mudah implementnya.

Install laravel di local folder kita.

composer create-project laravel/laravel laravel-docker

Lalu kita pindah ke folder “laravel-docker” dengan perintah

cd laravel-docker

Anda di dalam folder laravel-docker. Sekarang mari kita buat folder untuk setup docker di project laravel kita ini.

Kita buat satu folder “.docker” dengan perintah

mkdir .docker/

Setelah itu di dalam folder .docker itu kita buat 2 file yaitu file Dockerfile dan vhost.conf dengan perintah

touch .docker/DockerFile .docker/vhost.conf

Perintah diatas membuat file di dalam folder .docker tanpa isi.

Setelah itu kita buat satu file lagi yaitu docker-compose.yml diluar folder .docker dengan perintah.

touch docker-compose.yml

File terakhir sudah kita buat, lalu apa isi dari ketiga file tersebut?

FILE: Dockerfile

FROM php:7.1.8-apache

MAINTAINER Adiputra

COPY . /var/www/html/laravel-docker
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

RUN docker-php-ext-install mbstring pdo pdo_mysql \
&& chown -R www-data:www-data /var/www/html/laravel-docker \
&& a2enmod rewrite

Dockerfile adalah file yang berisi perintah-perintah dalam mengisi container/image pada docker yang ingin kita buat. Pada file ini berisi banyak perintah yang bisa kita lihat pada dokumentasi url berikut: https://docs.docker.com/engine/reference/builder/#usage

FROM xxx artinya adalah kita ingin docker menyimpan data-data PHP dan Apache. Pada kode diatas kita menggunakan php dengan versi 7.1.8 beserta apachenya. Perintah FROM ini seperti label yang menandakan bahwa docker image ini dibungkus dengan spesifikasi utama yaitu php:7.1.8-apache.

Jika kita ingin membuat docker image dengan ubuntu, bisa menggunakan FROM ubuntu:latest. Berarti environtment utama adalah ubuntu terakhir.

MAINTAINER artinya adalah pembuat docker project ini.

COPY artinya mengcopy atau mengarahkan file ke satu lokasi tertentu. Terlihat disana ada dot ( . ) dimana itu adalah semau file dimana file dockerfile ini dibuat ke folder tujuan yaitu /var/www/html/laravel-docker

COPY yang kedua adalah mengcopy file vhost.conf yaitu config apache ke folder config apache yang ada di ubuntu saya.

RUN adalah perintah untuk menjalankan satu proses seperti proses install ‘apt-get install’ atau proses apa saja yang ada pada lingkungan linux.

FILE: vhost.conf

File ini berisi kode seperti berikut:

<VirtualHost *:80>
    DocumentRoot /var/www/html/laravel-docker/public

    <Directory "/var/www/html/laravel-docker/public">
        AllowOverride all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Jika yang pernah membuat virtualhost dengan apache sudah mengerti pasti kode ini ya.

File ketika kita skip dulu, nanti kita lanjutkan dibawah setelah kita berhasil membuat image dengan docker.


[crp]


Membuat Image Docker

Setelah Dockerfile sudah kita isi, mari kita buat image tersebut dengan perintah:

docker build --file .docker/DockerFile -t laravel-docker .

Ketika kita ketik di commandline, ini membutuhkan waktu yang agak lama dan memerlukan koneksi internet karena docker sedang mendownload resources2 yang telah kita ketik di file Dockerfile.

–file artinya kita memanggil Dockerfile

-t artinya kita beri nama image tersebut dengan laravel-docker. Lalu di belakang ada titik yang menandakan bahwa docker berada di current folder yaitu laravel-docker. Pastikan kita menggetik perintah diatas di dalam folder laravel-docker ya.

Jika berhasil, kita ketik perintah kembali untuk melihat apa sudah ada image yang telah kita buat tadi dengan perintah.

docker images

Hasil akan seperti atau ada beberapa kolom seperti ini.

Keliatan ya ada REPOSITOY laravel-docker. Saya buatnya sudah 13 hari yg lalu 😀

Setelah itu, mari kita coba jalankan docker laravel ini dengan perintah

docker run --rm -p 8080:80 laravel-docker

Perintah tersebut menjalankan laravel-docker dengan beberapa flag.

–rm, artinya akan menghapus laravel-docker sebelumnya jika masih berjalan.

-p, artinya adalah port untuk menjalankan laravel-docker ini. 8080:80 artinya adalah kita menggunakan port 8080 lalu port 80 itu port di image dockernya. Port 8080 ngemap ke port 80 yg ada di image docker.

Coba akses pada browser kawan-kawan dengan http://localhost:8080 akan menampilkan laravel page.

Lalu jika kita ketik perintah

docker ps

akan menampilkan list image yang sedang berjalan.

docker ps

Sampai disini, laravel dan docker sudah bisa kita gunakan namun ketika kita menjalankan docker run tersebut, setiap ada perubahan dari kode kita, docker run tersebut tidak memberikan perubahan dari kode kita. Nah untuk itulah kita gunakan docker-compose.

FILE: docker-compose.yml

File ini adalah settingan untuk docker-compose. apa itu docker-compose?

Docker Compose itu seperti tool untuk menghubungkan dan menjalankan banyak containers/tempat. Beberapa penjelasan lengkap ada di link berikut: https://docs.docker.com/compose/overview/

Baik, sekarang isi docker-composer.yml ini seperti berikut:

version: '2.1'

services:
  laravel-docker:
    image: laravel-docker
    build: 
      context: .
      dockerfile: .docker/DockerFile
    ports:
      - 8080:80
    volumes:
      - .:/var/www/html/laravel-docker
    links:
      - mysql
    environment:
      DB_HOST: mysql
      DB_DATABASE: laravel_docker
      DB_USERNAME: root
      DB_PASSWORD: root
  mysql:
    image: mysql:5.6
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: laravel_docker
      MYSQL_USER: root
      MYSQL_PASSWORD: root
      MYSQL_ROOT_PASSWORD: root

Setelah itu, mari kita jalankan docker dengan perintah

docker-compose up --build

Kode diatas seperti kita menjalankan docker build diatas, namun kita jalankan dengan docker-compose.

Setelah berhasil kita build dengan docker-compose. Saatnya kita jalankan dengan perintah

docker-compose up

Jika berjalan lancar, coba buka kembali url http://localhost:8080. Apa memunculkan halaman laravel?

Tada, kita berhasil menggunakan docker-compose.

Jika ada error, pastikan folder storage dan bootstrap di laravel-docker itu di set dengan perintah

chmod -R o+rw bootstrap/ storage/

Pada penjelasan di atas saya sudah bilang jika ada perubahan maka docker-compose akan membaca perubahan tersebut. Silahkan coba-coba mengganti kode atau merubah kode pada laravel.

Ini saya jalankan tanpa merestart docker. Keren docker-compose!

Ada sedikit pertanyaan. Pada laravel-docker kita tersebut, terdapat perintah untuk menginstall mysql. Lalu bagaimana jika kita ingin menambahkan software/component/lainnya ke dalam image laravel-docker kita?

Misalnya kita ingin menambahkan redis ke dalam image kita. Hal ini bisa kita lakukan dengan cara mengedit docker-compose.yml lalu menambahkan redis sehingga menjadi seperti ini.

version: '2.1'

services:
  laravel-docker:
    image: laravel-docker
    build: 
      context: .
      dockerfile: .docker/DockerFile
    ports:
      - 8080:80
    volumes:
      - .:/var/www/html/laravel-docker
    links:
      - mysql
    environment:
      DB_HOST: mysql
      DB_DATABASE: laravel_docker
      DB_USERNAME: root
      DB_PASSWORD: moklet
  mysql:
    image: mysql:5.6
    ports:
      - 13306:3306
    environment:
      MYSQL_DATABASE: laravel_docker
      MYSQL_USER: root
      MYSQL_PASSWORD: moklet
      MYSQL_ROOT_PASSWORD: moklet
  redis:
    image: redis:4.0-alpine
    ports:
      - 16379:6379

Terlihat di paling akhir, ada penambahan redis dengan port 16379:6379.

Jangan lupa di build dulu ya dengan perintah

docker-compose up --build

Dan jangan lupa juga menginstall component php-predis pada laravel kita.

Mengakses commandline di Docker yang aktif

Ketika docker-compose itu aktif atau sedang berjalan, kita bisa akses masuk ke environment docker tersebut. Untuk apa masuk?

Biasanya kita masuk ke environment tersebut untuk menjalankan perintah-perintah pada apps kita (laravel). Misalnya kita ingin membuat migrations. Karena membuat migration itu kaitan dengan MySQL, makanya kita perlu akses commandline environment docker.

Kalau kita akses pakai environment biasa? Bisa saja namun ingat, mungkin saja MySQL yang di docker dengan MySQL yang ada di laptop kita berbeda versi. Nah untuk itulah kita jalankan commandline di docker.

Perintah untuk masuk ke environment docker adalah:

docker-compose exec laravel-docker /bin/bash

Sampai disini, kawan-kawan bisa menjalankan perintah seperti php artisan migrate atau lainnya.

Akses MySQL Docker

Telah disebutkan diawal bahwa di laptop saya terinstall MySQL versi 5.7. Sedangkan project yang berjalan itu membutuhkan MySQL versi 5.6. Oleh sebab itulah di docker-compose.yml saya set mysql versi 5.6.

Lalu apa MySQL tersebut bisa diakses? Bisa dong. Portnya aja akses sesuai dengan yang ada di docker-compse.yml.

Pada docker-compose.yml tersebut saya setting mysql ke port 13306: 3306 artinya jika diakses di luar docker mesti dengan port 13306 sedangkan di docker menggunakan port 3306.

Jika dijalankan akan memunculkan seperti ini

Nah dari sini kita bisa akses MySQL versi 5.6. Inget ya untuk pengembangan laravel-docker ini pastikan kita menggunakan versi ini. Jangan lupa nanti akses mysql yg default di local lagi.

Sampai disini kita udah bisa pakai nih docker dengan laravel dimana di dalam docker terinstall MySQL versi 5.6 sedangkan di local laptop kita terinstall MySQL versi 5.7.

Jangan seneng dulu, docker punya beberapa kasus dan fitur menarik lainnya lho. Baca terus dokumentasinya, terus mencoba dan kalau berminat ikut belajar bareng yuk 😀 di kursus training backend laravel.

Kode ini bisa dilihat di github: https://github.com/adiputra22/laravel-docker

Bye 🙂

Artikel lainnya

4 comments

    1. kode laravel kita ya? kalau kode laravel kita tidak perlu di build. tapi kalau settingan terkait seperti apache, library yang baru ditambah itu perlu di build om 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: