> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Docker Swarm (Orkestrasi Kluster)

> Panduan komprehensif Docker Swarm: init, join, token, deploy stack, service management, scale, rolling update, rollback, node drain (migrasi), dan swarm leave.

## Apa itu Docker Swarm?

Ketika aplikasi mulai melayani banyak pengguna, menjalankan container di satu server fisik (single host) memiliki risiko kegagalan tunggal (*Single Point of Failure*). Jika server tersebut mati, seluruh layanan akan lumpuh.

**Docker Swarm** adalah platform orkestrasi kontainer bawaan (*native clustering*) dari Docker engine. Swarm mengubah kumpulan beberapa mesin Docker (disebut **Node**) menjadi satu sistem virtual terpadu dengan kemampuan:

* **High Availability (HA):** Menjaga aplikasi tetap aktif meskipun ada server yang mati mendadak.
* **Load Balancing Terdistribusi (Ingress Routing Mesh):** Meneruskan traffic jaringan ke container yang tepat di seluruh node.
* **Self-Healing:** Jika container di suatu node mati atau node tersebut offline, Swarm otomatis membuat container pengganti di node lain yang sehat.
* **Skalabilitas Mudah:** Menambah atau mengurangi jumlah replika container hanya dengan satu baris perintah.

***

## Arsitektur Swarm: Manager vs Worker

Kluster Swarm terdiri dari dua jenis peran node:

```mermaid theme={null}
flowchart TD
    Client["Traffic Klien / Browser"] --> Ingress["Ingress Routing Mesh (Port 80/443)"]
    subgraph SwarmCluster["Docker Swarm Cluster"]
        Manager1["Manager Node (Leader)"]
        Manager2["Manager Node (Raft Consensus)"]
        Worker1["Worker Node 1"]
        Worker2["Worker Node 2"]
        Worker3["Worker Node 3"]
    end
    Ingress --> Worker1
    Ingress --> Worker2
    Ingress --> Worker3
    Manager1 -.->|Instruksi Tugas| Worker1
    Manager1 -.->|Instruksi Tugas| Worker2
    Manager1 -.->|Instruksi Tugas| Worker3
```

1. **Manager Node:** Mengelola status kluster, menjalankan protokol konsensus *Raft*, menjadwalkan (*scheduling*) penempatan container, dan melayani API Swarm. Disarankan memiliki jumlah ganjil (1, 3, atau 5 node) untuk toleransi kegagalan quorum.
2. **Worker Node:** Bertugas murni mengeksekusi container/tugas (*tasks*) yang dialokasikan oleh Manager node.

***

## 1. Memulai Kluster (`init`, `join`, & `token`)

### Inisialisasi Manager Utama (`docker swarm init`)

Jalankan perintah ini di server pertama yang ingin kamu jadikan Swarm Manager:

```bash theme={null}
docker swarm init --advertise-addr <IP_PRIVATE_MANAGER>
```

*Parameter `--advertise-addr` menentukan IP antarmuka jaringan yang digunakan manager untuk berkomunikasi dengan node-node lain.*

### Mendapatkan Token Bergabung (`docker swarm join-token`)

Jika kamu lupa perintah join atau ingin menambahkan node baru di masa mendatang, jalankan ini di Manager:

```bash theme={null}
# Mengambil perintah & token untuk Worker baru:
docker swarm join-token worker

# Mengambil perintah & token untuk Manager baru:
docker swarm join-token manager

# Melakukan rotasi token jika dicurigai bocor:
docker swarm join-token --rotate worker
```

### Menggabungkan Server Lain ke Kluster (`docker swarm join`)

Buka terminal di server lain yang ingin digabungkan, lalu tempelkan perintah token yang didapatkan:

```bash theme={null}
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxx <IP_MANAGER>:2377
```

### Memeriksa Status Semua Node

Jalankan di node Manager:

```bash theme={null}
docker node ls
```

***

## 2. Deploy Aplikasi (`docker stack deploy`)

Di Docker Swarm, kita tidak menggunakan `docker run` biasa, melainkan mendefinisikan arsitektur sistem di dalam file `docker-compose.yml` dengan blok konfigurasi khusus `deploy`:

Contoh berkas `stack-app.yml`:

```yaml theme={null}
version: '3.8'

services:
  web:
    image: nginx:1.24-alpine
    ports:
      - "80:80"
    deploy:
      replicas: 4
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      update_config:
        parallelism: 2
        delay: 10s
        failure_action: rollback
        order: start-first
      rollback_config:
        parallelism: 1
        delay: 5s
      resources:
        limits:
          cpus: '0.50'
          memory: 256M

  api:
    image: node:18-alpine
    deploy:
      replicas: 2
      placement:
        constraints:
          - node.role == worker
```

### Melakukan Deployment Stack:

```bash theme={null}
# Men-deploy atau memperbarui stack
docker stack deploy -c stack-app.yml mystack

# Melihat daftar stack yang sedang berjalan
docker stack ls

# Melihat layanan (services) di dalam sebuah stack
docker stack services mystack

# Melihat seluruh task/container yang tersebar di node-node
docker stack ps mystack

# Menghapus stack beserta seluruh servicenya
docker stack rm mystack
```

***

## 3. Manajemen Layanan (`docker service`)

Jika kamu ingin menjalankan atau memodifikasi satu service mandiri tanpa stack YAML:

```bash theme={null}
# Membuat service baru
docker service create --name web-api --replicas 3 -p 8080:80 nginx:alpine

# Melihat daftar service
docker service ls

# Melihat detail task/container suatu service
docker service ps web-api

# Melihat agregasi logs dari seluruh replika service
docker service logs -f web-api
```

***

## 4. Skalabilitas Instan (`docker service scale`)

Kamu bisa menaikkan (*scale up*) atau menurunkan (*scale down*) jumlah replika container secara seketika tanpa downtime:

```bash theme={null}
# Mengubah jumlah replika web-api menjadi 8 instance
docker service scale web-api=8

# Melakukan scaling terhadap banyak service sekaligus
docker service scale mystack_web=6 mystack_api=4
```

Swarm secara otomatis mencari node yang paling longgar sumber dayanya untuk menempatkan replika-replika baru tersebut.

***

## 5. Rolling Update (Upgrade Tanpa Waktu Henti)

Untuk memperbarui versi image aplikasi ke versi baru:

```bash theme={null}
# Melakukan update image ke versi baru secara bertahap
docker service update --image nginx:1.25-alpine mystack_web

# Menambah / mengubah variabel environment
docker service update --env-add DATABASE_URL="postgres://..." mystack_api

# Membatasi sumber daya pada service yang sudah berjalan
docker service update --limit-memory 512M mystack_web
```

*Swarm akan mengupdate kontainer secara bertahap (rolling update) sesuai aturan `parallelism` dan `delay` sehingga website tetap online selama pembaruan.*

***

## 6. Rollback (Kembali ke Kondisi Stabil Sebelumnya)

Jika saat melakukan update aplikasi ditemukan kegagalan (crash/bug baru), kamu dapat langsung mengembalikan status service ke konfigurasi dan versi image sebelumnya:

```bash theme={null}
docker service update --rollback mystack_web
```

*Jika parameter `failure_action: rollback` dipasang di file compose, Swarm bahkan akan melakukan rollback secara otomatis jika healthcheck container baru gagal.*

***

## 7. Pemeliharaan Node & Migrasi Container (`node drain`)

Ketika satu server worker hendak dimatikan untuk perbaikan perangkat keras, upgrade OS host, atau maintenance:

```bash theme={null}
# 1. Ubah ketersediaan (availability) node menjadi 'drain'
docker node update --availability drain worker-node-02
```

> **Apa yang terjadi saat Drain (Migrasi)?**
> Swarm akan secara elegan mematikan semua container yang sedang berjalan di `worker-node-02` dan segera memigrasikan/menjalankannya di node lain yang berstatus `active`.

Setelah selesai maintenance, kembalikan node agar dapat menerima tugas kembali:

```bash theme={null}
docker node update --availability active worker-node-02
```

***

## 8. Meninggalkan & Membubarkan Swarm (`swarm leave`)

### Keluar dari Kluster (Dijalankan di Worker Node)

Jika server worker hendak dipensiunkan dari kluster:

```bash theme={null}
docker swarm leave
```

### Menghapus Node dari Daftar Manager

Setelah worker meninggalkan kluster, manager dapat membersihkan catatannya:

```bash theme={null}
docker node rm worker-node-02
```

### Membubarkan Swarm (Dijalankan di Manager Terakhir)

Jika kluster ingin dihentikan sepenuhnya:

```bash theme={null}
docker swarm leave --force
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.