Menghubungkan Container MySQL dan Container Laravel di Docker


Dari artikel sebelumnya dalam seri Instalasi dan Inisiasi, muncul pertanyaan baru. Bagaimana menggunakan pangkalan data (database) MySQL apabila menjalankan aplikasi Laravel berbasis Docker?

Ada dua cara yang dapat dilakukan untuk menggunakan pangkalan data MySQL.

  1. Menginstal MySQL pada container Laravel (yang sebelumnya diberi nama laravel).
  2. Mengunduh image MySQL dan membuat container berbasis image tersebut.

Cara pertama merupakan langkah paling praktis. Kita cukup masuk ke bash container Laravel, kemudian melakukan instalasi MySQL. Semisal:

// masuk bash container laravel
$ docker exec -it laravel bash

// install mysql
$ apt install mysql-server

Selesai sudah. Tinggal sesuaikan konfigurasi pangkalan data pada aplikasi Laravel, maka aplikasi tersebut dapat menggunakan MySQL.

Permasalahnnya adalah, ketika kita membuat container baru (berbasis Laravel atau aplikasi lainnya), maka hal ini cukup merepotkan. Karena MySQL dalam container di atas lebih susah untuk diatur ketika diakses melalui container lain. Lebih parah lagi, ketika kita menghapus container Laravel tersebut, maka hilanglah semua pangkalan data di dalam container.

Cara kedua lebih aman dan nyaman digunakan, yaitu membuat container MySQL terpisah dengan container lainnya.

Instalasi MySQL

MySQL punya repositori official yang beralamat di hub.docker.com/r/mysql/mysql-server. Karena sudah bersifat automated build, maka saya sarankan untuk mengunduh dan menggunakan repositori tersebut.

// download dimage MySQL
$ docker pull mysql/mysql-server

// buat container MySQL
$ docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 mysql/mysql-server

Perhatikan bahwa saya menambahkan environment menggunakan opsi -e untuk menyetel katasandi bawaan MySQL menjadi root. Selanjutnya, periksa kembali container apa saja yang sudah berjalan menggunakan perintah docker ps.

Sampai di sini, kita sudah memiliki satu container MySQL yang berdiri sendiri. Jadi, total ada dua container dalam Docker, yaitu dengan nama laravel dan mysql. Container ini dapat digunakan sebagai sentral pangkalan data yang berbasis MySQL, atau juga dapat digunakan hanya untuk aplikasi tertentu.

Koneksi berhasil

Koneksi berhasil

Layaknya MySQL Server yang terinstal secara normal pada mesin, MySQL pada container tersebut juga dapat diakses melalui GUI Editor seperti HeidiSQL, SQLYog, atau MySQL Workbench. Sedangkan untuk akses melalui terminal butuh sedikit trik, yaitu dengan perintah di bawah.

$ docker run -it --link my-container-name:mysql --rm mysql/mysql-server:tag sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

Selengkapnya mengenai opsi yang tersedia, store file dan segala sesuatu yang berhubungan dengan MySQL Docker, dapat dibaca langsung pada halaman resmi berikut: hub.docker.com/r/mysql/mysql-server.

Menghubungkan MySQL dengan Container Lain

Karena secara tak kasat mata container MySQL dan container Laravel berada pada mesin yang berbeda, maka salah satu container harus menggunakan pengaturan khusus agar terhubung dengan container lainnya. Dalam hal ini container Laravel harus menambahkan opsi --link untuk yang disediakan oleh MySQL untuk menghubungkan keduanya. Berhubung container yang sudah ada tidak dapat diubah, maka kita diharuskan untuk membuat container baru, dengan perintah berikut.

$ docker run -d — name laravel-mysql -p 80:80 -v /home/user/laravel/:/var/www/laravel/ — link mysql:mysql/mysql-server eboraas/laravel

Perhatikan pada opsi --link, adapun format parameternya adalah: nama-container-mysql:image. Seperti yang dilakukan sebelumnya, kita sudah membuat container MySQL dengan nama mysql, kemudian diikuti dengan nama image mysql/mysql-server yang telah di-pull dari Docker.

Langkah terakhir, mengubah pengaturan pangkalan data pada berkas .env Laravel.

DB_CONNECTION=mysql
DB_HOST=mysql // bukan localhost, tapi disesuaikan dengan nama container mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=root

Jalankan aplikasi melalui peramban untuk menguji apakah pengaturan di atas sesuai dengan rencana di awal, menghubungkan container Laravel dengan MySQL.

***

Tidak hanya pangkalan data MySQL, beberapa service lain seperti MongoDB, PostgreSQL, Redis, dan lainnya juga diperlakukan kurang lebih serupa. Tergantung opsi yang tersedia pada image tersebut. Kesemuanya dijelaskan secara mendetail pada masing-masing halaman repositori.

Saya pribadi lebih suka membuat container satu persatu sesuai dengan kebutuhan aplikasi. Hal ini memang sangat merepotkan ketika saat instalasi dan konfigurasi, tapi sangat memudahkan ketika sudah berada di level development. Bagi saya, Docker sangat membantu dalam menghilangkan kesenjangan aplikasi atau service yang hanya bisa berjalan di sistem tertentu. Semisal, ketika aplikasi di production menggunakan versi lebih rendah atau lebih tinggi, saya hanya perlu mencari versi yang sama pada Docker untuk menyesuaikan environment dengan production. Tanpa harus dibuat repot untuk downgrade atau upgrade aplikasi/service pada mesin lokal.

Selanjutnya? Tinggal coding untuk membuat aplikasi.

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

Tinggalkan Balasan