Setup secondary mysql 5.7 di VPS.
Saya buat tutorial ini berdasarkan issue yang saya dapat di tempat kerja. Saya akan share disini.
Casenya waktu itu saya ingin menjalankan 2 mysql sekaligus di satu VPS yang sama. Waktu itu mysql 8.0 sudah terinstall di VPS dengan port 3306, dan saya ingin install mysql lainnya yaitu versi 5.7. Tapi masalahnya adalah port 3306 sudah terpakai, bagaimana caranya menggunakan port lain?
Setelah mencari digoogle, akhirnya ketemu caranya yaitu menggunakan docker. Mysql 5.7 kita install menggunakan docker dengan port 3307.
Supaya ada bayangan, kira-kira seperti ini yang akan kita buat:
- Kondisi sekarang (garis warna merah)
Seperti yang saya jelaskan diawal tadi, jadi mysql 8.0 sudah berjalan diatas VPS dengan port 3306, konfigurasi mysql (my.cnf) dan datanya disimpan dalam storage VPS - Kondisi yang akan kita buat (garis warna hijau)
Kita akan mensetup mysql 5.7 dengan port 3307 menggunakan docker. Jadi kita akan buat docker containernya lalu file konfigurasi mysql (my.cnf) dan data mysqlnya akan kita mount ke dalam container. Jadi containernya akan membaca data mysqlnya dari storage VPS. Jika terjadi accident semisal containernya terhapus, maka konfigurasi dan data mysql tetap aman karena berada diluar container.
Oke sekarang kita sudah tahu kondisinya, saatnya setup mysql 5.7 di docker. Berikut langkah-langkahnya:
- Pull/download image mysql:5.7
- Buat file konfigurasi mysql my.cnf
- Jalankan mysql dengan membuat container
- Test koneksi ke mysql 5.7
1. Pull image mysql:5.7
Saya asumsikan disini kita sudah menginstall docker di lokal komputer.
Langkah pertama kita download / pull dulu image mysql 5.7 dari official mysql di dockerhub.
docker pull mysql:5.7
Setelah terdownload, image akan tersimpan di lokal komputer. Kita bisa mengeceknya dengan
docker images mysql:5.7
Hasil outputnya kira-kira akan seperti ini
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 2be84dd575ee 2 weeks ago 569MB
Untuk ukuran mysql 5.7 sebesar 569MB.
2. Buat file konfigurasi mysql my.cnf
Selanjutnya buat file konfigurasi untuk mysql terlebih dahulu. File my.cnf ini nantinya akan digunakan saat membuat container docker.
Contoh file my.cnf yang saya buat adalah seperti ini:
my.cnf
[mysqld]
default-time-zone = 'Asia/Bangkok'
group_concat_max_len = 1000000
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
bind-address = 0.0.0.0
innodb_buffer_pool_size = 10G
innodb_buffer_pool_instances = 7
innodb_log_file_size = 5G
max_connections = 500
Penjelasan:
- Saya menggunakan timezone Asia/Bangkok karena aplikasi yang saya buat untuk area Indonesia
- Saya menggunakan group_concat(), dan saya set max length nya adalah 1000000
- Bind address saya set 0.0.0.0 supaya mysql bisa diakses dari mana saja
- Saya menggunakan engine innoDB, jd saya set innodb buffer supaya data mysql bisa diload ke dalam RAM
- Maksimal koneksi yang bisa masuk ke database adalah 500 koneksi
File my.cnf saya simpan di path /var/www/html/docker/test/my.cnf
3. Jalankan mysql dengan membuat container
Buat container dari image mysql 5.7 yang sudah kita download tadi
docker run --name my-container-app -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 --restart unless-stopped -v /var/www/html/docker/test:/etc/mysql/conf.d/ -v my-container-app:/var/lib/mysql mysql:5.7
Penjelasan:
- docker run = Membuat container
- –name my-container-app = Berinama containernya dengan nama
my-container-app
- -d = Menjalankan mysql dalam mode detach (in background)
- -p 3307:3306 = Mengekspos port. 3307 adalah port yang bisa diakses dari luar, sedangkan 3306 merupakan internal port pada container
- -e MYSQL_ROOT_PASSWORD=123 = Set password untuk mysql. Kalian bisa ganti passwordnya dengan yang lain
- –restart unless-stopped = Container akan selalu direstart jika terjadi crash, kecuali distop
- -v /var/www/html/docker/test:/etc/mysql/conf.d/ = mount folder
test
yang ada dihost ke folderconf.d
yang ada dicontainer. Foldertest
tadi berisi filemy.cnf
- -v my-container-app:/var/lib/mysql = mount folder
my-container-app
yang ada dihost ke folder mysql yang ada dicontainer. Foldermy-container-app
akan tergenerate otomatis di dalam folder/var/lib/docker/volumes/
ketika kita menjalankandocker run
- mysql:57 = image yang sudah kita download tadi
Setelah menjalankan command diatas, pastikan containernya sudah terbuat dan running. Kita bisa cek dengan:
docker ps
Akan menampilkan container baru yang sedang running:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2962cb634031 mysql:5.7 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp my-container-app
4. Test koneksi ke MySQL 5.7
Terakhir kita test koneksi ke mysql 5.7. Disini saya menggunakan mysql-client:
mysql -u root -p -P 3307 -h 172.17.0.1
Pada command diatas, kita login ke mysql melalui IP 172.17.0.1. IP ini merupakan IP docker jika kita cek menggunakan ifconfig
diterminal. Kemungkinan IPnya akan berbeda, jadi harap sesuaikan saja.
Kemudian user untuk login kita menggunakan user root, password dan port 3307.
Jika berhasil connect, tampilannya akan seperti ini:
Diakses dari internet
Jika ingin mysql diakses dari luar (internet), jangan lupa buat user mysqlnya dan set % agar bisa diakses dari luar:
'namauser'@'%'
Dan jika ada security group / firewall, jangan lup allow port 3307 -nya pada inbound rule.
—–
Demikian tutorial Setup secondary mysql 5.7 di VPS menggunakan docker. Semoga bermanfaat!