Cách cài đặt Docker Swarm trên Ubuntu 22.04

theanh

Administrator
Nhân viên
Docker Swarm là một công cụ điều phối container được xây dựng trên Docker Engine. Công cụ này cho phép bạn tạo và triển khai một cụm các nút Docker trên nhiều máy chủ. Docker Swarm đơn giản hóa việc triển khai ứng dụng được chứa trong container của bạn thành một dịch vụ. Công cụ này cung cấp một cách đơn giản và dễ dàng nhất để quản lý và điều phối container.

Docker Swarm cung cấp một mức độ cao các ứng dụng khả dụng. Trong Docker Swarm, bạn có thể chạy một ứng dụng hoặc dịch vụ duy nhất trên nhiều nút, được gọi là 'Worker Nodes". Ngoài ra còn có một nút có tên là "Swarm Manager", là quản lý và điều phối trung tâm của Docker Swarm.

Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách cài đặt phần mềm Docker Swarm trên máy chủ Ubuntu 22.04 theo từng bước.

Điều kiện tiên quyết​

Để hoàn thành hướng dẫn này, hãy đảm bảo bạn được trang bị những thứ sau:
  • 3 máy chủ Ubuntu 22.04 - Một máy chủ sẽ được sử dụng làm Swarm Master/Manager và hai máy chủ sẽ được sử dụng làm Worker Nodes.
  • Người dùng không phải root có quyền quản trị viên sudo.

Thiết lập hệ thống​

Trước khi cài đặt Docker và Cấu hình Docker Swarm, bạn phải chuẩn bị hệ thống của mình bằng cách hoàn thành các tác vụ sau:
  • Mở cổng cho Docker Swarm: Bạn phải mở một số cổng được Docker Swarm sử dụng trên tất cả các máy chủ của mình. Bạn có thể thực hiện điều này thông qua UFW (Tường lửa đơn giản).
  • Thêm kho lưu trữ Docker: Bạn sẽ sử dụng kho lưu trữ Docker chính thức để cài đặt Docker Engine cho tất cả các máy chủ của mình.

Mở cổng cho Docker Swarm​

Trong phần sau, bạn sẽ mở cổng 22 cho SSH, sau đó là cổng 2377, 79464789 cho Docker Swarm thông qua UFW (Tường lửa đơn giản) trên Swarm Master/Manager và Swarm Node. UFW được cài đặt theo mặc định, nhưng vẫn chưa được khởi động.

Trước tiên, hãy chạy lệnh ufw bên dưới để thêm cấu hình ứng dụng OpenSSH và mở cổng SSH mặc định 22. Sau đó, hãy khởi động và bật UFW.
Mã:
sudo ufw allow OpenSSH
sudo ufw enable
Nhập y để tiếp tục và bạn sẽ nhận được đầu ra Tường lửa đang hoạt động và được bật khi khởi động hệ thống.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22715%22%20height=%22186%22%3E%3C/svg%3E


Bây giờ hãy chạy lệnh bên dưới để mở các cổng sẽ được các dịch vụ trên triển khai Swarm của bạn sử dụng. Trong trường hợp này, bạn sẽ phân bổ các cổng trong khoảng 30000:35000 cho các dịch vụ.
Mã:
sudo ufw allow 30000:35000/tcp
Tiếp theo, thực hiện lệnh sau để mở các cổng cho Docker Swarm.
Mã:
for ports in 2377/tcp 7946/tcp 7946/udp 4789/udp
do
sudo ufw allow $ports
done

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22615%22%20height=%22430%22%3E%3C/svg%3E


Cuối cùng, hãy tải lại UFW và xác minh trạng thái UFW bằng cách thực hiện lệnh bên dưới.
Mã:
sudo ufw reload
sudo ufw status
Bạn sẽ thấy hồ sơ ứng dụng OpenSSH và các cổng cho Docker Swarm bao gồm 2377, 7946 và 4789 được bật trên UFW.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22499%22%20height=%22381%22%3E%3C/svg%3E

Thêm kho lưu trữ Docker​

Sau khi cấu hình UFW, bạn phải thêm kho lưu trữ Docker chính thức vào máy chủ của mình. Bạn sẽ sử dụng kho lưu trữ Docker chính thức để cài đặt Docker Engine.

Thực hiện lệnh bên dưới để cài đặt một số gói cơ bản vào máy chủ Ubuntu của bạn.
Mã:
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22296%22%3E%3C/svg%3E


Tiếp theo, chạy lệnh bên dưới để thêm khóa GPG Docker và kho lưu trữ vào hệ thống.
Mã:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
Mã:
echo \
 "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
 "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
 sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22149%22%3E%3C/svg%3E


Cuối cùng, hãy cập nhật và làm mới kho lưu trữ Ubuntu của bạn trên mỗi máy chủ bằng cách thực hiện lệnh bên dưới.
Mã:
sudo apt update
Bạn sẽ thấy kho lưu trữ Docker được tải trong quá trình này.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22608%22%20height=%22203%22%3E%3C/svg%3E

Cài đặt Docker Engine​

Sau khi chuẩn bị hệ thống Ubuntu, bạn sẽ cài đặt Docker Engine vào các máy chủ đó.

Cài đặt Docker Engine vào hệ thống Ubuntu của bạn bằng lệnh bên dưới. Nhập y để xác nhận cài đặt.
Mã:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22236%22%3E%3C/svg%3E


Sau khi cài đặt hoàn tất, hãy chạy lệnh systemctl bên dưới để xác minh dịch vụ docker và đảm bảo rằng dịch vụ đang chạy.
Mã:
sudo systemctl is-enabled docker
sudo systemctl status docker
Trong kết quả sau, bạn sẽ thấy dịch vụ docker đang chạy và được bật.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22239%22%3E%3C/svg%3E

(Tùy chọn): Cho phép Non-Root chạy Docker Container​

Nếu bạn đang triển khai Docker Swarm và chạy container bằng người dùng không phải root, bạn phải thêm người dùng của mình vào nhóm docker để người dùng có thể thực thi lệnh docker và chạy container.

Chạy lệnh usermod bên dưới để thêm người dùng hiện tại của bạn vào nhóm docker.
Mã:
sudo usermod -aG docker username
Bây giờ hãy đăng nhập với tư cách là người dùng không phải root và thực thi lệnh docker bên dưới để xác minh cấu hình.
Mã:
su - username
docker run hello-world
Nếu cấu hình thành công, bạn sẽ có thể chạy container hello-world và nhận được kết quả đầu ra sau:


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22727%22%20height=%22432%22%3E%3C/svg%3E

Tạo Docker Swarm​

Bây giờ bạn đã cài đặt Docker Engine, bạn đã sẵn sàng để tạo và khởi động Docker bằng máy chủ Ubuntu của mình. Trong ví dụ này, chúng ta sẽ sử dụng một máy chủ làm Swarm Master/Manager và hai máy chủ làm Worker Nodes.

Hoàn thành các tác vụ sau để thiết lập Docker Swarm:
  • Khởi tạo chế độ Swarm trên Master/Manager.
  • Thêm Worker Nodes vào Docker Swarm.
Chúng ta hãy bắt đầu.

Khởi tạo chế độ Swarm trên Master/Manager​

Để khởi tạo Docker Swarm, hãy chạy lệnh docker swarm init bên dưới. Tham số bổ sung --advertise-addr sẽ liên kết Docker Swarm trong địa chỉ IP cụ thể và tham số --default-addr-pool xác định địa chỉ IP nội bộ cho các container đang chạy trên Swarm.

Trong ví dụ này, chế độ Docker Swarm sẽ liên kết với địa chỉ IP 192.168.5.30 và nhóm địa chỉ IP cho các container là 10.20.0.0/16.
Mã:
docker swarm init --advertise-addr 192.168.5.30 --default-addr-pool 10.20.0.0/16
Nếu quá trình khởi tạo thành công, đầu ra sau sẽ được hiển thị. Trong đầu ra, bạn sẽ thấy mã thông báo được tạo để thêm Nút vào Docker Swarm.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22142%22%3E%3C/svg%3E


Tiếp theo, chạy lệnh sau để kiểm tra trạng thái chế độ Swarm.
Mã:
docker info
Nếu chế độ Swarm được bật, bạn sẽ nhận được đầu ra Swarm: active với chi tiết về NodeID và trạng thái của Manager và Node.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22418%22%20height=%22244%22%3E%3C/svg%3E


Cuối cùng, thực hiện lệnh bên dưới để xác minh danh sách các Node trên Docker Swarm.
Mã:
docker node ls
Lúc này, chỉ có một Node khả dụng trên Docker Swarm của bạn, đó là Swarm Master/Manager.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22114%22%3E%3C/svg%3E

Thêm nút Worker vào Docker Swarm​

Khi Docker Swarm đã được khởi tạo, bạn có thể thêm nút worker vào Docker Swarm của mình.

Đầu tiên, hãy chạy lệnh bên dưới để hiển thị mã thông báo đã tạo cho worker node.
Mã:
docker swarm join-token worker
Bạn sẽ thấy hướng dẫn để thêm các nút worker, bao gồm cả mã thông báo.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%2295%22%3E%3C/svg%3E


Bây giờ, hãy di chuyển đến nút worker và thêm nút worker vào Docker Swarm bằng cách thực thi lệnh docker swarm join bên dưới.
Mã:
docker swarm join --token SWMTKN-1-0i6kbe2oek1iw19jfpvd2j5l0dhfmssz4w505aeihx7ouz8wqc-2dbk7cnmo12uunj53eywwnqr7 192.168.5.30:2377
Khi quá trình thành công, đầu ra 'Nút này đã tham gia bầy đàn với tư cách là một công nhân' sẽ được in trên màn hình của bạn.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%2247%22%3E%3C/svg%3E



data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%2263%22%3E%3C/svg%3E


Tiếp theo, quay lại Swarm Master/Manager và chạy lệnh bên dưới để xác minh danh sách các nút khả dụng.
Mã:
docker node ls
Nếu mọi việc diễn ra tốt đẹp, sẽ có ba máy chủ khả dụng trên Docker Swarm, 1 Swarm Manager và 2 nút worker có trạng thái Sẵn sàng và đang chạy khả dụng.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22130%22%3E%3C/svg%3E

Chạy dịch vụ trong Docker Swarm​

Lúc này, bạn đã tạo thành công Docker Swarm với ba máy chủ Ubuntu. Bây giờ, bạn sẽ tìm hiểu cách triển khai ứng dụng của mình vào Docker Swarm, được gọi là dịch vụ. Dịch vụ là hình ảnh của ứng dụng dịch vụ vi mô của bạn và có thể là máy chủ HTTP, máy chủ cơ sở dữ liệu hoặc các ứng dụng khác.

Trong ví dụ này, bạn sẽ triển khai một dịch vụ HTTP đơn giản với hình ảnh Nginx.

Thực hiện lệnh bên dưới để tạo một dịch vụ mới trên Swarm của bạn. Trong ví dụ này, bạn sẽ tạo một dịch vụ mới test-nginx với 1 bản sao, mở cổng 30001 và dựa trên hình ảnh nginx:alpine.
Mã:
docker service create --replicas 1 --name test-nginx -p 30001:80 nginx:alpine

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22131%22%3E%3C/svg%3E


Bây giờ, hãy kiểm tra thông tin chi tiết của dịch vụ test-nginx bằng cách sử dụng bên dưới lệnh.
Mã:
docker service inspect test-nginx
docker service inspect --pretty test-nginx
Bạn sẽ thấy thông tin chi tiết về dịch vụ test-nginx như sau.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22603%22%20height=%22615%22%3E%3C/svg%3E


Tiếp theo, hãy xác minh danh sách các dịch vụ Docker trong Docker Swarm bằng lệnh bên dưới.
Mã:
docker service ls
docker service ps test-nginx
Nếu thành công, bạn sẽ thấy dịch vụ test-nginx đang chạy trên trình quản lý NODE với 1 bản sao và cổng được hiển thị là 30001.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22155%22%3E%3C/svg%3E


Cuối cùng, truy cập dịch vụ test-nginx qua địa chỉ IP máy chủ có cổng 30001 bằng lệnh curl bên dưới.
Mã:
curl 192.168.5.30:30001
curl -I 192.168.5.30:30001
Bạn sẽ thấy trang mã nguồn index.html và thông tin chi tiết về tiêu đề HTTP.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22703%22%20height=%22504%22%3E%3C/svg%3E

Dịch vụ mở rộng quy mô trong Docker Swarm​

Bây giờ bạn đã triển khai dịch vụ Docker, nhiệm vụ tiếp theo là mở rộng dịch vụ trên Docker Swarm. Điều này sẽ tạo ra bản sao mong muốn của các dịch vụ của bạn trên các nút worker.

Để mở rộng dịch vụ, hãy chạy lệnh docker service scale bên dưới. Trong trường hợp này, bạn sẽ mở rộng dịch vụ test-nginx thành 3 bản sao.
Mã:
docker service scale test-nginx=3

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22654%22%20height=%22212%22%3E%3C/svg%3E


Bây giờ hãy chạy lệnh bên dưới để xác minh dịch vụ test-nginx. Nếu dịch vụ test-nginx được mở rộng, bạn sẽ thấy hai dịch vụ khác được Docker tạo ra và chạy trên cả hai nút worker.
Mã:
docker service ps test-nginx

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22108%22%3E%3C/svg%3E


Di chuyển đến thiết bị đầu cuối của nút worker và chạy lệnh sau để đảm bảo rằng dịch vụ test-nginx là đang chạy.
Mã:
docker ps
curl 192.168.5.31:30001
Nếu mọi thứ diễn ra tốt đẹp, bạn sẽ thấy container test-nginx.RANDOM-STRING có trạng thái Up trên mỗi nút worker.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22368%22%3E%3C/svg%3E



data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22368%22%3E%3C/svg%3E

Xóa dịch vụ trong Docker Swarm​

Để dọn dẹp môi trường của bạn, bạn sẽ xóa dịch vụ test-nginx khỏi Docker Swarm và xóa hình ảnh docker nginx:alpine.

Xóa dịch vụ test-nginx và xác minh danh sách các dịch vụ khả dụng trên Docker Swarm bằng lệnh sau.
Mã:
docker service rm test-nginx
docker service ps
Bây giờ hãy xóa hình ảnh nginx:alpine và kiểm tra danh sách các hình ảnh đã tải xuống cho từng máy chủ bằng lệnh bên dưới.
Mã:
docker rmi nginx:alpine
docker images

Kết luận​

Để kết thúc up, giờ bạn đã cài đặt thành công Docker Swarm trên Ubuntu 22.04 theo từng bước. Bạn đã triển khai Docker Swarm với ba máy chủ Ubuntu và đã học cách triển khai, mở rộng và xóa các ứng dụng hoặc dịch vụ trên Docker Swarm.
 
Back
Bên trên