Konfigurasi dasar Docker sebagai development environment untuk Drupal

Submitted by ardi on Sat, 19/11/2016 - 02:12
Docker dan Drupal

Perlu diberitahu sebelumnya bahwa konfigurasi Docker yang akan saya bagi di artikel ini adalah yang sangat mendasar. 

Artikel ini bertujuan untuk memberi pengenalan pertama kali bagi siapa pun yang masih awam tentang Docker.
Dan diharapkan bagi siapa pun ke depannya akan belajar lebih dalam lagi tentang Docker dan mengimplementasikan nya ke dalam project sehari-hari. 

 

Permasalahan

Terkadang kita malas untuk meng-install Apache, MySQL dan PHP (AMP) secara terpisah di komputer kita untuk men-develop website (dengan fitur-fitur keren yang akan kita buat), sebelum kita men-deploy nya ke server kesayangan kita. Paling tidak itu yang saya alami sebelumnya.

 

Gambar 1
Gambar 1

 

“Tapi… tapi… kan ada WAMP, XAMPP dan MAMP? tinggal download aplikasinya dan install di komputer kita. AMP sudah ter-install dengan sendirinya tanpa harus meng-install nya secara terpisah dan manual”

Ok ok, memang ada aplikasi seperti itu yang sangat memudahkan kita untuk menginstalasi 3 komponen tersebut.

 

Macam-macam AMP
Gambar 2

 

Tetapi menurut saya pribadi, instalasi aplikasi tersebut tetap ada batasnya, contoh nya adalah: jika kita mempunyai website yang harus dijalankan di PHP 7, sedangkan di WAMP/XAMPP kita hanya mempunyai PHP 5.x, bagaimana kita mengatur konfigurasinya? Mungkin memang bisa, tetapi mungkin juga tidak mudah.

Jadi berdasarkan pengalaman saya tersebut, saya kerap kali ingin membuat komputer saya tetap bersih, dengan cara, saya tidak meng-install AMP, WAMP, XAMPP, MAMP dan yang lainnya secara manual. Dan juga yang tidak kalah pentingnya adalah, bagaimana kita mendistribusikan project website kita ke developer lain dengan mudah.

“Jadi alternatif lain pakai apa dong??”

 

Alternatif lain

Waktu itu saya sering memakai Vagrant untuk development di komputer saya. Jika aplikasi tersebut masih terdengar asing bagi kalian, singkat nya adalah… Vagrant merupakan alat untuk mengatur provisioning yang menggunakan virtual mesin.

Intinya kita bisa meng-install Linux, Apache, MySQL dan PHP (LAMP) dengan berbagai versi di virtual mesin yang sudah ter-install di komputer kita. 

 

Vagrant
Gambar 3

 

Namun dengan memakai aplikasi tersebut dalam waktu yang cukup lama untuk web development, makin lama membuat komputer saya semakin lambat. Mungkin juga karena website yang saya develop cukup besar ukuran nya, atau mungkin juga karena di Vagrant box saya terdapat macam-macam aplikasi seperti Apache SOLR, memcached dan lain-lain.

Atau mungkin juga saya mempunyai beberapa Vagrant box, karena saya juga mengerjakan web project yang lain dengan spesifikasi server yang berbeda-beda. Atau mungkin juga karena komputer saya termasuk lambat spesifikasinya. Dan lain-lain.

 

Pemain baru

Lalu muncul pemain baru, yaitu Docker. Jadi apa itu Docker? Secara singkat, Docker merupakan aplikasi open-source untuk meng-otomasi deployment dari aplikasi Linux dengan menggunakan perangkat lunak ber-basis kontainer (sumber: https://en.wikipedia.org/wiki/Docker_(software)).

Secara sekilas, Docker mirip seperti Vagrant, dan kontainer yang dimaksud disini bisa dianalogikan sebagai server, namun dengan berbagai kelebihannya antara lain:

  • Lebih terasa cepat dan mudah untuk meng-konfigurasi nya (di bandingkan Vagrant).
  • Mampu men-setup beberapa kontainer yang berbeda untuk aplikasi-aplikasi kita dengan mudah, contoh: kontainer A ter-install Apache dan PHP saja; kontainer B ter-install MySQL saja; kontainer C ter-install Apache SOLR saja, dan seterusnya.
  • Karena point ke dua di atas, kontainer yang satu terisolasi dari kontainer yang lain, dengan kata lain, jika kontainer B terdapat masalah, kontainer yang lain tidak terkena dampak nya.
  • Dan lain-lain.

Dan yang lebih istimewa nya lagi, fitur-fitur tersebut bisa kita konfigurasi di dalam komputer kita sendiri.

Untuk konfigurasi dasar nya, kita langsung saja ikuti penjelasan dan langkah-langkah di bawah ini.

 

Instalasi Docker

Langkah pertama yang harus kita lakukan adalah men-download dan meng-install Docker di komputer kita. Silahkan ke halaman Docker yang resmi untuk informasi lebih lanjut.

 

Catatan:
Dalam hal instalasi Docker, terdapat 2 jenis aplikasi instalasi yaitu: Docker toolbox dan Docker for Mac (atau Docker for Windows untuk sistem operasi Windows). 

Saya tidak akan membahas lebih jauh tentang perbedaan ke dua aplikasi tersebut di artikel ini karena sudah out-of-context, lagipula hal tersebut bisa langsung di lihat di sini untuk lebih lanjut nya: https://docs.docker.com/docker-for-mac/docker-toolbox/
 
Tapi secara garis besar menurut saya adalah:

  • Docker toolbox termasuk aplikasi versi lama. Yang terbaru adalah Docker for Mac.
  • Docker for Mac sangat mudah di instalasi daripada Docker toolbox.
  • Saya saat ini masih menggunakan Docker toolbox, karena menurut saya masih lebih stabil di banding Docker for Mac.
     

 

Setelah itu, pastikan Docker memang sudah terinstalasi dengan benar dengan menggunakan perintah di bawah ini di terminal kita.

docker -v

 

Jika mendapatkan output seperti di bawah ini, maka Docker sudah terinstalasi dengan benar.

Docker version 1.12.1, build 6f9534c

 

Sampai sini jangan bergembira dulu, jalan kita masih panjang

Mari kita lanjut ke langkah selanjutnya.

 

Anatomi dari Dockerfile

Di langkah berikut ini, pastikan kita sudah mempersiapkan project Drupal (files dan folder Drupal) yang akan kita pakai untuk mengkonfigurasi Docker.

 

Drupal project (files dan folder)
Gambar 4

 

Setelah itu, kita perlu membuat file dengan nama Dockerfile.
 
File ini adalah file utama yang akan di baca oleh Docker untuk pertama kali nya.

File Dockerfile ini bisa diletakkan di mana saja, asalkan harus tetap mengacu kepada file dan folder dari project Drupal kita.

Untuk jelasnya lihat dua contoh screenshot di bawah ini:

 

Contoh lokasi Dockerfile
Gambar 5

 

Contoh lokasi Dockerfile (2)
Gambar 6

 

Kode-kode dasar dari Dockerfile bisa di lihat di bawah ini:

FROM drupal:7-apache
MAINTAINER Pratomo Ardianto <ardi@email.com>

# Install packages
RUN apt-get update
RUN apt-get install -y \
       git \
       vim \
       cron \
       zip \
       unzip

# Install Composer.
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

# Install Drush via composer.
RUN composer global require drush/drush:7

# Configure composer bin path for drush inside container and from exec.
RUN echo 'export PATH="$HOME/.composer/vendor/bin:$PATH"' >> /root/.bashrc

 

Perhatikan sejenak kode-kode tersebut di atas, dan jangan takut jika ada yang belum mengerti.

Mari kita periksa baris per baris maksud dari kode-kode tersebut.

 

Baris pertama dan kedua pada Dockerfile

Baris pertama dan kedua
Gambar 7

 

Pada baris pertama, perintah FROM tersebut akan men-download image yang berjudul drupal:7-apache yang disimpan di dalam Docker public repository, yaitu di sini: https://hub.docker.com/_/drupal/

Perlu diketahui bahwa drupal disini adalah nama dari image itu sendiri, dan 7-apache yang di pisahkan dengan tanda titik dua (colon, :) adalah nama tag dari image yang di pakai tersebut.

Pada baris kedua, bagian ini hanya memberi tahu siapa yang membuat konfigurasi dari Docker ini.

 

Baris ke-5 dan selanjutnya pada Dockerfile

Dan pada baris ke-5 sampai dengan selesai, perintah RUN yang di ikuti dengan perintah-perintah lainnya sebenarnya adalah perintah-perintah dari Linux untuk meng-install beberapa aplikasi, salah satu nya adalah composer dan drush yang nanti akan digunakan di dalam kontainer kita.

Bagi yang terbiasa bekerja dengan Linux atau MacOS pastinya perintah-perintah tersebut mungkin sudah tidak asing lagi.

Mungkin sampai sini masih ada beberapa hal yang belum di mengerti? 
Tenang saja, mari kita lanjut ke bab selanjutnya.

 

Anatomi dari docker-compose.yml

Kalau di topik sebelumnya kita sudah mengetahui sedikit banyak tentang Dockerfile, sekarang kita lanjut ke file docker-compose.yml

Sedikit penjelasan mengenai Docker compose, ini adalah sebuah perintah dari Docker untuk memanggil dan menghubungkan beberapa kontainer secara simultan.

Seperti yang sudah saya jelaskan sebelumnya di bab Pemain Baru, kita bisa menciptakan/meng-konfigurasi beberapa kontainer, misalnya untuk MySQL, Redis, atau Apache SOLR

Namun dalam hal ini, yang kita butuhkan sekarang adalah untuk MySQL.

 

PENTING:
Perlu diketahui juga bahwa file docker-compose.yml perlu di letakkan di folder/direktori yang sama tempat file Dockerfile berada.

 

Silahkan cermati dulu kode-kode dari docker-compose.yml di bawah ini.
Sekali lagi, jangan takut jika memang ada yang belum di mengerti, nanti akan saya jelaskan lebih lanjut segera.
 

version: '2'
services:
  ardiweb:
    build: .
      ports:
  	  - "8080:80"
	volumes:
  	  - ./docroot:/var/www/html
	links:
  	  - ardimysql
	working_dir: /var/www/html

  ardimysql:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: passwd
      MYSQL_DATABASE: dbname
      MYSQL_USER: usrname
      MYSQL_PASSWORD: passwd
      expose:
        - "3306"

 

Pada baris pertama, ini adalah syntax untuk memulai Docker compose

version 2 disini maksudnya adalah untuk menyatakan bahwa perintah-perintah yang akan kita gunakan untuk Docker compose adalah yang terbaru, yaitu versi ke 2.

Pada baris kedua, perintah services disini adalah syntax untuk menyatakan kontainer-kontainer yang akan kita buat/konfigurasi, dalam hal ini adalah: ardiweb dan ardimysql (lihat gambar di bawah untuk info lebih lanjut).

Docker compose, 2 kontainer
Gambar 8

 

Kontainer pertama dalam docker-compose.yml

Seperti yang sudah di singgung sebelumnya dalam perintah docker-compose.yml tersebut terdapat 2 kontainer yang akan di konfigurasi, yang pertama adalah kontainer bernama ardiweb, dan yang kedua adalah ardimysql.

Untuk penamaan kontainer, kita bebas menamakan nya apa saja, asalkan jelas dan mudah di mengerti.

 

Mari kita bahas kontainer ardiweb lebih dulu. Kontainer ini akan berperan sebagai server untuk Apache dan PHP, beserta project Drupal kita.

Kita bisa melihat terdapat beberapa key:value disana yaitu:

 

  • build: .

Bagian ini untuk menentukan direktori mana yang akan kita digunakan untuk membuat kontainer. Biasanya direktori yang digunakan adalah yang terdapat file Dockerfile.

Harap diperhatikan bahwa value tersebut adalah berupa TITIK (.) yang dimana menyatakan root direktori yang kita akan kita gunakan.

 

  • ports:

Bagian ini untuk menentukan port mana dari kontainer yang akan di map (dihubungkan) ke komputer lokal kita. Dalam contoh tersebut di atas menyatakan bahwa port 80 yang di dalam kontainer akan di map ke dalam port 8080 di komputer kita.

Ini menyebabkan URL akses Drupal website kita akan memakai port 8080, contoh: http://192.168.99.100:8080 atau http://drupalweb.local:8080

 

  • volumes:

Bagian ini untuk menentukan direktori yang akan kita mount (hubungkan) dari kontainer ke direktori di komputer kita.

Berdasarkan contoh syntax di atas, berarti kita memakai referensi dari Gambar 6 diatas (lihat pada bab Anatomi dari Dockerfile).

 

  • links

Bagian ini untuk menghubungkan kontainer pertama dengan kontainer kedua yang bernama ardimysql.

 

  • working_dir

Bagian ini untuk menyatakan home direktori yang akan di akses pertama kali saat kita akses (bisa dianalogikan sebagai akses ke ftp atau ssh) ke dalam kontainer kita.

 

Kontainer kedua dalam docker-compose.yml

Sekarang mari kita bahas tentang kontainer bernama ardimysql.

Sesuai dengan namanya, kontainer ini akan berperan sebagai server untuk database MySQL kita.

Kita bisa melihat terdapat beberapa key:value juga disana yaitu:

 

  • image

Bagian ini untuk menyatakan Docker image yang akan kita pakai untuk kontainer kita yang akan di download dari Docker public repository, yaitu disini: https://hub.docker.com/_/mysql/.

Dan benar sekali bahwa bagian ini mirip seperti perintah FROM di Dockerfile yang sudah kita bahas sebelumnya (lihat pada bab Anatomi dari Dockerfile).

 

  • environment

Bagian ini untuk menyatakan environment variable di dalam kontainer kita untuk mengkonfigurasi aplikasi MySQL pertama kali nya.

Untuk mengetahui environment variable apa saja yang tersedia untuk mengkonfigurasi MySQL lebih jauh, bisa di lihat langsung instruksinya di sini: https://hub.docker.com/_/mysql/.

 

  • expose

Bagian ini untuk menyatakan bahwa port 3306 (port yang biasa digunakan oleh MySQL) supaya bisa di akses di dalam kontainer pertama kita (dalam hal ini adalah kontainer ardiweb).

 

Perintah “docker-compose up

Setelah kita selesai dengan konfigurasi file dari Dockerfile dan docker-compose.yml, jalankan perintah di bawah ini di terminal (command-line) kita:

docker-compose up

 

Setelah itu Docker akan men-download semua komponen-komponen, konfigurasi-konfigurasi, dan aplikasi-aplikasi yang sudah kita konfigurasi di dua file tersebut.

Disarankan saat menjalankan perintah tersebut harus menggunakan koneksi internet yang cukup memadai, karena proses ini mungkin akan terasa lama untuk pertama kali nya.

Setelah mendapatkan kurang lebih hasil seperti di bawah ini, berarti proses sudah selesai.

Contoh dari proses Docker yang sudah selesai.
Gambar 9

 

Setelah itu buka browser kesayangan anda, lalu ketik http://localhost:8080 di address bar nya. 

Pada saat itu seharusnya sudah muncul halaman instalasi website Drupal anda. Setelah itu jalankan proses instalasi seperti biasa.

Halaman instalasi Drupal
Gambar 10

 

Pastikan gunakan setting untuk database seperti bawah ini:

  • Database name: dbname
  • Database username: usrname
  • Database password: passwd
  • Database host: ardimysql

 

Jika kita perlu meng-export database yang sudah ada sebelumnya, kita bisa gunakan perintah di bawah ini: 

docker exec -i drupaldocker_ardimysql_1 mysql -uusrname -ppasswd dbname < database_anda.sql

 

“Loh… loh!! Dapat dari mana drupaldocker_ardimysql_1 tersebut??”

Kasih tau gak yaaa....??? Becanda :)

Silahkan jalankan perintah di bawah ini untuk melihat daftar dari kontainer-kontainer yang sudah ada di komputer kita (setelah kita menjalankan perintah docker-compose up):

docker ps -a

Setelah itu akan mendapatkan hasil seperti di bawah ini:

Daftar dari kontainer-kontainer yang sudah ada.
Gambar 11

 

Kemudian lihat bagian yang dilingkari merah dari screenshot di atas. Nama tersebut adalah nama Docker kontainer yang di dapat dari hasil konfigurasi docker-compose.yml yang sudah kita lakukan sebelumnya.

 

Akhir kata

Saya rasa sampai disini dulu artikel pertama saya mengenai konfigurasi dasar dan pemakaian Docker untuk development environment Drupal di komputer kita.

Sekali lagi, jika ada pertanyaan atau masalah seputar artikel ini, mohon beri komentar di bawah. 

Dan juga, tunggu artikel saya selanjutnya tentang Docker lebih lanjut, atau tentang hal yang lainnya seputar Drupal.

Selamat mencoba dan terus bereksplorasi dengan Docker
Dan yang pasti, selamat bersenang-senang, itu yang penting! ;) 

 

Terima kasih
Ardi