$ aoox

DocsInfrastruktur

Docker Swarm

Menjalankan aplikasi sebagai service dengan replika di beberapa mesin, memakai orkestrator yang sudah ada di Docker — tanpa Kubernetes.

Untuk apa
Beberapa mesin di bawah satu panel
Bentuk
Aplikasi sebagai service + replika
Siapa
Owner (init/leave/node), admin melihat status

Swarm atau server remote?

Server remote (SSH)Swarm
BentukPanel mengendalikan daemon lain lewat SSHSatu cluster; scheduler Docker yang menempatkan task
AplikasiSatu container di server yang dipilihN replika yang bisa tersebar di beberapa node
DomainProxy per server (atau port host)Traefik di manager dengan swarm provider
Cocok untukLingkungan terpisah, region berbedaMenambah kapasitas untuk aplikasi yang sama

Keduanya bisa dipakai bersamaan: host aoox menjadi manager swarm, sementara server remote tetap melayani aplikasi lain secara terpisah.

Alur

  1. 01inithost jadi manager, overlay aoox-swarm dibuat
  2. 02joinnode lain bergabung dengan token dari panel
  3. 03serviceaplikasi diubah ke Mode deploy service + replika
  4. 04rollingdaemon mengganti task bertahap, rollback bila gagal

Mengaktifkan swarm

  1. Settings → Docker Swarm → Init swarm (owner)

    Isi Advertise address bila host punya lebih dari satu IP — alamat inilah yang dipakai node lain untuk menghubungi manager. Kosongkan untuk deteksi otomatis.

    aoox menjadikan daemon host sebagai manager, membuat overlay network aoox-swarm yang bisa di-attach, memasukkan proxy dan managed database ke sana, lalu mengaktifkan swarm provider Traefik.

  2. Gabungkan node lain

    Kartu Swarm menampilkan perintah join lengkap dengan token — jalankan di mesin yang akan bergabung (Docker sudah terpasang, port 2377, 7946, dan 4789/udp terbuka antar node):

    docker swarm join --token SWMTKN-1-… <ip-manager>:2377

    Token worker dan manager berbeda; token hanya ditampilkan kepada owner. Node yang bergabung muncul di daftar node beberapa detik kemudian.

  3. Pastikan registry terjangkau dari node lain

    Node menarik image sendiri dari registry lokal. Status swarm memperingatkan bila REGISTRY_PUBLIC_HOST masih localhost — node lain tidak bisa menariknya. Set ke hostname/IP yang terjangkau (dengan TLS atau insecure-registries) — lihat Registry.

Node lewat VPN (WireGuard)

Node di jaringan berbeda bisa digabung lewat terowongan VPN sehingga port swarm tidak terbuka ke internet. Atur ini saat init swarm:

  • Advertise address = IP tunnel manager (mis. 10.99.0.1). Port kontrol 2377 lalu hanya mendengarkan di alamat itu; Listen address menimpanya. Tanpa alamat apa pun, port tetap terbuka di semua interface.
  • MTU overlay = MTU tunnel, 1420 untuk WireGuard default. Docker mengurangi 50 untuk header VXLAN, jadi container mendapat 1370. Tanpa ini overlay mengira jaringannya 1500 (container 1450), dan paket yang lebih besar terbuang di dalam tunnel.
  • Port 2377/tcp, 7946, dan 4789/udp cukup terjangkau lewat tunnel. Di worker, join dengan --advertise-addr <ip-tunnel> --listen-addr <ip-tunnel>:2377.

MTU ditetapkan saat jaringan overlay dibuat: untuk mengubahnya di swarm yang sudah ada, kembalikan aplikasi ke mode container, keluar dari swarm, lalu inisialisasi ulang.

Mengelola node

AksiEfek
Availability: activeNode menerima task baru.
Availability: pauseTask yang ada tetap jalan; tidak menerima task baru.
Availability: drainTask dipindahkan ke node lain — dipakai sebelum maintenance.
Role: manager / workerPromosikan atau turunkan node. Jumlah manager ganjil (1, 3, 5) agar kuorum aman.
LabelPasangan key=value, mis. zone=eu — dipakai sebagai constraint penempatan.
Hapus nodeDitolak (409) bila node masih aktif; drain dulu, lalu hapus. Di node itu jalankan docker swarm leave.

Aplikasi sebagai service

Di Pengaturan aplikasi, ubah Mode deploy dari container ke service:

FieldKeterangan
ReplikaJumlah task yang dijalankan. Stop = skala ke 0; Start mengembalikannya.
PenempatanNode tertentu, atau constraint bebas (node.labels.zone==eu, node.role==worker, node.hostname, node.platform.os).
Rolling updateParalelisme (berapa task diganti sekaligus), jeda antar batch, dan urutan (start-first / stop-first).
  • Pergantian mode, replika, penempatan, atau limit dijalankan sebagai deployment config — tanpa build, dan tidak memblokir request.
  • Daemon melakukan rolling update sendiri; bila task baru tidak pernah jalan sampai batas waktu, spec lama dikembalikan dan aplikasi tetap melayani.
  • Aplikasi yang punya mount selalu ditempatkan di host tempat volumenya berada — volume Docker tidak ikut berpindah node.
  • Deploy ulang yang identik tetap memicu rolling update (ForceUpdate), jadi tombol Deploy selalu berefek.

Yang perlu diketahui tentang task

AspekDi mode service
LogSemua task, dari node mana pun.
MetrikDijumlahkan dari task yang berjalan di host — Engine API tidak bisa membaca task di node lain.
Job & terminal execHanya task lokal.
NotifikasiWatcher memberi tahu bila service bertahan di bawah jumlah replika (task yang tidak pernah start), dan watcher lain melaporkan task yang crash di node lain dalam sekitar 30 detik.
DomainTraefik swarm provider merutekan ke service, bukan ke container.

Keluar dari swarm

Kembalikan dulu semua aplikasi ke Mode deploy: container — keluar dari swarm menghapus service yang berjalan. Setelah itu Settings → Docker Swarm → keluar (owner). Node lain perlu menjalankan docker swarm leave sendiri.
Restart Docker setelah keluar
Keluar dari swarm memicu bug Docker (moby/moby#45144, masih terbuka): DNS internalnya berhenti me-resolve nama container di jaringan bridge untuk container yang sudah berjalan. Panel tetap berfungsi sampai container api-nya dibuat ulang atau di-restart (misalnya oleh update berikutnya), lalu tidak bisa menjangkau postgres dan mati. Begitu keluar, jalankan ini di server; semua container aoox menyala lagi sendiri:
sudo systemctl restart docker

Jebakan umum

GejalaPenyebab & solusi
Task pending: no suitable nodeConstraint tidak cocok dengan label node mana pun, atau aplikasi punya mount sehingga terkunci di host. Longgarkan penempatan.
Node lain: image pull failed / x509REGISTRY_PUBLIC_HOST masih localhost, registry tanpa TLS, atau node belum punya entri insecure-registries.
Service tidak pernah mencapai jumlah replikaHealth check gagal atau resource kurang; rolling update di-rollback otomatis setelah timeout. Cek log task.
Metrik kosong untuk aplikasi di node lainSesuai batasan: metrik hanya dari task lokal.
Node hilang setelah rebootDaemon node belum start, atau firewall menutup port swarm (2377/7946/4789).
Belum tersedia
Stack compose sebagai swarm stack; secret/config Swarm; exec dan metrik lintas node; penjadwalan otomatis volume antar node.

Langkah berikutnya

Ada yang keliru? Edit halaman ini di GitHub ↗