1. Giới thiệu Docker Swarm

Trước hết ta cần biết Docker swarm là gì? Docker Swarm là một công cụ quản lý và triển khai container, được tích hợp sâu trong hệ sinh thái Docker. Với Docker Swarm, bạn có thể quản lý một cụm máy chủ (cluster) của các máy chủ Docker, tạo nên một môi trường linh hoạt và mở rộng cho việc triển khai ứng dụng.

2. Tại Sao Chúng Ta Cần Docker Swarm?

Hay nói cách khác, Docker Swarm có những ưu điểm gì khiến tôi cần đến?

  • Tự động hóa triển khai
  • Quản lý tài nguyên hiệu quả
  • Linh hoạt trong việc mở rộng ứng dụng theo nhu cầu

Ok, nói sơ qua là vậy, nếu các bạn muốn tìm hiểu kỹ hơn thì có thể sử dụng ChatGPT hoặc Google để biết thêm.

3. Thực hành

Ta sẽ thực hành bằng việc triển khai bài tập trên các máy ảo, cụ thể ở đây là 3 máy ảo linux ubuntu. Hãy cứ tưởng tượng bạn đang có 3 VPS để làm việc.

3.1. Oracle VM Virtual Box

Và để có được các máy ảo thì ta sẽ cần đến một số phần mềm tạo máy ảo. Cụ thể trong series này tôi sẽ dùng Oracle VM Virtual Box.

Các bạn có thể tại VM Virtual Box tại đây.

3.2. Vagrant

Bình thường chúng ta muốn có một cái máy ảo, sẽ cần có phần mềm và file cài đặt với đuôi .iso. Rồi sau đó cài đặt thủ công, setup môi trường, cấu hình của máy ảo.

Với một máy thì không nói làm gì, bây giờ ta có 3 máy, thậm chí 5 máy thì chẳng lẽ ta cứ ngồi tạo từng cái máy ảo với file .iso đó, đợi cài xong máy này mới tới máy tiếp theo thì đến bao giờ?

Không nên, hãy để những công việc lặp đi lặp lại đó được làm một cách tự động hóa, và lúc này chúng ta có Vagrant.

Vagrant là 1 công cụ xây dựng và quản lý các máy ảo, có thể chạy trên Ubuntu, MacOS và cả Windows.

Thay vì chúng ta phải tải iso của ubuntu về rồi ném vào trong VM virtual box để cài hệ điều hành, thì ta sẽ dùng luôn Vagrant để setup cấu hình cho một hoặc nhiều máy chỉ trong một file Vagrantfile.

Các bạn có thể cài đặt Vagrant tại đây.

3.3. Tạo máy ảo

Ok, sau khi tải và cài đặt VM Virtual Box và Vagrant. Các bạn hãy tạo một thư mục, mở Terminal hoặc CMD tại thư mục đó lên và gõ lệnh:

vagrant init

Với lệnh này, ta sẽ có một file Vagrantfle mặc định của Vagrant, file này cũng không có gì đặc biệt ngoài các cấu hình cơ bản mà Vagrant setup sẵn. Tuy nhiên ta sẽ không dùng file này.

Các bạn sẽ copy nội dung dưới đây vào Vagrantfile của các bạn:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  # Cấu hình chung cho tất cả máy ảo
  config.vm.box = "ubuntu/bionic64"
  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
    v.cpus = 1
  end

  # Cài đặt Docker và Docker Compose
  $script = <<-SCRIPT
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
  SCRIPT

  # Cấu hình cho từng máy ảo
  config.vm.define "manager01" do |manager01|
    manager01.vm.hostname = "manager01"
    manager01.vm.network "private_network", ip: "192.168.56.101"
    manager01.vm.provision "shell", inline: $script
  end

  config.vm.define "manager02" do |manager02|
    manager02.vm.hostname = "manager02"
    manager02.vm.network "private_network", ip: "192.168.56.102"
    manager02.vm.provision "shell", inline: $script
  end

  config.vm.define "worker01" do |worker01|
    worker01.vm.hostname = "worker01"
    worker01.vm.network "private_network", ip: "192.168.56.103"
    worker01.vm.provision "shell", inline: $script
  end

end

Giải thích một chút với file này, ta có thể tạo ra được:

  • Ba máy ảo ubuntu trên Oracle Virtual Box.
  • Mỗi máy được tạo cấu hình 2GB ram, 1 CPU.
  • Bên cạnh đó đã được cài sẵn Docker.
  • Ta sẽ gán luôn cho mỗi máy một địa chỉ ip tĩnh để sau này dễ thao tác.

Sau khi có file Vagrantfile này rồi, các bạn mở terminal lên (nơi có chứa file này). Với hệ điều hành Windows, các ta nên dùng PowerShell hoặc CMD chạy dưới quyền admin. Còn đối với Linux/MacOS thì nên chạy dưới quyền root rồi chạy lệnh:

vagrant up

Manager01:
vagrant-up-1

Manager02:
vagrant-up-2

Worker01:
vagrant-up-3

Lần sau khi đã tạo được máy ảo rồi thì vẫn dùng lệnh này để khởi động máy ảo, bởi lệnh này vừa để khởi động, vừa có thể cập nhật mới.

Nếu muốn tắt máy ảo đi thì dùng lệnh:

vagrant halt

Muốn xóa hẳn máy ảo thì dùng lệnh:

vagrant destroy

Sau khi khởi tạo được 3 máy ảo, vẫn tại terminal đó, ta dùng lệnh để truy cập vào máy ảo:

vagrant ssh <tên/ địa chỉ ip của máy ảo>

Ví dụ ở đây ta có ba máy tên là: manager01, manager02, worker01. Ta sẽ truy cập vào manager01, nhớ là chuyển sang root để có quyền cao nhất:

sudo -i

Các lệnh cơ bản của Vagrant có thể tham khảo thêm ở đây.

4. Khởi tạo Swarm Cluster

4.1. Yêu cầu

Tạo ra một Swarm với 3 node, trong đó có hai máy là manager và một máy worker. Trong ba máy ảo ubuntu đã tạo ở trên đã đặt tên sẵn là manager01, manager02worker01.

Hãy khởi tạo Docker Swarm Cluster tại máy manager01 rồi cho hai máy còn lại join vào swarm này.

4.2. Thực hành

Truy cập vào máy manager01 với lệnh:

vagrant ssh manager01

Chuyển sang root:

sudo -i

Sau đó khởi tạo Docker Swarm với lệnh:

docker swarm init --advertise-addr 192.168.56.101

Trong đó 192.168.56.101 là ip của máy manager01 (Trong Vagrantfile đã cấu hình sẵn ip tĩnh cho các máy).

Sau khi lệnh được thực thi, sẽ có một câu lệnh được trả về có dạng:

Swarm initialized: current node (9i36eagxmf4rsvvv0r1de0ohi) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1r2qrwy1rqnxbpwqhyqri02fntj9m0c97hx1ryeyzhb5in2x38-6hp9e1ggpvw53ka021nqnxwf1 192.168.56.101:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

swarm-mode

Các bạn thể copy luôn đoạn token ở trên để cho các máy với role là worker join vào:

   docker swarm join --token SWMTKN-1-1r2qrwy1rqnxbpwqhyqri02fntj9m0c97hx1ryeyzhb5in2x38-6hp9e1ggpvw53ka021nqnxwf1 192.168.56.101:2377

Hoặc có thể lấy token cho worker với lệnh:

docker swarm join-token worker

token-1

Lấy token dành cho manager:

docker swarm join-token manager

token-2

Truy cập vào hai máy manager02worker01 để join vào swarm:
swarm-mode
swarm-mode

Sau khi hai máy ảo manager02worker01 đã join vào Swarm. Ta có thể kiểm tra thông tin các node:

root@manager01:~# docker node ls
ID                            HOSTNAME    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
9i36eagxmf4rsvvv0r1de0ohi *   manager01   Ready     Active         Leader           24.0.2
i335m41xjobcp1yb2ir0cpm24     manager02   Ready     Active         Reachable        24.0.2
oeihwep66ziq90i34qhwofi41     worker01    Ready     Active                          24.0.2

5. Kết

Vậy là ta đã thực hành xong bước đầu tiên trong bài tập thực hành Docker Swarm. Cảm ơn các bạn đã dành thời gian đọc bài viết của mình. Nếu có vấn đề gì thắc mắc, hãy bình luận phía dưới nhé.