---
id: kubernetes-swarm
title: "Docker Swarm"
shortTitle: "Docker Swarm"
track: kubernetes
trackTitle: "Kubernetes"
order: 12
level: normal
status: published
estimatedMinutes: 30
prerequisites:
  - kubernetes-openshift
next: kubernetes-nomad
reviewedAgainst: 2026-10-12
sources:
  - title: "Swarm mode overview"
    url: https://docs.docker.com/engine/swarm/
  - title: "Deploy a service to a swarm"
    url: https://docs.docker.com/engine/swarm/swarm-tutorial/deploy-service/
---

# Docker Swarm

Swarm chạy service trên nhiều Docker daemon, hoặc trên một máy lab. Nó không đọc Deployment YAML của Kubernetes. Lab này bật Swarm trên Docker local rồi tắt. Đừng làm trên daemon đang chạy workload khác mà bạn cần giữ nguyên mode.

## Để làm gì

Tạo một service, gọi được từ máy host, rồi `swarm leave` để daemon trở lại như cũ.

## Gồm những gì

- `docker swarm init`, `service create`, `service rm`.
- Khác Kubernetes: không có Pod và không có kubectl.
- `leave --force` trên node duy nhất.

Không gồm cụm nhiều máy.

## Dùng khi nào

Một hệ cũ còn `docker service`. App mới trong lộ trình này sang Kubernetes khi cần nhiều replica. Swarm không thay các bài manifest.

Đừng `swarm init` trên server production đang chạy container thường nếu bạn chưa đọc Swarm mode đổi gì trên daemon đó. Trên Docker Desktop của máy học thì lab này vừa.

## Kiến thức cốt lõi

`docker swarm init` bật Swarm mode và tạo một manager. `docker service create` khai image, số replica, và cổng publish. Swarm giữ service, task chết thì nó tạo task mới. Cùng ý self-healing, khác API.

`docker service rm` xóa service. `docker swarm leave --force` trên manager duy nhất của lab gỡ Swarm mode. Docs Swarm nói node manager cuối cần `--force` để rời.

Overlay network là mạng giữa các node Swarm. Lab một máy không cần tự tạo overlay. Cổng `-p 8088:80` đủ để curl từ host.

## Lệnh và code mẫu

```bash
docker swarm init
docker service create --name lab-web --publish 8088:80 nginx:alpine
curl.exe -sS -o NUL -w "%{http_code}\n" http://127.0.0.1:8088/
docker service rm lab-web
docker swarm leave --force
```

Đợi vài giây sau `service create` rồi mới curl. Task chưa chạy thì connection refused. Thử lại, đừng init lần hai.

## Thực hành

1. Chạy khối lệnh trên Docker của máy học.
2. Lấy status 200.
3. `docker info` sau `leave` không còn báo Swarm active. Nếu vẫn active, bạn đang ở một context Docker khác. Đừng leave nhầm context.

## Kết quả mong đợi

Curl in `200`. Sau `leave --force`, không còn service `lab-web`.

## Checklist

- [ ] Lab kết thúc bằng `service rm` rồi `swarm leave --force`.
- [ ] Không đưa file Kubernetes vào `docker stack deploy` rồi tưởng là cùng API.
- [ ] Server đang chạy Swarm thật thì không dùng làm bài tập.

## Lỗi thường gặp

**Curl ngay lập tức.** Task chưa pull xong image. `docker service ps lab-web` xem trạng thái, rồi curl lại.

**`leave` không có `--force` trên manager duy nhất.** Docker từ chối vì đây là manager cuối. Với lab một node, `--force` là đúng. Với cụm thật, đừng force manager cuối.

## Nguồn

1. [Swarm mode overview](https://docs.docker.com/engine/swarm/) — manager, worker, service.
2. [Deploy a service](https://docs.docker.com/engine/swarm/swarm-tutorial/deploy-service/) — `service create` và publish cổng.

## Tiếp theo

[Nomad](./09-nomad.md)
