Jelajahi asal-usul Docker Swarm, alasan pembuatannya, dan kuasai konsep intinya dengan contoh praktis untuk deployment skala kecil hingga menengah.

Docker Swarm ada karena mengorkestra container dalam skala besar itu sulit. Ketika Anda melampaui menjalankan satu daemon Docker di satu mesin, Anda menghadapi masalah nyata: bagaimana cara mendistribusikan container di beberapa host? Bagaimana menangani kegagalan? Bagaimana mengelola jaringan dan penyimpanan? Bagaimana cara menskalakan layanan naik dan turun?
Docker Swarm menjawab pertanyaan-pertanyaan ini dengan solusi orkestrasi bawaan yang ringan. Tidak seperti Kubernetes, yang kuat tetapi kompleks, Swarm memprioritaskan kesederhanaan dan kemudahan penggunaan. Dirancang untuk tim yang membutuhkan orkestrasi container tanpa beban operasional yang berat.
Dalam artikel ini, kami akan mengeksplorasi mengapa Swarm ada, sejarahnya, masalah yang dipecahkannya, dan cara menggunakannya secara efektif dalam skenario dunia nyata.
Sebelum Docker Swarm, menjalankan container dalam produksi berarti menyelesaikan beberapa masalah sulit secara manual:
Tim baik membangun solusi khusus atau menggunakan alat eksternal. Ini rapuh dan memakan waktu.
Docker Swarm dibuat untuk menyediakan orkestrasi yang:
Filosofinya: orkestrasi harus dapat diakses oleh tim dari ukuran apa pun, bukan hanya mereka yang memiliki keahlian Kubernetes khusus.
Docker Swarm dimulai sebagai proyek terpisah pada tahun 2015. Ini adalah alat orkestrasi mandiri yang mengelola container Docker di seluruh cluster. Anda akan menjalankan Swarm sebagai layanan terpisah bersama Docker.
Karakteristik utama:
Pada Juni 2016, Docker 1.12 memperkenalkan Swarm Mode - perubahan fundamental. Swarm menjadi asli untuk Docker itu sendiri, bukan alat terpisah.
Apa yang berubah:
docker swarm initIni adalah titik balik. Swarm Mode membuat orkestrasi dapat diakses oleh setiap pengguna Docker.
Meskipun dominasi Kubernetes, Swarm tetap relevan karena:
Node adalah daemon Docker yang berpartisipasi dalam Swarm. Ada dua jenis:
Node Manager - Mengontrol cluster
Node Worker - Menjalankan tugas
Swarm yang sehat membutuhkan setidaknya satu manager. Untuk produksi, gunakan 3, 5, atau 7 manager (angka ganjil untuk konsensus Raft).
Layanan adalah abstraksi utama dalam Swarm. Ini mendefinisikan:
Layanan bersifat deklaratif - Anda menentukan keadaan yang diinginkan, dan Swarm mempertahankannya.
Tugas adalah instance yang berjalan dari layanan. Jika Anda membuat layanan dengan 3 replika, Swarm membuat 3 tugas. Setiap tugas menjalankan container.
Ketika tugas gagal, Swarm secara otomatis membuat pengganti.
Stack adalah kumpulan layanan yang didefinisikan dalam file Compose. Ini adalah setara Swarm dari namespace Kubernetes atau unit deployment.
Stack memungkinkan Anda menerapkan seluruh aplikasi (beberapa layanan) dengan satu perintah.
Jaringan overlay memungkinkan komunikasi antara container di berbagai host. Mereka dienkripsi secara default dan menangani penemuan layanan secara otomatis.
Ketika Anda membuat layanan, Swarm secara otomatis mendaftarkannya di DNS. Container dapat menjangkau layanan berdasarkan nama.
Swarm mencakup penyeimbangan beban bawaan:
Node manager menggunakan konsensus Raft untuk mempertahankan status cluster. Ini memastikan:
Raft memerlukan quorum (mayoritas) manager untuk membuat keputusan. Dengan 3 manager, Anda dapat kehilangan 1. Dengan 5, Anda dapat kehilangan 2.
Ketika Anda membuat layanan, manager:
Swarm menyimpan status cluster dalam database terdistribusi yang direplikasi di semua manager. Ini mencakup:
Jika manager mogok, yang lain terus beroperasi. Ketika itu pulih, itu menyinkronkan status dari cluster.
Mari buat cluster Swarm 3-node sederhana. Untuk contoh ini, kami akan menggunakan Docker di satu mesin dengan beberapa container yang mensimulasikan node.
docker swarm init --advertise-addr 127.0.0.1Output ini menunjukkan perintah untuk bergabung dengan node worker:
Swarm initialized: current node (abc123...) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-xxx 127.0.0.1:2377
To add a manager to this swarm, run the following command:
docker swarm join-token managerDalam produksi, Anda akan menjalankan ini di mesin terpisah. Untuk sekarang, mari verifikasi cluster:
docker node lsMari deploy layanan web sederhana:
docker service create \
--name web \
--replicas 3 \
--publish 8080:80 \
nginx:latestPeriksa status layanan:
docker service lsLihat tugas (container yang berjalan):
docker service ps webTingkatkan replika:
docker service scale web=5Kurangi replika:
docker service scale web=2Perbarui image:
docker service update \
--image nginx:1.25 \
webSwarm melakukan pembaruan bergulir secara default - mengganti tugas satu per satu, memastikan ketersediaan.
Tentukan stack dalam file Compose:
Deploy stack:
docker stack deploy -c docker-compose.yml myappDaftar stack:
docker stack lsLihat layanan dalam stack:
docker stack services myappHapus stack:
docker stack rm myappMasalah: Satu manager adalah titik kegagalan tunggal. Jika mogok, cluster berhenti menerima perintah.
Mengapa terjadi: Tim mulai kecil dan tidak merencanakan pertumbuhan.
Solusi: Selalu jalankan setidaknya 3 manager dalam produksi. Gunakan angka ganjil (3, 5, 7) untuk konsensus Raft.
Masalah: Layanan mengonsumsi semua sumber daya yang tersedia, membuat layanan lain kelaparan.
Mengapa terjadi: Mudah lupa batasan sumber daya saat mendefinisikan layanan.
Solusi: Selalu tetapkan permintaan dan batas sumber daya:
services:
web:
image: nginx:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256MMasalah: Anda tidak menyadari ketika node gagal atau layanan menjadi tidak sehat.
Mengapa terjadi: Swarm tidak menyediakan dashboard monitoring bawaan.
Solusi: Gunakan alat monitoring eksternal (Prometheus, Grafana) atau alat khusus Swarm (Orbiter, Portainer).
Masalah: Ketika container diganti, data hilang.
Mengapa terjadi: Nyaman menyimpan data secara lokal selama pengembangan.
Solusi: Gunakan volume untuk data persisten:
services:
db:
image: postgres:15
volumes:
- db-data:/var/lib/postgresql/data
deploy:
replicas: 1
volumes:
db-data:
driver: localMasalah: Swarm tidak tahu apakah layanan benar-benar sehat, hanya jika container berjalan.
Mengapa terjadi: Pemeriksaan kesehatan memerlukan konfigurasi tambahan.
Solusi: Tentukan pemeriksaan kesehatan dalam Dockerfile atau file Compose:
services:
web:
image: nginx:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40sDistribusikan manager di berbagai zona ketersediaan atau pusat data.
Kontrol di mana layanan berjalan:
services:
db:
image: postgres:15
deploy:
placement:
constraints:
- node.role == manager
- node.labels.disk == ssdPastikan container menangani SIGTERM dengan benar:
FROM node:18
WORKDIR /app
COPY . .
# Gunakan bentuk exec untuk memastikan sinyal diterima
EXEC ["node", "server.js"]Simpan password dan kunci API dengan aman:
echo "my-secret-password" | docker secret create db_password -Gunakan dalam layanan:
services:
db:
image: postgres:15
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
deploy:
replicas: 1
secrets:
db_password:
external: trueGunakan logging terpusat:
services:
web:
image: nginx:latest
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"Gunakan pembaruan bergulir untuk mempertahankan ketersediaan:
services:
web:
image: nginx:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
max_attempts: 3Mari kita bangun contoh praktis - platform e-commerce kecil dengan 3 layanan: frontend web, backend API, dan database.
┌─────────────────────────────────────────┐
│ Docker Swarm Cluster │
├─────────────────────────────────────────┤
│ Manager Node 1 Manager Node 2 │
│ (web-1, api-1) (web-2, api-2) │
│ │
│ Worker Node 1 Worker Node 2 │
│ (web-3, api-3) (db-1) │
└─────────────────────────────────────────┘1. Siapkan secrets:
mkdir -p secrets
echo "your-secure-password" > secrets/db_password.txt
echo "your-api-key" > secrets/api_key.txt2. Inisialisasi Swarm (di manager pertama):
docker swarm init --advertise-addr <manager-ip>3. Bergabung dengan node tambahan:
docker swarm join --token <token> <manager-ip>:23774. Deploy stack:
docker stack deploy -c ecommerce-stack.yml ecommerce5. Verifikasi deployment:
docker stack services ecommerceOutput:
6. Periksa tugas individual:
docker service ps ecommerce_webKetika lalu lintas meningkat, skalakan layanan web dan API:
docker service scale ecommerce_web=5 ecommerce_api=4Swarm secara otomatis mendistribusikan tugas baru di seluruh node yang tersedia.
Deploy versi baru dari layanan web:
docker service update \
--image myregistry/ecommerce-web:1.1 \
ecommerce_webSwarm memperbarui satu tugas pada satu waktu, memastikan layanan tetap tersedia.
Periksa kesehatan layanan:
docker service ps ecommerce_web --no-truncLihat log dari layanan:
docker service logs ecommerce_apiJika node worker gagal:
Tidak ada intervensi manual yang diperlukan.
Docker Swarm ada karena orkestrasi harus dapat diakses. Ini muncul dari filosofi Docker: buat alat yang kuat cukup sederhana untuk semua orang gunakan.
Meskipun Kubernetes mendominasi ruang enterprise, Swarm tetap menjadi pilihan yang tepat untuk tim yang menghargai kesederhanaan, fungsionalitas bawaan, dan overhead operasional yang lebih rendah. Ini sempurna untuk deployment skala kecil hingga menengah di mana Anda membutuhkan orkestrasi tanpa kompleksitas.
Poin-poin kunci yang perlu diambil:
Mulai dengan cluster 3-node, gunakan file Compose untuk definisi stack, implementasikan pemeriksaan kesehatan, dan pantau layanan Anda. Anda akan memiliki platform orkestrasi container yang andal dan mudah dirawat yang berkembang sesuai kebutuhan Anda.
Untuk contoh e-commerce, Anda sekarang memiliki template siap produksi. Sesuaikan dengan persyaratan spesifik Anda, tambahkan monitoring dan logging, dan Anda siap untuk deploy.