Docker Swarm
π Apa itu Docker Swarm?β
Docker Swarm adalah fitur orchestration bawaan Docker yang digunakan untuk mengelola dan menjalankan container dalam cluster (sekumpulan server).
Jika Docker biasa menjalankan container di 1 mesin, maka Docker Swarm memungkinkan:
- Menjalankan container di banyak mesin (node).
- High availability.
- Load balancing.
- Scaling otomatis.
- Self-healing (container mati β otomatis dibuat ulang).
π Konsep Dasar Arsitekturβ
Dalam Docker Swarm ada beberapa komponen utama:
1οΈβ£ Nodeβ
Node adalah server yang tergabung dalam cluster.
Ada 2 jenis node:
-
Manager Node
- Mengelola cluster.
- Menyimpan state cluster.
- Mengatur scheduling container.
- Leader election (Raft consensus).
-
Worker Node
- Hanya menjalankan container.
- Tidak mengatur cluster.
2οΈβ£ Serviceβ
Service adalah definisi container yang ingin dijalankan di cluster.
docker service create --replicas 3 nginx
Artinya:
- Jalankan 3 container nginx
- Jika 1 mati β otomatis dibuat ulang
3οΈβ£ Taskβ
Task adalah instance container yang dijalankan oleh service.
4οΈβ£ Overlay Networkβ
Docker Swarm menggunakan overlay network untuk komunikasi antar node. Container di node berbeda tetap bisa saling berkomunikasi seolah-olah satu LAN.
π Ilustrasi Topologi Swarmβ
Ilustrasi kita memiliki 3 Node (Manager, Worker 1 dan Worker 2) dengan masing-masing IP Address yang berbeda:
[ Manager Node ]
192.168.33.10
β
βββββββββββββββββββββββββ
β β
[ Worker 1 ] [ Worker 2 ]
192.168.33.11 192.168.33.12
Jika kita deploy:
docker service create --replicas 4 nginx
Maka 4 container akan tersebar otomatis ke worker node.
π Cara Kerja High Availabilityβ
Misalnya:
- Worker 1 mati
- 2 container hilang
Manager akan:
- Mendeteksi kegagalan
- Menjalankan ulang container di Worker 2
Ini disebut self-healing orchestration.
βοΈ Fitur Utamaβ
- β Built-in load balancing
- β Rolling update
- β Auto restart container
- β Secret management
- β Scaling service
- β Encrypted cluster communication
π¦ Perbandingan dengan Kubernetesβ
Perbandingan dengan βΈοΈ Kubernetes:
| Aspek | Docker Swarm | Kubernetes |
|---|---|---|
| Kompleksitas | Mudah | Kompleks |
| Setup | Sangat cepat | Butuh konfigurasi banyak |
| Learning curve | Rendah | Tinggi |
| Enterprise scale | Terbatas | Sangat besar |
| Popularitas | Menurun | Sangat dominan |
π― Kapan Menggunakan Docker Swarm?β
Cocok jika:
- Ingin cluster sederhana
- Tidak butuh kompleksitas Kubernetes
- Infrastruktur kecilβmenengah
- Untuk lab, riset, atau small production
π₯ Contoh Implementasiβ
Contoh implementasi Docker Swarm menggunakan Vagrant (Bisa diganti dengan Virtual Manchine seperi VMWare, Virtualbox dll) dengan membuat cluster lab lokal (1 manager + 2 worker).
Contoh ini cocok untuk:
- Lab DevOps
- Simulasi distributed system
π― Arsitektur Labβ
Kita akan membuat 3 VM:
| VM | Role | IP |
|---|---|---|
| node1 | Manager | 192.168.33.10 |
| node2 | Worker | 192.168.33.11 |
| node3 | Worker | 192.168.33.12 |
Semua VM berbasis:
- Alpine Linux
Virtualisasi menggunakan:
- Vagrant
- Provider: VirtualBox
Cluster orchestration:
- Docker Swarm
π Struktur Folderβ
swarm-cluster/
β
βββ manager/
β βββ Vagrantfile
β
βββ worker1/
β βββ Vagrantfile
β
βββ worker2/
βββ Vagrantfile
1οΈβ£ Vagrantfile β Managerβ
π manager/Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "generic/alpine319"
config.vm.hostname = "manager"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
vb.memory = 1024
vb.cpus = 1
end
config.vm.provision "shell", inline: <<-SHELL
apk update
apk add docker
rc-update add docker boot
service docker start
adduser vagrant docker
SHELL
end
2οΈβ£ Vagrantfile β Worker 1β
π worker1/Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "generic/alpine319"
config.vm.hostname = "worker1"
config.vm.network "private_network", ip: "192.168.33.11"
config.vm.provider "virtualbox" do |vb|
vb.memory = 1024
vb.cpus = 1
end
config.vm.provision "shell", inline: <<-SHELL
apk update
apk add docker
rc-update add docker boot
service docker start
adduser vagrant docker
SHELL
end
3οΈβ£ Vagrantfile β Worker 2β
π worker2/Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "generic/alpine319"
config.vm.hostname = "worker2"
config.vm.network "private_network", ip: "192.168.33.12"
config.vm.provider "virtualbox" do |vb|
vb.memory = 1024
vb.cpus = 1
end
config.vm.provision "shell", inline: <<-SHELL
apk update
apk add docker
rc-update add docker boot
service docker start
adduser vagrant docker
SHELL
end
π Cara Menjalankanβ
Jalankan masing-masing secara terpisah:
cd manager
vagrant up
cd ../worker1
vagrant up
cd ../worker2
vagrant up
π§ Inisialisasi Swarmβ
1οΈβ£ Masuk ke Managerβ
cd manager
vagrant ssh
Inisialisasi swarm:
docker swarm init --advertise-addr 192.168.33.10
Token akan keluar, copy token worker.
Terkadang ada kasus dimana di beberapa environment Alpine Linux + VirtualBox, tidak otomatis diarahkan ke IPv4, sehingga manager MENOLAK koneksi TCP IPv4. Untuk mengatasi hal tersebut jalankan perintah dibawah ini untuk mengarahkan ke IPv4:
docker swarm init \
--advertise-addr 192.168.56.10 \
--listen-addr 0.0.0.0:2377
Value --listen-addr 0.0.0.0:2377 dapat di ubah dengan IP langsung --listen-addr 192.168.56.10:2377.
2οΈβ£ Join Workerβ
Masuk ke worker1:
cd worker1
vagrant ssh
Lalu:
docker swarm join --token <TOKEN> 192.168.33.10:2377
Ulangi di worker2.
π Verifikasiβ
Di manager:
docker node ls
Harus muncul:
- manager β Leader
- worker1 β Ready
- worker2 β Ready
π¦ Deploy Serviceβ
Di manager:
docker service create \
--name web \
--replicas 3 \
-p 8080:80 \
nginx:alpine
Cek distribusi:
docker service ps web
Cek node:
docker node ls
π Uji Self-Healingβ
Matikan docker di worker:
service docker stop
Cek di manager:
docker service ps web
Swarm akan memindahkan container otomatis.
Untuk melihat token yang ada manager jalankan perintah di bawah ini:
docker swarm join-token manager
Jika service docker di jalankan lagi pada worker jangan lupa cek di manager statusnya:
docker node ls
π Scale service yang sudah adaβ
Cek service:
docker service ls
docker service ps web
Scale service menjadi 3:
docker service scale web=3