Panduan Lengkap Tutorial Setup Docker Compose MySQL dan Node JS untuk Developer Profesional

Pernahkah Anda mengalami situasi di mana aplikasi berjalan sempurna di laptop Anda, namun tiba-tiba mengalami error saat di-deploy ke server staging atau production? Masalah klasik “it works on my machine” ini telah menjadi momok bagi para developer selama puluhan tahun. Namun, dengan kemajuan teknologi kontainerisasi, masalah tersebut kini memiliki solusi yang elegan. Dalam artikel ini, kita akan membahas secara mendalam mengenai tutorial setup docker compose mysql dan node js untuk menciptakan lingkungan pengembangan yang konsisten, portabel, dan efisien.

Mengintegrasikan Node.js sebagai backend dan MySQL sebagai database menggunakan Docker Compose bukan hanya soal tren teknologi, melainkan sebuah kebutuhan untuk skala aplikasi modern. Docker memungkinkan Anda membungkus aplikasi beserta seluruh dependensinya ke dalam satu unit standar yang disebut kontainer. Dengan Docker Compose, Anda dapat mengelola multi-kontainer tersebut dengan satu file konfigurasi sederhana. Mari kita mulai perjalanan teknis ini untuk meningkatkan produktivitas coding Anda.

Mengapa Menggunakan Docker Compose untuk Node.js dan MySQL?

Sebelum masuk ke teknis tutorial setup docker compose mysql dan node js, penting bagi kita untuk memahami filosofi di baliknya. Docker Compose adalah alat yang digunakan untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer. Tanpa Docker Compose, Anda harus menjalankan perintah docker run secara manual untuk setiap layanan, mengatur network secara manual, dan menghubungkan volume satu per satu.

Statistik menunjukkan bahwa tim pengembang yang menggunakan Docker dapat melakukan deployment 13 kali lebih sering dibandingkan tim yang tidak menggunakan kontainerisasi. Hal ini dikarenakan Docker mengeliminasi perbedaan antara lingkungan lokal, testing, dan produksi. Ketika Anda bekerja dengan MySQL, Docker memastikan bahwa versi database, konfigurasi port, dan penyimpanan data tetap konsisten di mana pun aplikasi dijalankan.

E-E-A-T Insight: Sebagai praktisi DevOps, saya sering menemukan bahwa kesalahan konfigurasi database adalah penyebab utama downtime. Dengan Docker Compose, konfigurasi tersebut dipusatkan dalam satu file (Infrastructure as Code), sehingga meminimalkan risiko human error.

Persiapan Sistem dan Prasyarat

Untuk mengikuti tutorial ini dengan lancar, pastikan perangkat Anda sudah terpasang beberapa tools berikut:

  • Docker Desktop: Tersedia untuk Windows, macOS, dan Linux.
  • Node.js: Meskipun kita akan menjalankan Node.js di dalam Docker, memiliki versi lokal (LTS direkomendasikan) sangat membantu untuk proses inisialisasi project.
  • Code Editor: Visual Studio Code adalah pilihan populer dengan ekstensi Docker yang sangat membantu.
  • Terminal/CLI: Pemahaman dasar tentang perintah terminal akan sangat berguna.

Struktur Folder Proyek yang Ideal

Organisasi file yang rapi adalah kunci dari maintainability aplikasi. Berikut adalah struktur folder yang akan kita gunakan dalam tutorial setup docker compose mysql dan node js ini:

my-node-app/
├── node_modules/
├── src/
│   └── index.js
├── .env
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── package.json
└── package-lock.json

Struktur ini memisahkan antara kode sumber aplikasi (src), konfigurasi Docker (Dockerfile & docker-compose.yml), dan manajemen environment (.env). Pemisahan ini memudahkan tim lain untuk memahami alur kerja aplikasi Anda dengan cepat.

Langkah 1: Inisialisasi Aplikasi Node.js

Pertama, buatlah folder proyek baru dan inisialisasi project Node.js Anda. Buka terminal dan jalankan perintah berikut:

mkdir my-node-app
cd my-node-app
npm init -y

Selanjutnya, instal beberapa package yang diperlukan seperti Express untuk server web dan MySQL2 untuk koneksi database:

npm install express mysql2 dotenv

Setelah itu, buat file src/index.js dan tambahkan kode dasar untuk memastikan server berjalan:

const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Node.js, MySQL, dan Docker berjalan lancar!');
});

app.listen(port, () => {
  console.log(`App running on http://localhost:${port}`);
});

Langkah 2: Menulis Dockerfile untuk Node.js

Dockerfile adalah blueprint untuk membuat Docker Image aplikasi Node.js Anda. Dalam tutorial setup docker compose mysql dan node js ini, kita akan menggunakan teknik multi-stage build atau setidaknya image yang ringan (Alpine) untuk efisiensi ruang penyimpanan.

Buat file bernama Dockerfile tanpa ekstensi di root project, lalu masukkan kode berikut:

# Gunakan image Node.js versi LTS berbasis Alpine Linux
FROM node:18-alpine

# Tentukan direktori kerja di dalam kontainer
WORKDIR /app

# Salin package.json dan package-lock.json lebih dulu (untuk optimasi cache)
COPY package*.json ./

# Instal dependensi
RUN npm install

# Salin seluruh kode aplikasi
COPY . .

# Ekspos port yang digunakan aplikasi
EXPOSE 3000

# Perintah untuk menjalankan aplikasi
CMD ["npm", "start"]

Mengapa kita menyalin package.json sebelum kode lainnya? Ini adalah teknik optimasi Docker layer caching. Jika Anda hanya mengubah kode di src/ tanpa mengubah dependensi, Docker tidak perlu menjalankan kembali npm install, sehingga proses build menjadi jauh lebih cepat.

Langkah 3: Konfigurasi docker-compose.yml

Sekarang kita sampai pada bagian inti dari tutorial setup docker compose mysql dan node js. File docker-compose.yml akan mendefinisikan dua layanan: app (Node.js) dan db (MySQL).

Buat file docker-compose.yml dan isi dengan konfigurasi berikut:

version: '3.8'

services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: my_database
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_USER: user_node
      MYSQL_PASSWORD: userpassword
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
      DB_USER: user_node
      DB_PASSWORD: userpassword
      DB_NAME: my_database
    depends_on:
      - db

volumes:
  db_data:

Penjelasan Parameter Penting:

  • image: mysql:8.0: Mengambil image resmi MySQL versi 8.0 dari Docker Hub.
  • volumes: Digunakan untuk persistensi data. Tanpa volume, data MySQL akan hilang saat kontainer dihapus.
  • depends_on: Memberitahu Docker untuk menjalankan kontainer db terlebih dahulu sebelum app.
  • environment: Menyimpan variabel rahasia seperti password. Di lingkungan produksi, disarankan menggunakan file .env.

Langkah 4: Menghubungkan Node.js ke MySQL

Salah satu tantangan dalam tutorial setup docker compose mysql dan node js adalah memastikan Node.js tidak mencoba terhubung ke MySQL sebelum database tersebut benar-benar siap menerima koneksi. Meskipun ada depends_on, MySQL membutuhkan waktu beberapa detik untuk inisialisasi internal.

Update src/index.js Anda untuk menyertakan logika koneksi database:

const mysql = require('mysql2');

const connection = mysql.createConnection({
  host: process.env.DB_HOST || 'db',
  user: process.env.DB_USER || 'user_node',
  password: process.env.DB_PASSWORD || 'userpassword',
  database: process.env.DB_NAME || 'my_database'
});

// Logika retry koneksi sederhana
const connectWithRetry = () => {
  console.log('Mencoba menghubungkan ke database...');
  connection.connect((err) => {
    if (err) {
      console.error('Koneksi gagal, mencoba lagi dalam 5 detik...', err);
      setTimeout(connectWithRetry, 5000);
    } else {
      console.log('Terhubung ke MySQL!');
    }
  });
};

connectWithRetry();

Langkah 5: Menjalankan dan Menguji Kontainer

Sekarang saatnya melihat keajaiban Docker bekerja. Pastikan Anda berada di direktori root proyek dan jalankan perintah berikut di terminal:

docker-compose up --build

Perintah ini akan membangun image untuk aplikasi Node.js dan mengunduh image MySQL, lalu menjalankan keduanya secara bersamaan. Anda akan melihat log di terminal yang menunjukkan MySQL sedang inisialisasi dan Node.js sedang menunggu koneksi.

Buka browser Anda dan akses http://localhost:3000. Jika Anda melihat pesan “Node.js, MySQL, dan Docker berjalan lancar!”, selamat! Anda telah berhasil menyelesaikan tutorial setup docker compose mysql dan node js.

Best Practices: Keamanan dan Optimasi

Membangun kontainer yang bisa berjalan adalah satu hal, namun membangun kontainer yang aman dan optimal adalah hal lain. Berikut adalah beberapa tips tambahan:

1. Gunakan .env File

Jangan pernah melakukan hardcode password di dalam docker-compose.yml jika Anda berencana mengunggah kode ke GitHub. Gunakan file .env dan tambahkan file tersebut ke .gitignore.

2. Gunakan User Non-Root

Secara default, Docker menjalankan proses sebagai root. Untuk keamanan lebih baik, buat user baru di Dockerfile Anda agar aplikasi Node.js tidak memiliki akses penuh ke sistem file kontainer.

3. Monitoring Resource

Gunakan perintah docker stats untuk memantau penggunaan CPU dan RAM dari kontainer Anda. MySQL seringkali memakan banyak memori, jadi pastikan server Anda memiliki spesifikasi yang cukup.

Troubleshooting Masalah Umum

Dalam mengikuti tutorial setup docker compose mysql dan node js, Anda mungkin menemui beberapa kendala berikut:

  • Error: Connection Refused: Biasanya terjadi karena Node.js mencoba terhubung sebelum MySQL siap. Gunakan skrip wait-for-it.sh atau logika retry seperti yang dijelaskan di atas.
  • Port Sudah Digunakan: Jika Anda sudah memiliki MySQL lokal yang berjalan di port 3306, Anda harus mengubah pemetaan port di docker-compose.yml menjadi "3307:3306".
  • Data Tidak Tersimpan: Pastikan volume sudah didefinisikan dengan benar agar data MySQL tetap ada meskipun kontainer dimatikan.
Download Boilerplate Project

Dapatkan file konfigurasi lengkap untuk memulai lebih cepat.

Kesimpulan dan Langkah Selanjutnya

Menguasai tutorial setup docker compose mysql dan node js adalah langkah besar menuju karir sebagai Full-stack Developer atau DevOps Engineer yang kompeten. Dengan Docker, Anda tidak hanya mempermudah diri sendiri, tetapi juga rekan tim dan proses deployment ke cloud provider seperti AWS, Google Cloud, atau DigitalOcean.

Key Takeaways:

  • Docker Compose menyederhanakan manajemen multi-kontainer.
  • Dockerfile harus dioptimalkan dengan layer caching.
  • Persistensi data MySQL wajib menggunakan Docker Volumes.
  • Logika koneksi database harus menangani delay inisialisasi MySQL.

Langkah selanjutnya, Anda bisa mencoba menambahkan layanan lain seperti Redis untuk caching atau Nginx sebagai reverse proxy ke dalam konfigurasi Docker Compose Anda. Teruslah bereksperimen dan selamat coding!

Tinggalkan komentar