← Back to Blog

Deploy Aplikasi Node.js dengan Docker

Deploy Aplikasi Node.js dengan Docker

Salah satu skill yang paling sering dipakai sehari-hari: bungkus aplikasi Node.js sederhana ke dalam Docker image, supaya bisa jalan konsisten di komputer manapun tanpa drama "di laptop saya jalan, di server enggak". Tutorial ini fokus ke alurnya saja — dari kode polos sampai container yang jalan.

Yang Dibutuhkan

  • Docker sudah terpasang
  • Node.js (opsional, hanya untuk tes lokal sebelum di-docker-kan)

1. Aplikasi Sederhana

Buat file index.js berisi server Express minimal:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.json({ status: 'ok', message: 'Halo dari dalam container!' });
});

app.listen(3000, () => {
  console.log('Server jalan di port 3000');
});

Dan package.json-nya:

{
  "name": "app-docker-demo",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.19.2"
  }
}

2. Tulis Dockerfile

Ini bagian intinya — instruksi untuk Docker membangun image dari kode di atas:

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install --production

COPY . .

EXPOSE 3000
CMD ["npm", "start"]

Tambahkan juga .dockerignore supaya file yang tidak perlu tidak ikut masuk ke image:

node_modules
npm-debug.log
.git
.env

3. Build & Jalankan

docker build -t app-docker-demo .
docker run -d -p 3000:3000 --name app-demo app-docker-demo

Cek apakah sudah jalan:

curl http://localhost:3000

Kalau muncul respons JSON dari server, berarti container sudah jalan dengan benar.

4. (Opsional) Pakai Docker Compose

Untuk proyek yang lebih dari satu service (misalnya app + database), docker-compose.yml lebih enak dipakai daripada perintah docker run panjang:

version: "3.8"
services:
  app:
    build: .
    ports:
      - "3000:3000"
    restart: unless-stopped

Jalankan dengan docker compose up -d.

Penutup

Dari sini, langkah lanjutannya biasanya: tambah .env untuk konfigurasi, sambungkan ke database lewat service terpisah di Compose, dan atur reverse proxy (Nginx) di depan container untuk domain & SSL.

Other posts