Docker Swarm là một công cụ quản lý container được tích hợp sẵn trong Docker để quản lý các ứng dụng đa-container trên một số máy chủ. Khi chạy dịch vụ trên Docker Swarm, có một số lưu ý sau đây:
- Cần chắc chắn rằng môi trường Swarm đã được thiết lập và chạy trên tất cả các nút máy chủ trong Swarm cluster. Nếu chưa có, bạn có thể bắt đầu bằng cách chạy lệnh “docker swarm init” để khởi tạo một nút quản trị.
- Khi triển khai dịch vụ trên Swarm, cần đảm bảo rằng ứng dụng của bạn đã được đóng gói vào một hoặc nhiều container.
- Cần tạo một dịch vụ mới bằng cách sử dụng lệnh “docker service create” và đặt các tùy chọn và tham số cho dịch vụ đó.
- Để tạo các container trên các nút máy chủ, Swarm sử dụng các máy chủ từ pool máy chủ được chỉ định trước đó. Các máy chủ này cần có đủ tài nguyên để chạy các container được yêu cầu.
- Cần đảm bảo rằng mô hình dịch vụ của bạn được thiết kế sao cho dịch vụ của bạn sẽ hoạt động đúng cách trong môi trường Swarm. Ví dụ: cần cân nhắc các yêu cầu về mạng, bảo mật và tài nguyên của ứng dụng.
- Để giám sát và quản lý dịch vụ của bạn, có thể sử dụng các công cụ như Docker CLI, Docker Compose hoặc các công cụ mở rộng khác như Portainer.
- Cần đảm bảo rằng các container trong dịch vụ của bạn đang chạy và hoạt động đúng cách bằng cách sử dụng các công cụ giám sát container như Prometheus hoặc cài đặt các giải pháp giám sát của bên thứ ba.
Ví dụ để chạy Prometheus trên Swarm với replicas 5, bạn sử dụng cú pháp như dưới:
$ docker service create --replicas 5 -p 9090:9090 -p 9091:9091 --name=monitor prom/prometheus
fwnplmpqbthx9ag7g5q25xa4f
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
Các trường trong lệnh “docker service create –replicas 5 -p 9090:9090 –name=monitor prom/prometheus” được giải thích như sau:
- “docker service create”: Tạo một dịch vụ mới trong Docker Swarm.
- “–replicas 5”: Định nghĩa số lượng container được tạo ra cho dịch vụ này. Trong trường hợp này, có 5 container được tạo ra.
- “-p 9090:9090”: Cài đặt ánh xạ cổng (port mapping) để liên kết cổng 9090 của container với cổng 9090 trên máy chủ Docker host. Điều này cho phép bạn truy cập vào dịch vụ từ bên ngoài container.
- “–name=monitor”: Đặt tên cho dịch vụ được tạo ra, trong trường hợp này là “monitor”.
- “prom/prometheus”: Đây là tên của hình ảnh container mà Docker sẽ sử dụng để tạo container cho dịch vụ. Trong trường hợp này, hình ảnh được sử dụng là “prom/prometheus”, được sử dụng để triển khai Prometheus – một hệ thống giám sát mã nguồn mở.
Kết quả khi triển khai thành công:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
hldh1597j7z0 monitor replicated 10/10 prom/prometheus:latest *:9090-9091->9090-9091/tcp
Bạn sử dụng lệnh “docker service ps <tên service>”, bạn sẽ có kết quả trả về của lệnh Docker CLI để hiển thị thông tin về các replica của dịch vụ đang chạy trên Docker Swarm.
$ docker service ps monitor
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
r3pslfaidp2r monitor.1 prom/prometheus:latest docker-swarm-1.com Running Running 6 minutes ago
l2m2nxkph6q8 monitor.2 prom/prometheus:latest docker-swarm-3.com Running Running 6 minutes ago
qr6p580v64j3 monitor.3 prom/prometheus:latest docker-swarm-2.com Running Running 6 minutes ago
yinp2o8zpmvr monitor.4 prom/prometheus:latest docker-swarm-3.com Running Running 6 minutes ago
7fchszaewtz1 monitor.5 prom/prometheus:latest docker-swarm-2.com Running Running 6 minutes ago
Một số trường giải thích cho bảng thông tin này:
- ID: là mã duy nhất được tạo để xác định replica, nó được sử dụng trong các lệnh khác để định danh replica đó.
- NAME: là tên của replica, nó được tạo bằng cách kết hợp tên dịch vụ và số thứ tự của replica.
- IMAGE: là tên và phiên bản của image được sử dụng để tạo ra các replica của dịch vụ.
- NODE: là tên của nút Swarm mà replica đang chạy trên đó.
- DESIRED STATE: là trạng thái mong muốn của replica, có thể là “Running” hoặc “Shutdown”.
- CURRENT STATE: là trạng thái hiện tại của replica, có thể là “Running”, “Pending”, “Shutdown”, hoặc “Failed”.
- ERROR: là thông báo lỗi (nếu có) được liên kết với replica đó.
- PORTS: là cổng được liên kết với replica đó (nếu có).
Trong trường hợp này, dịch vụ “monitor” có 5 replica đang chạy trên các nút Swarm khác nhau. Tất cả các replica đều đang ở trạng thái “Running” và không có lỗi nào được phát hiện. Mỗi replica đang sử dụng image “prom/prometheus:latest” để tạo ra container của nó.
Trong trường hợp của mình đang có 2 container đang chạy trên Node 3, chúng ta kiểm tra và kết quả như dưới.
root@docker-swarm-3:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83eced29853d prom/prometheus:latest "/bin/prometheus --c…" 9 minutes ago Up 9 minutes *:9090-9091->9090-9091/tcp monitor.4.yinp2o8zpmvrbrjd1496uikdy
0fb69184a9a7 prom/prometheus:latest "/bin/prometheus --c…" 9 minutes ago Up 9 minutes *:9090-9091->9090-9091/tcp monitor.2.l2m2nxkph6q8zb4j6n150za3x
Nếu chúng ta xóa một container trong Docker Swarm, việc xử lý sẽ phụ thuộc vào cách replica của dịch vụ được cấu hình.
Nếu replica đang được cấu hình để sử dụng chế độ “replicated”, tức là chạy nhiều bản sao của container trên các nút khác nhau của Swarm, thì một replica mới sẽ được tạo ra để thay thế cho replica đã bị xóa. Điều này sẽ đảm bảo rằng số lượng replica của dịch vụ luôn đạt mức mong muốn và các replica sẽ được phân bố đều trên các nút của Swarm.
Nếu replica đang sử dụng chế độ “global”, tức là chỉ chạy một bản sao của container trên mỗi nút của Swarm, thì container bị xóa sẽ không được thay thế. Tuy nhiên, nếu một nút bị hỏng hoặc mất kết nối, Docker Swarm sẽ tự động tạo ra một container mới trên một nút khác để đảm bảo rằng dịch vụ vẫn hoạt động đúng như mong muốn.
Tóm lại, khi xóa một container trong Docker Swarm, hệ thống sẽ tự động xử lý để đảm bảo rằng số lượng replica đủ để đáp ứng nhu cầu và dịch vụ vẫn hoạt động đúng như mong muốn.
Ví dụ mình xóa đi 1 container trên Node 3, chúng ta dùng lệnh docker ps để lấy ID Container trước.
root@docker-swarm-3:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83eced29853d prom/prometheus:latest "/bin/prometheus --c…" 9 minutes ago Up 9 minutes *:9090-9091->9090-9091/tcp monitor.4.yinp2o8zpmvrbrjd1496uikdy
0fb69184a9a7 prom/prometheus:latest "/bin/prometheus --c…" 9 minutes ago Up 9 minutes *:9090-9091->9090-9091/tcp monitor.2.l2m2nxkph6q8zb4j6n150za3x
Sau đó tiến hành xóa container.
root@docker-swarm-3:~# docker rm -f 83eced29853d
Kết quả sau khi xóa, container có id là 83eced29853d đã bị xóa khỏi Node 3.
root@docker-swarm-3:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fb69184a9a7 prom/prometheus:latest "/bin/prometheus --c…" 13 minutes ago Up 13 minutes *:9090-9091->9090-9091/tcp monitor.2.l2m2nxkph6q8zb4j6n150za3x
Vào node leader kiểm tra, Swarm đã phát hiện container bị down.
$ docker service ps monitor
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
r3pslfaidp2r monitor.1 prom/prometheus:latest docker-swarm-1.com Running Running 13 minutes ago
l2m2nxkph6q8 monitor.2 prom/prometheus:latest docker-swarm-3.com Running Running 13 minutes ago
qr6p580v64j3 monitor.3 prom/prometheus:latest docker-swarm-2.com Running Running 13 minutes ago
fojbsyn7nkfn monitor.4 prom/prometheus:latest docker-swarm-1.com Running Running 44 seconds ago
yinp2o8zpmvr \_ monitor.4 prom/prometheus:latest docker-swarm-3.com Shutdown Failed 51 seconds ago "task: non-zero exit (137)"
7fchszaewtz1 monitor.5 prom/prometheus:latest docker-swarm-2.com Running Running 13 minutes ago
Và nó đã tạo lại container bổ sung trên node 1.
root@docker-swarm-1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85ee9ad9d306 prom/prometheus:latest "/bin/prometheus --c…" 37 seconds ago Up 30 seconds *:9090-9091->9090-9091/tcp monitor.4.fojbsyn7nkfna40x5r6wv0tu4
e54802ec661b prom/prometheus:latest "/bin/prometheus --c…" 13 minutes ago Up 13 minutes *:9090-9091->9090-9091/tcp monitor.1.r3pslfaidp2rqyvto8d70derk
Sử dụng lệnh dưới để kiểm tra logs service.
docker service logs monitor
Để kiểm tra resource, bạn sử dụng lệnh:
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
85ee9ad9d306 monitor.4.fojbsyn7nkfna40x5r6wv0tu4 0.00% 25.41MiB / 15.66GiB 0.16% 1.34kB / 250B 0B / 0B 9
e54802ec661b monitor.1.r3pslfaidp2rqyvto8d70derk 0.00% 29.24MiB / 15.66GiB 0.18% 88.7kB / 2.29MB 254kB / 0B 10
Để xóa dịch vụ, bạn sử dụng lệnh.
docker service rm <tên-service>
Bạn có thể thay đổi số lượng container để chạy dịch vụ bằng lệnh dưới.
$ docker service scale monitor=10
monitor scaled to 10
overall progress: 10 out of 10 tasks
1/10: running [==================================================>]
2/10: running [==================================================>]
3/10: running [==================================================>]
4/10: running [==================================================>]
5/10: running [==================================================>]
6/10: running [==================================================>]
7/10: running [==================================================>]
8/10: running [==================================================>]
9/10: running [==================================================>]
10/10: running [==================================================>]
verify: Service converged
Trong trường hợp này, lệnh “docker service scale monitor=10” được sử dụng để tăng số lượng replica của dịch vụ “monitor” lên 10. Điều này có nghĩa là Docker Swarm sẽ tạo ra thêm 5 replica mới của dịch vụ này để đáp ứng nhu cầu, vì trước đó dịch vụ chỉ có 5 replica.
Khi số lượng replica được tăng lên, Docker Swarm sẽ tự động tạo các replica mới trên các nút khác nhau của Swarm để đảm bảo rằng số lượng replica được phân bố đồng đều và dịch vụ vẫn hoạt động đúng như mong muốn.
Việc tăng số lượng replica của dịch vụ này có thể giúp tăng hiệu suất và đáp ứng nhu cầu của ứng dụng mà dịch vụ đó đang phục vụ. Tuy nhiên, cần lưu ý rằng việc tăng replica cũng sẽ tăng tài nguyên tiêu thụ của ứng dụng, bao gồm CPU, bộ nhớ và dung lượng lưu trữ.
Bây giờ chúng ta thử login Prometheus bằng trình duyệt node 1.
Node 2.
Và node 3.
Bây giờ chúng ta thử cập nhật phiên bản mới cho container, mình sẽ sử dụng 1 image khác làm ví dụ cho version mới, ví dụ là Pushgateway.
docker service update —-image=prom/pushgateway monitor
“Docker service update” là một lệnh Docker CLI để cập nhật một dịch vụ đang chạy trên Docker Swarm. Trong trường hợp này, lệnh “docker service update –image=prom/pushgateway monitor” được sử dụng để cập nhật hình ảnh của dịch vụ “monitor” bằng hình ảnh mới từ registry “prom/pushgateway”.
Việc cập nhật hình ảnh của một dịch vụ có thể là cần thiết để đảm bảo rằng ứng dụng của chúng ta đang sử dụng phiên bản mới nhất của hình ảnh. Khi chúng ta cập nhật hình ảnh, Docker Swarm sẽ tự động tải hình ảnh mới từ registry và triển khai các bản sao mới của container trên các nút của Swarm.
Trong trường hợp này, khi chúng ta chạy lệnh “docker service update –image=prom/pushgateway monitor”, Docker Swarm sẽ cập nhật hình ảnh của dịch vụ “monitor” bằng hình ảnh mới từ registry “prom/pushgateway”. Điều này có nghĩa là các bản sao container mới sẽ được tạo ra và triển khai trên các nút của Swarm với hình ảnh mới này.
Tuy nhiên, cần lưu ý rằng việc cập nhật hình ảnh của dịch vụ này có thể làm thay đổi các thông số cấu hình khác của dịch vụ, ví dụ như port, môi trường, cấu hình mạng, v.v. Do đó, trước khi cập nhật hình ảnh của dịch vụ, chúng ta cần kiểm tra kỹ các thông số này để đảm bảo rằng việc cập nhật không ảnh hưởng đến sự hoạt động của ứng dụng.
Lưu ý là trong quá trình cập nhật thì dịch vụ vẫn chạy bình thường ở phiên bản cũ cho đến khi phiên bản mới được cập nhật xong.
Và sau khi thay thế xong, bạn có kết quả, mình sử dụng port 9091 thay thế cho port 9090 vì prom/pushgateway sử dụng port này nhé.
Và bạn có thể thấy, container trước đây chạy prom/prometheus đã chuyển sang chạy prom/pushgateway.
$ docker service ps monitor
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
610fpmrjmtnp monitor.1 prom/pushgateway:latest docker-swarm-2.com Running Running 2 minutes ago
12t790s2fy1t \_ monitor.1 prom/prometheus:latest docker-swarm-2.com Shutdown Shutdown 2 minutes ago
gtigiqhqmtn0 monitor.2 prom/pushgateway:latest docker-swarm-1.com Running Running 2 minutes ago
yh9wxar02rte \_ monitor.2 prom/prometheus:latest docker-swarm-1.com Shutdown Shutdown 2 minutes ago
qfelhweap2wl monitor.3 prom/pushgateway:latest docker-swarm-3.com Running Running 2 minutes ago
k05vdpj4olgh \_ monitor.3 prom/prometheus:latest docker-swarm-3.com Shutdown Shutdown 2 minutes ago
ookxna0dm0ue monitor.4 prom/pushgateway:latest docker-swarm-1.com Running Running 2 minutes ago
z1t4o1n7z2ny \_ monitor.4 prom/prometheus:latest docker-swarm-1.com Shutdown Shutdown 2 minutes ago
mjcd4ma8llkt monitor.5 prom/pushgateway:latest docker-swarm-3.com Running Running 2 minutes ago
rjc4pblrp93n \_ monitor.5 prom/prometheus:latest docker-swarm-3.com Shutdown Shutdown 2 minutes ago
nb6lxi5w66hu monitor.6 prom/pushgateway:latest docker-swarm-2.com Running Running 2 minutes ago
f2yd46sruweh \_ monitor.6 prom/prometheus:latest docker-swarm-2.com Shutdown Shutdown 2 minutes ago
j8czkiyz44vq monitor.7 prom/pushgateway:latest docker-swarm-1.com Running Running 2 minutes ago
52qloqip6w49 \_ monitor.7 prom/prometheus:latest docker-swarm-2.com Shutdown Shutdown 2 minutes ago
2h77bwu3sk1s monitor.8 prom/pushgateway:latest docker-swarm-2.com Running Running 2 minutes ago
d4zioszsbv67 \_ monitor.8 prom/prometheus:latest docker-swarm-2.com Shutdown Shutdown 2 minutes ago
z4h56ss82zm6 monitor.9 prom/pushgateway:latest docker-swarm-1.com Running Running 2 minutes ago
mwih85c1i1yq \_ monitor.9 prom/prometheus:latest docker-swarm-1.com Shutdown Shutdown 2 minutes ago
93gv3a4ropmw monitor.10 prom/pushgateway:latest docker-swarm-3.com Running Running 2 minutes ago
0davabnc3ffn \_ monitor.10 prom/prometheus:latest docker-swarm-3.com Shutdown Shutdown 2 minutes ago
Chúng ta có thể giới hạn resource của container, ví dụ giới hạn mức sử dụng Ram.
docker service update --limit-memory 100MB monitor
Hoặc giới hạn mức sử dụng CPU cho các container, giá trị 0.5 tức là chỉ sử dụng 50% cho 1 core cpu.
docker service update --limit-cpu 0.5 monitor
Bạn có thể bấm vào đây để xem các lệnh hỗ trợ.