Docker Swarm: Orkestrasi Container untuk Tim Kecil

Foto oleh Medium

Foto oleh Medium
Docker Swarm menawarkan orkestrasi container tanpa kerumitan operasional Kubernetes. Untuk tim yang menjalankan kurang dari selusin layanan di sejumlah kecil node, clustering, load balancing, rolling update, dan manajemen secret bawaan Swarm memberikan sebagian besar yang Anda butuhkan — dan Anda dapat menyiapkannya dalam waktu kurang dari sepuluh menit hanya menggunakan Docker CLI yang sudah Anda kenal. Panduan ini mencakup arsitektur Docker Swarm, setup cluster, deployment stack, dan skenario di mana Swarm adalah pilihan yang tepat.
Kubernetes adalah standar industri untuk orkestrasi container skala besar, tetapi kurva pembelajaran dan overhead operasionalnya signifikan. Docker Swarm sengaja dibuat lebih sederhana: lebih sedikit abstraksi, tidak ada komponen control plane terpisah yang perlu dikelola, dan konfigurasi via sintaks docker-compose.yml yang sama yang sudah digunakan sebagian besar developer.
Swarm unggul dalam skenario tertentu: deployment kecil hingga menengah (2-20 node), tim tanpa platform engineer khusus, proyek di mana kesederhanaan operasional binary tunggal penting, dan environment di mana Docker Compose sudah digunakan untuk development lokal dan Anda menginginkan upaya translasi hampir nol ke produksi. Perusahaan hosting, startup, dan tim internal tool sering menemukan Swarm cukup selama bertahun-tahun.
Cluster Swarm terdiri dari node manager dan node worker. Manager mempertahankan state cluster dalam log Raft terdistribusi dan menjadwalkan task pada worker. Swarm produksi harus memiliki jumlah ganjil manager (3 atau 5) untuk toleransi kesalahan Raft quorum — cluster 3 manager mentoleransi satu kegagalan manager. Worker mengeksekusi container dan melaporkan status kembali ke manager tetapi tidak dapat memodifikasi state cluster.
Gunakan 3 node manager untuk Swarm produksi — jangan hanya 1. Satu manager adalah single point of failure: jika ia turun, Anda tidak dapat men-deploy layanan baru atau men-scale yang sudah ada hingga ia pulih. Node worker akan terus menjalankan task yang ada, tetapi Anda kehilangan kendali atas cluster.
Menginisialisasi Swarm hanya memerlukan satu perintah pada manager pertama. Output-nya menyertakan dua join token — satu untuk manager tambahan, satu untuk worker. Jalankan perintah token worker di setiap mesin worker dan cluster Anda siap. Semua mesin memerlukan Docker yang terinstal dan port 2377 (manajemen cluster), 7946 (komunikasi node), dan 4789 (overlay network) terbuka di antara mereka.
Docker Swarm menggunakan file Compose (docker-stack.yml) yang diperluas dengan kunci 'deploy:' untuk jumlah replika, kebijakan update, constraint penempatan, dan batas sumber daya. Stack mengelompokkan layanan terkait dan dapat diperbarui secara atomik. Urutan rolling update 'start-first' membawa container baru online sebelum menghentikan yang lama, memastikan deployment tanpa downtime.
# Initialize the swarm on the manager node
docker swarm init --advertise-addr <MANAGER-IP>
# Add worker nodes (run the token command output on each worker)
docker swarm join --token <WORKER-TOKEN> <MANAGER-IP>:2377
# Deploy a stack from a Compose file
docker stack deploy -c docker-stack.yml myapp
# docker-stack.yml
version: "3.9"
services:
web:
image: myapp:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
order: start-first # zero-downtime rolling update
restart_policy:
condition: on-failure
ports:
- "80:3000"
networks:
- webnet
db:
image: postgres:16-alpine
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
volumes:
- db-data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
networks:
- webnet
secrets:
db_password:
external: true
volumes:
db-data:
networks:
webnet:
driver: overlaySwarm memiliki manajemen secret bawaan. Secret disimpan terenkripsi dalam log Raft dan di-mount sebagai file di '/run/secrets/' di dalam container — bukan sebagai variabel environment, yang dapat bocor melalui 'docker inspect' atau listing proses. Buat secret dengan 'echo mypassword | docker secret create db_password -' dan referensikan di bagian 'secrets:' file Compose.
Rolling update di Swarm dikontrol oleh blok 'update_config' dalam file Compose Anda. Anda mengkonfigurasi paralelisme (berapa banyak container yang diganti sekaligus), penundaan antara batch, dan tindakan kegagalan (jeda atau rollback). Mengatur 'order: start-first' berarti container baru sudah sehat sebelum yang lama dihapus, memberi Anda zero-downtime yang sesungguhnya.
Gunakan 'docker service ps myapp_web' untuk memantau rolling update secara real time. Setiap task menunjukkan state saat ini (running, failed, shutdown) dan node tempat ia dijadwalkan. Jika versi baru gagal dimulai (crash loop atau health check gagal), Swarm menerapkan 'failure_action' — baik menjeda rollout untuk investigasi atau secara otomatis melakukan rollback ke image sebelumnya.
Tidak seperti Kubernetes HPA, Docker Swarm tidak secara otomatis men-scale service berdasarkan CPU atau memori. Anda harus menjalankan 'docker service scale myapp_web=10' secara manual atau mengotomasi dengan skrip eksternal. Untuk kebutuhan autoscaling, integrasikan dengan alat monitoring yang memanggil Docker API, atau pertimbangkan untuk beralih ke Kubernetes jika autoscaling adalah kebutuhan keras.
Swarm membuat overlay network yang menjangkau semua node dalam cluster. Service yang terhubung ke overlay network yang sama dapat saling menjangkau dengan nama service — service discovery berbasis DNS sudah bawaan. Traffic eksternal masuk melalui port yang dipublikasikan di node mana pun dalam cluster, dan routing mesh bawaan meneruskan permintaan ke container yang sehat mana pun yang menjalankan service, terlepas dari node mana ia berada.
Routing mesh Swarm berarti node mana pun dengan port yang dipublikasikan dapat menerima traffic untuk suatu service, bahkan jika service tersebut tidak berjalan di node tertentu itu. Traffic diteruskan secara internal ke node yang memiliki container yang berjalan. Ini membuat konfigurasi load balancer sederhana — arahkan load balancer eksternal Anda ke semua node Swarm pada port yang dipublikasikan.
Traefik berintegrasi erat dengan Docker Swarm melalui konfigurasi berbasis label. Deploy Traefik sebagai global service di node manager, dan tambahkan label ke service lain Anda untuk mendefinisikan aturan routing, sertifikat TLS, dan middleware. Traefik memantau Docker socket untuk service baru dan memuat ulang konfigurasinya secara hot reload tanpa downtime, menghilangkan kebutuhan untuk memelihara file konfigurasi Nginx atau HAProxy statis.
Deploy Traefik dengan DNS challenge Let's Encrypt untuk TLS otomatis di semua service Swarm Anda. Gunakan Docker secret untuk menyimpan kunci API penyedia DNS dan mount ke container Traefik — jangan pernah meneruskannya sebagai variabel environment dalam file Compose yang mungkin dikontrol versi.
Observabilitas di Swarm mengharuskan Anda men-deploy stack monitoring sendiri. Setup paling umum adalah cAdvisor (metrik container per node) + Node Exporter (metrik host) + Prometheus (scraping dan alerting) + Grafana (visualisasi), semua di-deploy sebagai Swarm service. Portainer CE menyediakan UI grafis untuk mengelola service, stack, secret, dan config melalui browser.
Periksa kesehatan cluster secara berkala dengan 'docker node ls' (apakah semua node tersedia dan Active?), 'docker service ls' (apakah semua service pada jumlah replika yang diinginkan?), dan 'docker stack ps <stack>' (adakah task yang gagal atau yatim piatu?). Dalam pendekatan monitoring-as-code, pemeriksaan ini dapat dibungkus dalam skrip shell dan dijalankan sebagai cron job yang mendorong hasil ke sistem alerting Anda.
Konsep kunci Docker Swarm: manager node, worker node, stack, overlay network, and Swarm secret.