Container Orchestration dengan Docker Swarm
Container Orchestration merupakan teknik untuk mengotomatiskan deployment, management, scaling, dan networking dari sejumlah container yang tersebar di beberapa container host. Docker Swarm adalah tool dari Docker untuk menjalankan aktivitas container orchestration. Docker Swarm secara default telah tersedia di Docker engine.
Docker Swarm terdiri dari beberapa Docker host yang berjalan dalam mode swarm, ada yang bertindak sebagai manager yang bertugas untuk mengelola swarm dan ada yang bertindak sebagai worker yang bertugas untuk menjalankan service.
Tutorial Environment
Server yang digunakan di tutorial ini:
- VPS Ubuntu 20.04
- 1 manager
- 3 worker
- Docker v20.10
Port yang harus dibuka untuk menjalankan Docker swarm:
- 2377 TCP untuk komunikasi cluster management
- 7946 TCP dan UDP untuk komunikasi sesama node
- 4789 UDP untuk overlay network
Swarm Init
Jalankan inisialisasi swarm di manager node. VPS yang digunakan memiliki Public IP dan Private IP, di sini untuk komunikasi Docker swarm menggunakan Private IP.
1 | root@manager:~# docker swarm init --advertise-addr 10.130.0.2 |
Contoh hasil perintah di atas.
1 2 3 4 5 6 7 | Swarm initialized: current node (20jvg24uxxni8ye53q9xs9anx) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2mzm2e8jtpy2vh770sg8icn8xvfohtqpyx3u239t0usdylhhra-4wby12snfxzmydc4lmirime4s 10.130.0.2:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
Join sebagai worker
Jalankan perintah berikut di semua worker node untuk bergabung ke manager node.
1 | root@worker1:~# docker swarm join --token SWMTKN-1-2mzm2e8jtpy2vh770sg8icn8xvfohtqpyx3u239t0usdylhhra-4wby12snfxzmydc4lmirime4s 10.130.0.2:2377 |
Contoh hasil perintah di atas.
1 | This node joined a swarm as a worker. |
Menampilkan semua node yang ada, jalankan di manager node.
1 | root@manager:~# docker node ls |
Contoh hasil perintah di atas.
1 2 3 4 5 | ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 20jvg24uxxni8ye53q9xs9anx * manager Ready Active Leader 20.10.16 lten57flbx4p8e1mdd8e0ndur worker1 Ready Active 20.10.16 t615o7m6k3ma1bda6aihkeu55 worker2 Ready Active 20.10.16 syxvudeo4wejy1ld9lr8d94wc worker3 Ready Active 20.10.16 |
Join sebagai manager
Menampilkan token untuk bergabung sebagai manager, jalankan perintahnya di manager node.
1 | root@manager:~# docker swarm join-token manager |
Contoh hasil perintah di atas.
1 2 3 | To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-2mzm2e8jtpy2vh770sg8icn8xvfohtqpyx3u239t0usdylhhra-dg3bjks42jacryyb1pw7qvd51 10.130.0.2:2377 |
Jalankan perintah berikut di node yang ingin dijadikan sebagai manager.
1 | root@managerX:~# docker swarm join --token SWMTKN-1-2mzm2e8jtpy2vh770sg8icn8xvfohtqpyx3u239t0usdylhhra-dg3bjks42jacryyb1pw7qvd51 10.130.0.2:2377 |
Contoh hasil perintah di atas.
1 | This node joined a swarm as a manager. |
Secara default manager node juga bertugas sebagai worker node. Untuk menonaktifkan manager sebagai worker, set availability ke drain.
1 | root@manager:~# docker node update --availability drain manager |
Menampilkan kembali semua node. Availability dari manager berubah dari Active menjadi Drain, artinya sudah tidak bertugas lagi menjadi worker. Worker dapat juga dinonatifkan dengan menggunakan drain.
1 2 3 4 5 6 | root@manager:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 20jvg24uxxni8ye53q9xs9anx * manager Ready Drain Leader 20.10.16 lten57flbx4p8e1mdd8e0ndur worker1 Ready Active 20.10.16 t615o7m6k3ma1bda6aihkeu55 worker2 Ready Active 20.10.16 syxvudeo4wejy1ld9lr8d94wc worker3 Ready Active 20.10.16 |
Service
Membuat Swarm service, misalnya ingin menjalankan Nginx dengan 3 replikasi container dan berjalan di port 80.
1 | root@manager:~# docker service create --name myweb --replicas 3 -p 80:80 nginx |
Contoh hasil perintah di atas.
1 2 3 4 5 6 | 50006zxbfthho9o9hg5b44pbn overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service converged |
Menampilkan semua service.
1 | root@manager:~# docker service ls |
Contoh hasil perintah di atas.
1 2 | ID NAME MODE REPLICAS IMAGE PORTS 50006zxbfthh myweb replicated 3/3 nginx:latest *:80->80/tcp |
Menampilkan proses dari service myweb.
1 | root@manager:~# docker service ps myweb |
Contoh hasil perintah di atas.
1 2 3 4 | ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 55swzw6mnf9z myweb.1 nginx:latest worker3 Running Running 5 minutes ago tslbnc37lwxg myweb.2 nginx:latest worker1 Running Running 5 minutes ago 4hkymiso4s8l myweb.3 nginx:latest worker2 Running Running 5 minutes ago |
Dari hasil di atas terlihat bahwa myweb direplikasi menjadi 3 container yang berjalan di worker1, worker2, dan worker3.
Menampilkan container yang berjalan di worker1.
1 2 3 | root@worker1:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 87a1609f2c96 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp myweb.2.tslbnc37lwxgrg6h28jo7alh4 |
Pengujian
Browse http://Public-IP-Manager untuk menguji apakah Nginx sudah berjalan dan dapat diakses.
Dari hasil pengujian di atas Nginx sudah berjalan dan dapat diakses, tetapi tidak diketahui worker yang manakah yang melayani permintaan dari browser. Oleh karena itu, perlu mengubah halaman index.html menjadi keterangan nama container dan worker.
Jalankan di worker1
1 2 | root@worker1:~# echo "myweb.2@worker1" > index.html root@worker1:~# docker cp index.html myweb.2.tslbnc37lwxgrg6h28jo7alh4:/usr/share/nginx/html |
Jalankan di worker2
1 2 | root@worker2:~# echo "myweb.3@worker2" > index.html root@worker2:~# docker cp index.html myweb.3.4hkymiso4s8l09acf3luiqdfx:/usr/share/nginx/html |
Jalankan di worker3
1 2 | root@worker3:~# echo "myweb.1@worker3" > index.html root@worker3:~# docker cp index.html myweb.1.55swzw6mnf9zcym353h2p8k1h:/usr/share/nginx/html |
Pengujian akses dengan menggunakan curl.
1 | curl http://Public-IP-Manager |
Hasilnya memperlihatkan bahwa permintaan dari curl direspon secara bergantian.
Scaling
Service myweb saat ini berjalan dengan 3 replikasi. Jumlah replikasinya dapat dinaikkan atau diturunkan, misalnya ingin menaikkan menjadi 5 replikasi.
1 | root@manager:~# docker service scale myweb=5 |
Contoh hasil perintah di atas.
1 2 3 4 5 6 7 8 | myweb scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged |
Menampilkan kembali informasi proses pada service myweb.
1 2 3 4 5 6 7 | root@manager:~# docker service ps myweb ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 55swzw6mnf9z myweb.1 nginx:latest worker3 Running Running 44 minutes ago tslbnc37lwxg myweb.2 nginx:latest worker1 Running Running 44 minutes ago 4hkymiso4s8l myweb.3 nginx:latest worker2 Running Running 44 minutes ago 89bsmd3elu9p myweb.4 nginx:latest worker2 Running Running 35 seconds ago hwoqnc2ec4ka myweb.5 nginx:latest worker1 Running Running 35 seconds ago |
Dari hasil di atas terlihat bahwa 2 replikasi tambahan berada di worker1 (myweb.5) dan worker2 (myweb.4).
Selamat mencoba 🙂